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

楽天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]) と E コマース コーパスからトレーニングされた中国語と日本語のモデルがバンドルされています。

デモ

デモページで楽天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"));次にrma = 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. epoch通常、SCW は 1 回(トレーニング コーパス全体を 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 and Sekine COLING 2014] を参照) を含めました。

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

API ドキュメント

コンストラクタ 説明
RakutenMA(model, phi, c) 新しい RakutenMA インスタンスを作成します。model(オプション) RakutenMA インスタンスを初期化するモデル オブジェクトを指定します。phiおよびc(両方ともオプション) は、SCW のハイパー パラメーターです (デフォルト: phi = 2048c = 0.003906)。
メソッド 説明
tokenize(input) トークンinput化 (文字列) し、トークン化された結果 ([トークン、PoS タグ] ペア) を返します。
train_one(sent) 与えられた回答 ([token, PoS tag] のペア) を使用して現在のモデルを (必要に応じて) 更新します. 戻り値は, ,sent3 つのプロパティを持つオブジェクトです.は与えられた回答 ( と同じ)です. (古い) モデルであり、モデルが更新されたかどうか ( が とは異なるため) を意味するバイナリ (True/False) フラグです。anssysupdatedanssentsysupdatedsysans
set_model(model) Rakuten 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)文字型関数を作成することもできます. (chardicたとえば、RakutenMA.create_ctype_chardic_func({"A": "type1"})return の場合は関数ff("A")返し"type1"[]そうでない場合は関数を返します)
hash_func フィーチャ ハッシュに使用するハッシュ関数を指定します。デフォルト = undefined(フィーチャ ハッシュなし) -bitビット ハッシュ スペースを使用するフィーチャ ハッシュ関数は、 を呼び出すことによって作成できますRakutenMA.create_hash_func(bit)

規約と条件

Apache ライセンス バージョン 2.0 http://www.apache.org/licenses/LICENSE-2.0.htmlに準拠する限り、Rakuten MA の配布、改変、学術/商用利用は許可されます

研究目的で楽天 MA を使用している場合は、楽天 MA に関する論文 [Hagiwara and Sekine 2014] を引用してください。

FAQ(よくある質問)

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

  • A.楽天MAは以下の環境で動作することを確認しております。
    • Internet Explorer 8 (ver.8.0.7601.17414以上)
    • Google Chrome (ver. 35.0.1916.153 以上)
    • Firefox (ver.16.0.2以上)
    • Safari(ver.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_func15 ビットの機能ハッシュ関数 ( ) を使用することを忘れないでください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)
その他 featset配列でカスタマイズされた機能関数を指定すると、関数は と の 2 つの引数_tで呼び出されますi。ここで、_tは位置を取り、jその位置にある文字オブジェクトを返す関数でありi、 は現在の位置です。文字オブジェクトはオブジェクトです。それぞれ文字型と文字型であると の 2 つのプロパティcを持ちtます. その関数の戻り値は機能値として使用されます. (たとえば、関数f(_t, i)whichを指定するreturns _t(i).t;と、現在の位置の文字型が返されます.基本的にはテンプレートと同じc0です。)

PoS tag list in Chinese

鬼ごっこ 説明
広告 副詞
なので アスペクト粒子
学士 ba3 (ba-construction 内)
CC 調整結合
CD 基数
CS 従属接続詞
12月 de5 (補完子/指名子)
de5 (属格/連想)
DER de5 (結果)
開発者 de5(マナー)
DT 決定者
その他
FW 外国語
IJ 間投詞
JJ その他の名詞修飾語
ポンド bei4 (ロングベイ構造)
LC ローカライザー
M 言葉を測る
MSP その他の粒子
NN その他の名詞
NNショート その他の名詞(略語)
NR 固有名詞
NRショート 固有名詞(略語)
NT 時間名詞
NTショート 一時名詞(略語)
外径 序数
オン オノマトペ
P 前置詞
PN 代名詞
PU 句読点
SB bei4(略してbei-construction)
SP 文末助詞
URL URL
VA 予測形容詞
VC コピュラ
VE you3(主動詞)
VV 他の動詞
バツ その他

PoS tag list in Japanese and correspondence to BCCWJ tags

鬼ごっこ 元JA名 英語
交流 形容詞 - 一般 形容詞-共通
A-dp 形容詞 - 自立できない 形容詞依存
C 連続した単語 接続詞
D シノニム 代名詞
英語 英単語
副詞 副詞
IC 意味動詞 - 一般 間投詞 - 共通
Jc 形の言葉 - 一般 形容詞名詞-共通
J足り 形語 - タリ 形容詞名詞-タリ
J-xs Shape Words-補助動詞幹 形容詞名詞-補助動詞語幹
まー 付与マーク - AA 補助記号-AA
マック グラントマーク - 一般 補助記号 - 共通
M-cp 補助金の記号 - 括弧は閉じています 補助記号-開き括弧
モップ 補助金の記号 - 括弧が開きます 補助記号 - 閉じ括弧
Mp 助成対象期間 補助記号-ピリオド
んん 名詞-名詞 名詞-名詞
N-nc 名詞 - 普通名詞 名詞 - 普通名詞
N-pn 固有名詞 名詞-固有名詞
N-xs 名詞補助語幹 名詞-助動詞の語幹
その彼 その他
P コネクタ プレフィックス
P-fj 粒子 - 副詞 助詞 - 副詞
P-jj 補助 - 準補助 助詞句
ピーク 補助 - ケース補助 パーティクル ケース マーキング
P-rj 補助相関補助 粒子結合
P-sj 補助 - 接続補助 粒子結合
カア 接尾辞 - 形容詞 接尾辞-形容詞
Qj 接尾語 接尾辞-形容詞名詞
Qn 接尾辞 - 名詞 接尾辞-名詞
Qv 接尾辞動詞 接尾辞-動詞
R 結合語 連体形容詞
Sc 記譜法 - 一般 サインコモン
Sl トークンテキスト サインレター
URL URL
VC 動詞 - 一般 動詞共通
V-dp 動詞 - 自立できない 動詞依存
W 空欄 空白
バツ 助動詞 補助動詞

謝辞

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

参考文献

萩原雅人、関根聡. オンライン学習に基づく軽量のクライアント側中国語/日本語形態素アナライザ. COLING 2014 Demo Session, pages 39-43, 2014. [ PDF ]

前川喜久夫. Kotonoha-BCCWJ コーパスの編集 (in Japanese). Nihongo no Kenkyu (Studies in Japanese), 4(1):82–95, 2008. (一部の英語情報はここで見つけることができます)

Jialei Wang、Peilin Zhao、Steven C. Hoi. Exact soft confidence-weighted learning. In Proc. of ICML 2012、ページ 121–128、2012. [ PDF ]

Naiwen Xue, Fei Xia, Fu-dong Chiou, and Marta Palmer. The Penn Chinese treebank: Phrase structure annotation of a large corpus. Natural Language Engineering, 11(2):207–238, 2005. [ PDF ] [サイト]


© 2014, 2015 Rakuten NLP Project. All Rights Reserved. / 後援:楽天株式会社楽天技術研究所.