自分で Word2Vec のような各単語に対し,そのベクトルを表記したモデルを作成したとき,KeyedVectors を使います.
model.txt 等には以下の用に書き出します.
[単語数] [次元数] word1 -0.101747 -0.011735 word2 -0.017135 0.051458 ︙
これを KeyedVectors で読み込んで使いたいときこう書きます.
from gensim.models import KeyedVectors vectors = KeyedVectors.load_word2vec_format('./model.txt', binary=False)
これで正しいはずですが,何度も
ValueError: invalid vector on line 行番号 (is this really the text format?)
エラーが発生します.model.txtの該当行をみても不審な点はなくわけがわかりませんでした.しかし,目視チェックと少量ずつの実行を繰り返し,やっと原因がわかりました.
犯人は「PlayStation 2」!!
正確には「 2 」部分ですが,上述したように,KeyedVectors で読み込まれるファイルは半角スペース区切りであるため,PlayStation 2 の行だけは 2 をベクトルの1つと認識したため,
次元数が合わずエラーになっていたようです.
なら該当行はそこを教えて欲しいのですが…
今回私がした作業のように元々のWord2Vecモデルをゴニョゴニョして,そこに含まれる単語に新たなベクトルを追加する場合,おそらく元のモデルはバイナリ表記だから半角スペースを含む単語でも問題なくて,今回扱いやすくユニコードで出力して読み込みしたので,こうなったのでしょう.
本来読み込みがうまく行っていたデータだけになかなか気づきませんでした.
「PlayStation 2」→「PlayStation2」のようにすべて処理して解決!