導入
楽天 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します。
1git clone https://github.com/rakuten-nlp/rakutenma.git
または、ここから zip アーカイブをダウンロードします: https://github.com/rakuten-nlp/rakutenma/archive/master.zip
Node.js がインストールされている場合は、次の方法でデモを実行できます。
1node demo.js
これは以下の使用例と同じです。
npm package
楽天 MA を npm パッケージとして使用することもできます。
1npm 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
- 既存のモデルをロードします。たとえば、
model = JSON.parse(fs.readFileSync("model_file"));
thenrma = new RakutenMA(model);
またはrma.set_model(model);
featset
言語(rma.featset = RakutenMA.default_featset_zh;
中国語用、rma.featset = RakutenMA.default_featset_ja;
日本語用など)に応じて指定してください。rma.hash_func = RakutenMA.create_hash_func(15);
バンドル モデル (model_zh.json
および) を使用する場合は、必ず 15 ビット特徴ハッシュ関数 ( ) を使用してくださいmodel_ja.json
。rma.tokenize(input)
入力を分析するために使用します。
Training your own analysis model from scratch
- トレーニング コーパス (文が正しい [トークン、PoS タグ] の配列であるトレーニング文のセット) を準備します。
- でRakutenMAインスタンスを初期化します
new RakutenMA()
。 - を指定します
featset
(オプションで、ctype_func
、hash_func
など) - トレーニング センテンスを 1 つずつ (最初から最後まで)
train_one(sent)
メソッドにフィードします。 - 通常、SCW は 1 回
epoch
(トレーニング コーパス全体を 1 回通過する) で十分に収束しますが、ステップ 4. を繰り返すことで、さらに優れたパフォーマンスを達成することができます。
独自のモデルをトレーニングする方法を示す例については、scripts/train_zh.js
(中国語の場合) と(日本語の場合) を参照してください。scripts/train_ja.js
Re-training an existing model (domain adaptation, fixing errors, etc.)
- 既存のモデルをロードし、RakutenMA インスタンスを初期化します (上記の「バンドルされたモデルを使用した中国語/日本語の文章の分析」を参照)
- トレーニング データを準備します (これは、何をどの程度「再トレーニング」したいかによって異なりますが、数文程度で済む可能性があります)。
- トレーニング文を 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インスタンスを初期化するためのモデルオブジェクトを指定します。phi とc (両方オプション)は、SCWのハイパーパラメータです(デフォルト: phi = 2048 、c = 0.003906 )。 |
メソッド | 説明 |
---|---|
tokenize(input) |
(文字列)をトークン化しinput て、トークン化された結果 ([トークン、PoS タグ] ペア) を返します。 |
train_one(sent) |
指定された回答sent ([トークン、PoS タグ] ペア) を使用して、現在のモデルを (必要に応じて) 更新します。戻り値は、ans 、sys 、およびの 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) chardic RakutenMA.create_ctype_chardic_func({"A": "type1"}) f f("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.json
model_ja.json
Q. 中国語ではどのようなスクリプト (簡体字/繁体字) がサポートされていますか?
- A. 現在、簡体字中国語のみがサポートされています。
Q. ブラウザでも同じモデルファイルをJSON形式で使用できますか?
- A. はい、いいえです。モデルの内部データ構造は同じですが、ブラウザ上で参照するために代入(例:)を追加する必要があります。 (Node.js 用)と(ブラウザ用)
var model = [JSON representation];
の違いを参照してください。これを行うミニ スクリプトがあります。モデルのトレーニングなどのために Node.js で作業してから、ブラウザで使用できるように変換することをお勧めします。model_zh.json
model_zh.js
scripts/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を指定すると、現在の位置の文字タイプが返されます。基本的にはテンプレートと同じです。)_t i _t j i c t f(_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. / 後援:楽天株式会社および楽天技術研究所