遅いWord2vec・fastTextのモデルをMagnitude形式に変換

遅いWord2vec・fastTextのモデルをMagnitude形式に変換 データ分析

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回行います。
また、設定するキーワードは毎回変更します。
同じキーワードなら、キャッシュが残る可能性を考慮しています。


キーワードfastTextMagnitude
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恐るべしですね。
これなら、十分に実用することができます。

タイトルとURLをコピーしました