GloVeで学習すると、標準のオプションではvector.binとvector.txtが出力される。
これらはgensim.word2vecで読み込めないので、読み込める形式に整形する。
word2vecのフォーマット
区切り文字はスペース
1行目:単語種類数 次元数
2行目以降:単語1 ベクトル1 ベクトル2 ...
上記のようなシンプルなフォーマットとなっている。
GloVeのフォーマット
区切り文字はスペース
単語1 ベクトル1 ベクトル2 ...
上記のように、word2vecの1行目が欠けている。
つまり単語種類数と次元数を1行目に追加することで形式が変換できる。
実装
使い方
$ python glove2word2vec_format.py vector.txt > gensim_vector.txt
出力したものをmodel = word2vec.Word2Vec.load_word2vec_format("./gensim_vectors.txt", binary=False)
とすれば読み込める。
ソースコード
glove2word2vec_format.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
def main():
argvs = sys.argv # コマンドライン引数を格納したリストの取得
argc = len(argvs) # 引数の個数
if (argc != 2): # 引数が足りない場合は、その旨を表示
print('Usage: # python %s filename' % argvs[0])
quit()
line_count = 0 # 行数
vector_size = 0 # 次元数
# 1度目のファイルアクセスで、行数と次元数を確認
with open(argvs[1], "r") as fin:
for line in fin:
line_count += 1
# 最後に次元数を確認
vector = line.rstrip().split(' ')
vector_size = len(vector) - 1
# 2度目のファイルアクセスで、word2vec形式のものを標準出力
with open(argvs[1], "r") as fin:
print(line_count, vector_size)
for line in fin:
print(line, end="")
if __name__ == "__main__":
main()
出来なかったこと
バイナリファイルを開いて、word2vec形式に変換したかった。
バイナリファイルの開き方が知識不足により実現できなかった。