こんにちは。
随分と空いてしまいました。
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」を指定できます。
他にもパラメタが色々あるのですが、面倒なのでそのままで試してみました。
・・・が、表現するベクトルの次元を指定する「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
こっちはあってそうですね。