fastText Japanese Tutorial

Facebookの発表したfastTextを日本語で学習させるためのチュートリアルです。

Setup

事前に、以下の環境のセットアップを行います。Windowsの場合、MeCabのインストールが鬼門のためWindows10ならbash on Windowsを利用してUbuntu環境で作業することを推奨します。

1. 学習に使用する文書を用意する

日本語Wikipediaのダンプデータをダウンロードし、 source フォルダに格納してください。

2. テキストを抽出する

WikiExtractorを使用し、sourceに格納したWikipediaのデータからテキストを抜き出し、corpusフォルダに格納します。

python wikiextractor/WikiExtractor.py -b 500M -o corpus source/jawiki-xxxxxxxx-pages-articles-multistream.xml.bz2

Wikipediaのabstractのファイルを使う場合は、parse.pyにabstract用の抽出処理を実装しているので、そちらを利用してください。

python parse.py jawiki-xxxxxxxxx-abstract4.xml  --extract

テキストを抽出したファイルは、最終的に一つにまとめます。これはコマンドで行ってもよいですが、parse.pyに結合用のスクリプトを用意しているのでコマンドがわからない場合は使ってください。

python parse.py (対象フォルダ) --concat (対象ファイルに共通する名称(wiki_など))

これで、学習用のテキストデータの作成が完了しました。

3. テキストを単語に分ける(分かち書きする)

テキストデータ内の単語を英語と同じようにスペースで分ける作業(=分かち書き)を行います。この作業には、MeCabを利用します。

mecab (対象テキストファイル) -O wakati -o (出力先ファイル)

これで、単語ごとに区切られたファイルができました。

4. fastTextで学習する

英語と同じように、単語ごとに区切られたファイルが手に入ったため、あとはfastTextを実行するだけです。fastTextのリポジトリをcloneしてきて、ドキュメントにある通りmakeによりビルドしてください。

設定パラメーターは各種ありますが、論文を参考にすると、扱うデータセットにより単語の数値表現のサイズ(ベクトルの次元)は以下のようになっています(※tokenが何の単位なのかは言及がなかったのですが、おそらく単語カウントと思われます)。

要は、小さいデータセットなら小さい次元、ということです。Wikipedia全件のような場合はfullの300次元に相当するため、以下のように処理します。

./fasttext skipgram -input (分かち書きしたファイル) -output model -dim 300

Word2Vecの学習と同等のパラメーターで行う場合は、以下のようになります(パラメーター設定などは、こちらに詳しいです)。

./fasttext skipgram -input (分かち書きしたファイル) -output model -dim 200 -neg 25 -ws 8

(Issueにも上がっていますが、パラメーターで結構変わるらしいです。epoch、mincountなど。。。)

学習が完了すると、-outputで指定したファイル名について、.bin.vecの二種類のファイルが作成されます。これらが学習された分散表現を収めたファイルになります。 ただ、Wikipeida全件のような場合はデータサイズが大きすぎてmodelのファイルを読み込もうとするとMemoryErrorで飛ぶこともままあるほか、エンコードの問題が発生するケースがあります(というか発生したのですが)。そのような場合は、一旦単語の辞書を作り(「朝」->11など、単語をIDに変換する辞書を作る)、テキストファイルを単語IDの列に変換するなどして対応します。 この作業のために、parser.pyにtokenizeの機能を実装しているので、必要に応じて活用してください。

python parser.py (対象テキストファイル)  --tokenize

これで、.vocabという辞書ファイルと、_tokenizedという単語ID化されたテキストファイルが手に入ります。

5.fastTextを活用する

eval.pyを利用し、似ている単語を検索することができます。

python eval.py (単語)

こちらは、デフォルトでfastText内のmodel.vecを参照します。別のファイル名、または別の場所に保管している場合は--pathオプションで位置を指定してください。