素晴らしいコミュニティモジュール

楽天MA

日本語の README (日本语ドキュメント)

導入

楽天 MA (形態素解析器) は、純粋に JavaScript で書かれた中国語と日本語用の形態素解析器 (単語セグメンタ + PoS タガー) です。

楽天MAには以下のような特徴があります。

  • 純粋な JavaScript の実装。最新のブラウザーとnode.js の両方で動作します。
  • 言語に依存しない文字タグ付けモデルを実装し、中国語/日本語の単語分割と PoS タグを出力します。
  • オンライン学習によるモデルの増分更新をサポートします (Soft Confidence Weighted、Wang et al. ICML 2012)。
  • カスタマイズ可能な機能セット。
  • コンパクトなモデル表現のための特徴のハッシュ化、量子化、枝刈りをサポートします。
  • 一般的なコーパス (CTB [Xue et al. 2005] および BCCWJ [Maekawa 2008]) および電子商取引コーパスからトレーニングされた中国語と日本語のモデルがバンドルされています。

デモ

楽天MAはデモページからお試しいただけます(ページの読み込みに時間がかかる場合があります)。

使用法

Download & Install

楽天MAはJavaScriptライブラリなのでインストールの必要はなく、gitリポジトリをCloneします。

1
git clone https://github.com/rakuten-nlp/rakutenma.git

または、ここから zip アーカイブをダウンロードします: https://github.com/rakuten-nlp/rakutenma/archive/master.zip

Node.js がインストールされている場合は、次の方法でデモを実行できます。

1
node demo.js

これは以下の使用例と同じです。

npm package

楽天 MA を npm パッケージとして使用することもできます。

1
npm install rakutenma

モデル ファイルは にありますnode_modules/rakutenma/

Usage Example (on Node.js)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
// RakutenMA demo // Load necessary libraries var RakutenMA = require('./rakutenma'); var fs = require('fs'); // Initialize a RakutenMA instance // with an empty model and the default ja feature set var rma = new RakutenMA(); rma.featset = RakutenMA.default_featset_ja; // Let's analyze a sample sentence (from http://tatoeba.org/jpn/sentences/show/103809) // With a disastrous result, since the model is empty! console.log(rma.tokenize("彼は新しい仕事できっと成功するだろう。")); // Feed the model with ten sample sentences from tatoeba.com var tatoeba = JSON.parse(fs.readFileSync("tatoeba.json")); for (var i = 0; i < 10; i ++) { rma.train_one(tatoeba[i]); } // Now what does the result look like? console.log(rma.tokenize("彼は新しい仕事できっと成功するだろう。")); // Initialize a RakutenMA instance with a pre-trained model var model = JSON.parse(fs.readFileSync("model_ja.json")); rma = new RakutenMA(model, 1024, 0.007812); // Specify hyperparameter for SCW (for demonstration purpose) rma.featset = RakutenMA.default_featset_ja; // Set the feature hash function (15bit) rma.hash_func = RakutenMA.create_hash_func(15); // Tokenize one sample sentence console.log(rma.tokenize("うらにわにはにわにわとりがいる")); // Re-train the model feeding the right answer (pairs of [token, PoS tag]) var res = rma.train_one( [["うらにわ","N-nc"], ["に","P-k"], ["は","P-rj"], ["にわ","N-n"], ["にわとり","N-nc"], ["が","P-k"], ["いる","V-c"]]); // The result of train_one contains: // sys: the system output (using the current model) // ans: answer fed by the user // update: whether the model was updated console.log(res); // Now what does the result look like? console.log(rma.tokenize("うらにわにはにわにわとりがいる"));

Usage Example (on browsers)

次のコード スニペットを<head>HTML に含めます。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
<script type="text/javascript" src="rakutenma.js" charset="UTF-8"></script> <script type="text/javascript" src="model_ja.js" charset="UTF-8"></script> <script type="text/javascript" src="hanzenkaku.js" charset="UTF-8"></script> <script type="text/javascript" charset="UTF-8"> function Segment() { rma = new RakutenMA(model); rma.featset = RakutenMA.default_featset_ja; rma.hash_func = RakutenMA.create_hash_func(15); var textarea = document.getElementById("input"); var result = document.getElementById("output"); var tokens = rma.tokenize(HanZenKaku.hs2fs(HanZenKaku.hw2fw(HanZenKaku.h2z(textarea.value)))); result.style.display = 'block'; result.innerHTML = RakutenMA.tokens2string(tokens); } </script>

分析と結果は次のようになります。

1 2 3
<textarea id="input" cols="80" rows="5"></textarea> <input type="submit" value="Analyze" onclick="Segment()"> <div id="output"></div>

Using bundled models to analyze Chinese/Japanese sentences

  1. 既存のモデルをロードします。たとえば、model = JSON.parse(fs.readFileSync("model_file"));thenrma = new RakutenMA(model);またはrma.set_model(model);
  2. featset言語(rma.featset = RakutenMA.default_featset_zh;中国語用、rma.featset = RakutenMA.default_featset_ja;日本語用など)に応じて指定してください。
  3. rma.hash_func = RakutenMA.create_hash_func(15);バンドル モデル (model_zh.jsonおよび) を使用する場合は、必ず 15 ビット特徴ハッシュ関数 ( ) を使用してくださいmodel_ja.json
  4. rma.tokenize(input)入力を分析するために使用します。

Training your own analysis model from scratch

  1. トレーニング コーパス (文が正しい [トークン、PoS タグ] の配列であるトレーニング文のセット) を準備します。
  2. でRakutenMAインスタンスを初期化しますnew RakutenMA()
  3. を指定しますfeatset(オプションで、ctype_funchash_funcなど)
  4. トレーニング センテンスを 1 つずつ (最初から最後まで)train_one(sent)メソッドにフィードします。
  5. 通常、SCW は 1 回epoch(トレーニング コーパス全体を 1 回通過する) で十分に収束しますが、ステップ 4. を繰り返すことで、さらに優れたパフォーマンスを達成することができます。

独自のモデルをトレーニングする方法を示す例については、scripts/train_zh.js(中国語の場合) と(日本語の場合) を参照してください。scripts/train_ja.js

Re-training an existing model (domain adaptation, fixing errors, etc.)

  1. 既存のモデルをロードし、RakutenMA インスタンスを初期化します (上記の「バンドルされたモデルを使用した中国語/日本語の文章の分析」を参照)
  2. トレーニング データを準備します (これは、何をどの程度「再トレーニング」したいかによって異なりますが、数文程度で済む可能性があります)。
  3. トレーニング文を 1 つずつtrain_one(sent)メソッドにフィードします。

Reducing the model size

特徴量ハッシュを適用した後でも、クライアント側の分散ではモデル サイズが問題になる可能性があるため、scripts/minify.jsトレーニング済みモデルのサイズを削減するために、特徴量子化を適用するスクリプトを組み込みました (詳細については [Hagiwara andsekine COLING 2014] を参照)。

これを実行するnode scripts/minify.js [input_model_file] [output_model_file]と、モデル ファイルの縮小バージョンを作成できます。 覚えておいてください:トレーニングされたモデルの「シグマ」部分も削除されます。つまり、縮小されたモデルを再トレーニングできなくなります。必要に応じて、再トレーニングしてください。最初にモデルを作成してから、それを縮小します。

APIドキュメント

コンストラクタ 説明
RakutenMA(model, phi, c) 新しいRakutenMAインスタンスを作成します。model(オプション)RakutenMAインスタンスを初期化するためのモデルオブジェクトを指定します。phic(両方オプション)は、SCWのハイパーパラメータです(デフォルト: phi = 2048c = 0.003906)。
メソッド 説明
tokenize(input) (文字列)をトークン化しinputて、トークン化された結果 ([トークン、PoS タグ] ペア) を返します。
train_one(sent) 指定された回答sent([トークン、PoS タグ] ペア) を使用して、現在のモデルを (必要に応じて) 更新します。戻り値は、anssys、およびの 3 つのプロパティを持つオブジェクトです。updatedここで、ansは指定された回答 ( と同じsent)、sysは次を使用したシステム出力です(古い) モデルであり、updatedモデルが更新された ( とはsys異なるためans) かどうかを意味するバイナリ (True/False) フラグです。
set_model(model) 楽天 MA インスタンスのモデルを に設定しますmodel
set_tag_scheme(scheme) 順次ラベル付けタグ スキームを設定します。現在、サポートされています。他のタグ スキームを指定する"IOB2""SBIEO"、例外が発生します。
プロパティ 説明
featset RakutenMA.default_featset_ja分析に使用される特徴テンプレートの配列 (文字列) を指定します。日本語と中国語のデフォルトの特徴セットとして、と をそれぞれ使用できますRakutenMA.default_featset_zh。特徴テンプレートの詳細については、以下の (「サポートされる特徴テンプレート」) を参照してください。
ctype_func 文字をその文字タイプに変換するために使用される関数を指定します。これは、日本語に使用されるデフォルトの文字タイプ関数です。あるいは、文字を検索してその値を返す文字タイプ関数を作成するためにRakutenMA.ctype_ja_default_func呼び出して使用することもできます。たとえば、は関数を返しますが、それ以外の場合は戻ります。)RakutenMA.create_ctype_chardic_func(chardic)chardicRakutenMA.create_ctype_chardic_func({"A": "type1"})ff("A")"type1"[]
hash_func 特徴ハッシュに使用するハッシュ関数を指定します。デフォルト = undefined(特徴ハッシュなし)。ビット ハッシュ スペースを持つ特徴ハッシュ関数はbit、 を呼び出すことで作成できますRakutenMA.create_hash_func(bit)

利用規約

Apache License バージョン 2.0 http://www.apache.org/licenses/LICENSE-2.0.htmlに準拠する場合に限り、Rakuten MA の頒布、改変、学術的/商業的使用が許可されます

研究目的で楽天 MA を使用している場合は、楽天 MA に関する論文を引用してください [萩原・関根 2014]

FAQ(よくある質問)

Q. サポートされているブラウザと Node.js のバージョンは何ですか?

  • A. 楽天MAは以下の環境で動作することを確認しております。
    • Internet Explorer 8 (バージョン 8.0.7601.17414 以降)
    • Google Chrome (バージョン 35.0.1916.153 以降)
    • Firefox(バージョン16.0.2以降)
    • Safari(バージョン6.1.5以降)
    • Node.js (ver.0.10.13以降)

Q.商用利用は可能ですか?

  • A. 利用規約に従っていただければはい、詳細については上記の「利用規約」をご覧ください。

Q. バグ・解析エラー等を発見しました。どこに報告すればよいですか?

  • A. Github issues https://github.com/rakuten-nlp/rakutenma/issuesで問題を作成してください
  • Alternativelyコードを変更すると、プル リクエストを作成できます。楽天 MA には、Jasmine http://jasmine.github.io/を使用したテスト スイートがあります。すべてのテストがパスする (実行後にエラーがないjasmine-node spec) ことを確認し、独自のテストを作成してください (必要に応じて)プル リクエストを送信する前に。
  • Finally, それでも質問が解決しない場合は、prj-Rakutenma [at] mail.rakuten.com までお問い合わせください。

Q. トークン化の結果が奇妙に見えます (具体的には、文が PoS タグのない個々の文字に分割されています)

  • A. トレーニングに使用した同じ特徴セット ( featset) と特徴ハッシュ関数 ( ) を使用しているかどうかを確認してください。バンドルされたモデル (および) を使用する場合はhash_func、必ず 15 ビットの特徴ハッシュ関数 ( ) を使用してくださいrma.hash_func = RakutenMA.create_hash_func(15);model_zh.jsonmodel_ja.json

Q. 中国語ではどのようなスクリプト (簡体字/繁体字) がサポートされていますか?

  • A. 現在、簡体字中国語のみがサポートされています。

Q. ブラウザでも同じモデルファイルをJSON形式で使用できますか?

  • A. はい、いいえです。モデルの内部データ構造は同じですが、ブラウザ上で参照するために代入(例:)を追加する必要があります。 (Node.js 用)と(ブラウザ用)var model = [JSON representation];の違いを参照してくださいこれを行うミニ スクリプトがあります。モデルのトレーニングなどのために Node.js で作業してから、ブラウザで使用できるように変換することをお勧めします。model_zh.jsonmodel_zh.jsscripts/convert_for_browser.js

付録

Supported feature templates

フィーチャーテンプレート 説明
w7 文字ユニグラム(c-3)
w8 文字ユニグラム(c-2)
w9 文字ユニグラム (c-1)
w0 文字ユニグラム (c0)
w1 文字ユニグラム (c+1)
w2 文字ユニグラム (c+2)
w3 文字ユニグラム (c+3)
c7 文字型ユニグラム (t-3)
c8 文字型ユニグラム (t-2)
c9 文字型ユニグラム (t-1)
c0 文字型ユニグラム(t0)
c1 文字型ユニグラム (t+1)
c2 文字型ユニグラム (t+2)
c3 文字型ユニグラム (t+3)
b7 文字バイグラム (c-3 c-2)
b8 文字バイグラム (c-2 c-1)
b9 文字バイグラム (c-1 c0)
b1 文字バイグラム (c0 c+1)
b2 文字バイグラム (c+1 c+2)
b3 文字バイグラム (c+2 c+3)
d7 文字型バイグラム (t-3 t-2)
d8 文字型バイグラム (t-2 t-1)
d9 文字型バイグラム (t-1 t0)
d1 文字型バイグラム (t0 t+1)
d2 文字型バイグラム (t+1 t+2)
d3 文字型バイグラム (t+2 t+3)
その他 配列でカスタマイズされた機能関数を指定すると、その関数は 2 つの引数featsetで呼び出されます( は位置を取得してその位置の文字オブジェクトを返す関数で、は現在の位置です。文字オブジェクトはオブジェクトです) 2 つのプロパティがありそれぞれ文字と文字タイプです。その関数の戻り値が特徴値として使用されます (たとえば、関数whatを指定すると、現在の位置の文字タイプが返されます。基本的にはテンプレートと同じです。)_ti_tjictf(_t, i)returns _t(i).t;c0

PoS tag list in Chinese

鬼ごっこ 説明
広告 副詞
として アスペクト粒子
BA ba3 (ba 構築中)
CC 等位結合
CD 基数
CS 従属接続詞
12月 de5 (コンプリメンタイザー/ノミナライザー)
de5 (属格/結合)
DER de5 (結果)
開発者 de5(マナー)
DT 決定者
その他
FW 外来語
ij 間投詞
JJ その他の名詞修飾語
ポンド bei4 (長北建設)
LC ローカライザー
M 単語を測定する
MSP その他の粒子
NN 他の名詞
NNショート その他の名詞(略語)
NR 固有名詞
NR-ショート 固有名詞(略称)
ノーザンテリトリー 時間名詞
NTショート 時間名詞(略語)
外径 序数
の上 オノマトペ
P 前置詞
PN 代名詞
PU 句読点
SB bei4 (略してベイ建設)
SP 文末助詞
URL URL
バージニア州 述語形容詞
VC コピュラ
VE you3 (主動詞)
VV その他の動詞
バツ その他

PoS tag list in Japanese and correspondence to BCCWJ tags

鬼ごっこ 本来のJA名 英語
交流 形容詞-一般 形容詞-一般的
A-DP 形容詞 - 自立していない可能性がある 形容詞依存
C 言葉を拾う 接続詞
D 代名詞 代名詞
E 英語 英単語
F 副詞 副詞
IC 移動動詞-一般 間投詞-一般的
JC シェイプワード全般 形容詞名詞-一般的
Jタリ 形語タリ 形容詞名詞タリ
J-xs 形語-補助語幹 形容詞名詞-補助動詞語幹
まー 補助金マーク-AA 補助記号-AA
マック 補助金一般 補助記号 - 共通
M-CP 補足記号右括弧 補助記号 - 開き括弧
モップ 補助金マーク - 白括弧 補助記号 - 閉じ括弧
MP 補助金対象期間 補助記号-ピリオド
名詞 - 名詞 名詞-名詞
N-NC 名詞 - 普通名詞 名詞-普通名詞
N-pn 名詞 - 固有名詞 名詞-固有名詞
N-xs 名詞-補助語幹 名詞-補助動詞語幹
それは彼です その他
P コネクタ プレフィックス
P-fj 助詞副詞助詞 助詞副詞
P-jj 粒子 - 準体粒子 助詞句法
パック 助詞-格助詞 粒子ケースのマーキング
P-rj 粒子 - 粒子 粒子結合
P-sj 粒子 - 接続粒子 助詞接続詞
Qa 接尾語-形容詞 接尾語-形容詞
Qj 接尾語 - 形をした単語 接尾語-形容詞名詞
Qn 接尾辞 - 名詞 接尾辞-名詞
Qv 接尾語-動詞 接尾語-動詞
R 結合した単語 連体形容詞
Sc 表記法全般 符号共通
SL トークンテキスト サインレター
U URL URL
Vc 動詞-一般 動詞-共通
V-DP 動詞 - 非自立的可能性 動詞依存
W 空白 空白
バツ 助動詞 補助動詞

謝辞

開発者は、このプロジェクトに貢献してくれた関根聡氏、丸本聡子氏、吉本洋一氏、新里啓二氏、八重樫敬太氏、益子壮氏に感謝の意を表します。

参考文献

萩原聖人および関根聡著、オンライン学習に基づく軽量クライアントサイド中国語/日本語形態素解析ツール、COLING 2014 デモ セッション、39 ~ 43 ページ、2014

前川喜久雄. ことのは-BCCWJ コーパスの編集 (日本語). 日本語の研究, 4(1):82–95, 2008. (一部の英語情報はここで見つけることができます。) [サイト]

Jialei Wang、Peilin Zhao、Steven C. Hoi、正確なソフト信頼度加重学習、Proc. of ICML 2012、121–128 ページ、2012. [ PDF ]

Naiwen Xue、Fei Xia、Fu-dong Chiou、および Marta Palmer. The Penn Chinese Treebank: Phrase Structure annotation of a Large corpus. Natural Language Engineering, 11(2):207–238, 2005. [ PDF ] [サイト]


© 2014 , 2015 楽天 NLP プロジェクト.All Rights Reserved. / 後援:楽天株式会社および楽天技術研究所