白猫のメモ帳

C#とかJavaとかJavaScriptとかHTMLとか機械学習とか。

fastTextで単語のベクトル演算

こんにちは。

随分と空いてしまいました。
3月なのに今年最初のエントリってどういうことじゃい…。

以前、fastTextのインストールをしましたが、実際に使っていなかったので、
今回は適当な文章から単語のベクトルを学習させて、その演算を試してみます。

ちなみにfastTextは分類によく利用されるため、
分散表現を使ってどうこうするのはあんまりポピュラーではないです。
が、せっかく機能としてあるので使ってみます。

何ができるの?

「パリ」 - 「フランス」 + 「日本」 = 「東京」
とか
「王様」 - 「男」 + 「女」 = 「女王」
みたいなやつです。

これはfastText固有の機能というわけじゃなくて、
fastTextの元になっている(元っていうのも違う気がするけれど)、word2vecで有名な機能です。

学習する

詳しい説明は世の中にたくさんあるので、さっくりと端折ります。
今回学習させるデータはWikipedia日本語版の全データです。

https://dumps.wikimedia.org/jawiki/

この辺とかから取れます。

これを分かち書きするのですが、その辺りはお好きな言語とライブラリで頑張りましょうということで、
これについても端折ります。

アンパサンド ( ampersand , &) と は 「 … と … 」 を 意味 する 記号 で ある 。 英語 の " and " に 相当 する ラテン語 の " et " の 合 字 で 、 " etc ." ( et cetera = and so forth ) を "& c ." と 記述 する こと が ある の は その ため 。 Trebuchet MS フォント で は 、 10 px と 表示 さ れ " et " の 合 字 で ある こと が 容易 に わかる 。

こんな感じで半角スペース区切りで分かち書きします。

で、こんな感じで学習させます。

# /fastText/fasttext skipgram -input wakachi.txt -output model

「skipgram」と言うのは単語表現のモードです。
他には「cbow」を指定できます。

github.com

他にもパラメタが色々あるのですが、面倒なのでそのままで試してみました。

・・・が、表現するベクトルの次元を指定する「dim」と、学習の繰り返し回数を指定する「epoch」くらいは
ちゃんと指定しておいたほうが良いと思います。
(ちなみにDockerの設定も特にいじっていなかったので、メモリ2Gしか使わなくてやたら時間が掛かりました)

試す

例として挙げた足し算引き算みたいのを試すには「analogies」と言うコマンドを使います。

# /fastText/fasttext analogies model.bin
Pre-computing word vectors... done.
Query triplet (A - B + C)? 

「triplet」・・・なるほど。
で、対話型で順番に入れると、

Query triplet (A - B + C)? 王様
男
女
魔女 0.704916
奥様 0.665025
待ち遠しい 0.65906
魔法使い 0.655222
花嫁 0.652865
妖精 0.645881
王さま 0.643353
美女 0.642074
ゴチソウノォト 0.640036
シンデレラ 0.639036

ほら完璧・・・ってなんか違くない?
魔女・・・魔女かぁ、あながち間違いでもないかもなー。

Query triplet (A - B + C)? パリ
フランス
日本
東京 0.724273
都内 0.689351
大阪 0.61897
京都 0.612206
ソウル 0.605822
昭和女子大 0.605477
台北 0.603844
横浜 0.60244
渋谷 0.599425
神楽坂 0.596325

こっちはあってそうですね。

まとめ

ある程度の文章量を分かち書きしてfastTextに突っ込むとベクトル演算ができるのがわかりました。
Wikipedia全文とかだと、次元数が足りていない感じなので200くらいにした方がいいのかな?

そのうちに今度はカテゴライズをやってみようと思います。
こっちこそがfastTextのメイン機能なはず!

それではまた。