Word2vecもfastTextもモデルの読み込み処理が遅すぎです。
正直、使い物になりません。
しかし、Magnitudeを使えば、実用レベルになります。
そのためには、Word2vecやfastTextのモデルをMagnitude形式に変換します。
本記事の内容
- Magnitude形式モデルとは?
- Magnitude形式モデルへの変換ツール
- Magnitude形式モデルへの変換処理
- Magnitude形式モデルの読み込み
それでは、上記に沿って解説していきます。
Magnitude形式モデルとは?
Magnitude形式モデルとは、Magnitudeで利用可能なモデルのことです。
拡張子は、「.magnitude」となります。
基本的には、学習をMagnitudeで行うことはありません。
Word2vecやfastTextで学習したモデルをMagnitude形式に変換します。
fastTextは、学習の処理ではかなり「fast」ということです。
そのため、学習だけでfastTextを使うのは全然ありと言えます。
以上、Magnitude形式モデルについての説明をしました。
次は、Magnitude形式モデルへの変換ツールを確認します。
Magnitude形式モデルへの変換ツール
PythonでMagnitude形式モデルを扱うには、pymagnitudeを利用します。
pymagnitudeのインストールは、次の記事で解説しています。
そして、pymagnitudeには変換ツールが用意されています。
変換ツールを使えば、Word2vecやfastTextのモデルをMagnitude形式に変換できます。
「converter.py」が、その変換ツールになります。
上記の場所がわからないなら、以下のページからも取得できます。
GitHub上のpymagnitudeページ
https://github.com/plasticityai/magnitude/tree/master/pymagnitude
ただし、このままでは変換ツールは動きません。
変換ツールを動かすには、Gensimが必要となります。
Gensimについては、次の記事でまとめています。
Gensimがインストール済みなら、実際に変換していきましょう。
Magnitude形式モデルへの変換処理
「converter.py」には、PATHが通っていません。
そのため、「converter.py」を適当な場所にコピーしておきます。
変換ツールの使い方は、以下。
converter.py -i 変換前のモデルのパス -o 変換後のモデルのパス
処理を行う前に、まず変換前のモデルを用意しましょう。
変換前モデルの用意
fastTextの日本語学習済みモデルを用意します。
その方法は、次の記事で説明しています。
「cc.ja.300.vec.gz」が、日本語学習済みモデルです。
ただし、このファイルはそのままでは変換できません。
「-i」に指定できるのは、以下の拡張子のファイルだけです。
- txt
- bin
- vec
- hdf5
そのため、ファイルを解凍します。
gzip -d cc.ja.300.vec.gz
上記コマンドを実行すると、「cc.ja.300.vec」が新規に作成されます。
正確には、「 cc.ja.300.vec.gz」が「cc.ja.300.vec」に変換されます。
これで、変換前モデルの用意ができました。
変換処理
関連するファイルはすべて、同じフォルダにまとめています。
変換するコマンドは、以下となります。
converter.py -i cc.ja.300.vec -o cc.ja.300.magnitude
上記を実行すると、変換処理が行われます。
時間が、かなりかかります。
処理が完了すると、「cc.ja.300.magnitude」が作成されています。
各モデルのファイル容量は、上記をご覧ください。
いずれにしても、結構なサイズです。
まとめ
変換処理自体は、それほど難しいことではありません。
もしかしたら、Windowsなら「gzip」コマンドを動かすのが大変かもしれません。
大変な場合は、Cygwinを使いましょう。
あとは、ディスクの空きスペースを要確認です。
学習済みのモデルとなると、そこそこ大きいサイズのモデルとなります。
それらを複数個同時に扱うことになります。
したがって、ディスクスペースには余裕を持ちましょう。
以上、Magnitude形式モデルへの変換処理を説明しました。
最後は、Magnitude形式モデルの読み込みを行います。
Magnitude形式モデルの読み込み
Magnitude形式モデルの読み込みは、次のコードで行います。
from pymagnitude import Magnitude from pprint import pprint # モデルのPATH model_path = "cc.ja.300.magnitudeのパス" # モデルの読み込み wv = Magnitude(model_path) # 類似度上位10件を取得 match = wv.most_similar("SEO", topn=10) # 見やすい形式で表示 pprint(match)
上記の実行結果は、以下。
[('SEO', 0.79882485), ('seo', 0.6912321), ('HYEIN', 0.6502712), ('リンクポピュラリティ', 0.6327152), ('エンジンスパム', 0.62686944), ('アクセスアップ', 0.6239142), ('リンクポピュラリティー', 0.61026716), ('サーチエンジンマーケティング', 0.60989106), ('SEOSEO', 0.6004585), ('ページランクアップ', 0.5988657)]
これだけでは、面白くありません。
せっかくなので、fastTextとMagnitudeとで速度を比較してみましょう。
fastTextとMagnitudeにおける処理速度の比較
約3.5GBのモデルを読み込んだ場合の比較となります。
処理は、連続で5回行います。
また、設定するキーワードは毎回変更します。
同じキーワードなら、キャッシュが残る可能性を考慮しています。
キーワード | fastText | Magnitude | |
1回目 | 犬 | 276秒 | 3.31秒 |
2回目 | 猫 | 273秒 | 0.93秒 |
3回目 | 魚 | 264秒 | 1.01秒 |
4回目 | 空 | 264秒 | 1.01秒 |
5回目 | 海 | 259秒 | 0.96秒 |
約260倍以上の差ですね。
これは、完全に勝負あったでしょう。
Magnitudeの1回目は、メモリにキャッシュされていない分だけ時間がかかります。
そうは言っても、3秒ちょっとです。
3秒程度なら、全然許容範囲です。
その上で、2回目以降はモデルがキャッシュされます。
そうなってくると、1秒を切るか切らないかというレベルです。
いやはや、Magnitude恐るべしですね。
これなら、十分に実用することができます。