序章
楽天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
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"));
次にrma = 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)
メソッドにフィードします。 epoch
通常、SCW は 1 回(トレーニング コーパス全体を 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 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 = 2048 、c = 0.003906 )。 |
メソッド | 説明 |
---|---|
tokenize(input) |
トークンinput 化 (文字列) し、トークン化された結果 ([トークン、PoS タグ] ペア) を返します。 |
train_one(sent) |
与えられた回答 ([token, PoS tag] のペア) を使用して現在のモデルを (必要に応じて) 更新します. 戻り値は, ,のsent 3 つのプロパティを持つオブジェクトです.は与えられた回答 ( と同じ)です. (古い) モデルであり、モデルが更新されたかどうか ( が とは異なるため) を意味するバイナリ (True/False) フラグです。ans sys updated ans sent sys updated sys ans |
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 の場合は関数f をf("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_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) |
その他 | 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. / 後援:楽天株式会社、楽天技術研究所.