GloVeの分散表現モデルをGensimで扱う

研究でDistributed representationの方のGloVeモデルを作成して、Word Mover’s Distanceを計算したかった。

結構手間取ったので詳細を書く。

GloVeで作成されたモデルのファイル形式

pipでインストールできるGloVe-pythonで作成した単語分散表現モデルはそのままではGensimのWord2VecやKeyedVectorで読み込めなかった.

GensimにGloVeモデルをGensimで使えるように変換するライブラリのようなものがある。しかし(https://radimrehurek.com/gensim/scripts/glove2word2vec.html)テキストファイル形式の学習済みGloVeモデルしか変換できないようだ。

https://nlp.stanford.edu/projects/glove/で配布されているGloVeのC言語実装は、サンプルファイル通りのデフォルトではテキスト形式でGloVeモデルを出力する

https://github.com/maciejkula/glove-python(pip でインストールできるPythonのGloVe)は、dumpで出力するため、バイナリのファイルが出力される

このため、バイナリのdumpファイルを読み書きできるならともかく、今のところStanfordのサイトで配布されているC言語実装のGloVeでモデルを作成して、Gensimのgensim.scripts.glove2word2vec.glove2word2vec(glove_input_fileword2vec_output_file)で変換するしかないみたい。

Pythonのラッパーもどきを作った

コーパスから一発でGensimで読み込めるモデルが作成できるできるPythonスクリプトを書いてみた.

import os
from gensim.scripts import glove2word2vec

def train_glove(copus,model_file,min_count=5,window_size=15,dimension=50,x_max=100,memory=4.0,m_iter=15,cores=4):
	os.system("build/vocab_count -min-count %s -verbose 2 < %s > vocab.tmp" % (min_count,copus))
	os.system("build/cooccur -memory %s -vocab-file vocab.tmp -verbose 2 -window-size %s < %s > coocurance.tmp" % (memory,dimension,copus))
	os.system("build/shuffle -memory %s -verbose 2 < coocurance.tmp > coocurance_suff.tmp" % (memory))
	os.system("build/glove -save-file glove_model.tmp -threads %s -input-file coocurance_suff.tmp -x-max %s -iter %s -vector-size %s -binary 2 -vocab-file vocab.tmp -verbose 2" % (cores,x_max,m_iter,dimension))
	
	glove2word2vec.glove2word2vec("glove_model.tmp.txt",model_file)
	
	os.system("rm *.tmp.*")
	os.system("rm *.tmp")

—–概要—–

GloVeでコーパス走査からモデル構築,Gensimで読めるフォーマットにするところまで 全部一括でやる自作Pythonラッパーのようなもの.

—–プログラムの説明—–

処理自体はStanford本家GloVeのC言語プログラムを使用. 現在使用できるPython実装のGloVeはGensimで使うにはバイナリを読み書きしないと無理なので、Stanfordの本家のC言語実装のGloVeを動かして Gensimで読み書きできる形に変換する。

なお、一部のパラメータは今のところ調整不要なので、固定にした。

—–パラメーター解説——

(defaultはC言語実装の方のデフォルト値を表記)

引数で調整可能なもの

  • copus 与えるコーパスファイル。1文1行で問題ないはず(一応要検証)
  • model_file 出力モデルファイル名
  • min_count これより登場回数が少ない語は無視(default=5)
  • window_size ウィンドウサイズ。(default=15)
  • deimension モデルの次元数(default=50)
  • x_max 極端に小さいコーパスを使う場合は調整が必要と書いてあった。(default=100)
  • memory 使用する最大メモリ(単位GB)(default=3)

m_iter 最大の反復数(default=15)

固定値にしてしまったもの

  • verbose 学習中に標準出力される内容が変わるらしい(default=2)
  • binary ファイルの出力形式,2ならテキスト,バイナリの両方のモデルを出力(default=2)

他、中間出力ファイルはすべて名前を固定にし、処理終了後にすべて削除している。 同じディレクトリで複数動かすと互いにファイル読み書きするため複数同時実行は不可能

——-使い方——

StanfordのGloVeのC言語実装版の最新版(v1.2ではエラーが発生してだめ)を解凍してmakeした後、GloVeの フォルダ内(の1番上の階層)にこのファイルを置けば使用可能。

コメント

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