#Word2Vecのモデルのロード方法を理解する
##1, モデルをロードする二つの方法
(1) gensim.models.Word2Vec.load("xxx.bin")
(2) gensim.models.KeyedVectors.load_word2vec_format("xxx.bin", binary=True)
( 1 ):
隠れた重み、語彙頻度、および二分木など学習に用いられるデータを含めてロードする
( 2 ):
隠れた重み、語彙頻度、および二分木が欠落しているため、ベクトルのトレーニングを続行することはできない。トレーニングを続行するには、KeyedVectorsだけでなく、save()によって保存された完全なWord2Vecオブジェクトの状態が必要((1)の形式でロードする必要があるよ、ということ)。
##2, DeprecationWarning: Call to deprecated __getitem__
(Method will be removed in 4.0.0, use self.wv.getitem() instead).の対処法
日本語訳
DeprecationWarning:非推奨の `__getitem __`を呼び出します(メソッドは4.0.0で削除され、代わりにself.wv .__ getitem __()を使用します)。
この警告は上記の(1)の形式を用いて得たモデルに対して誤った参照をした場合に出るもの
4.0.0というのはWord2Vecの親パッケージであるgensimの古いバージョンことを指していて、プログラム内で用いようとしているメソッドが古いバージョンで用いられていたものであることを示している。新しいバージョンでは非推奨であるため、今回のような警告が出てしまった。
ちなみにそのメソッドが
wv = model["xxx"] #非推奨(ダイレクトモデルビューア)
wv = model.wv["xxx"] #推奨(ヘルパーメソッド)
※ちなみに、model.wv[ ]は[ ]内の単語をベクトル化するメソッド
しかし、警告なので無視
###2.1, gensim3.8.3
for word in model.wv.index2word:
のようにこのバージョンではwvメソッドを用いることができた
index2wordには単語のリストが入っていて、そこから単語を取り出している様子。
詳細: https://www.pytry3g.com/entry/gensim-word2vec-tutorial
###2.2, gensim4.0.1
最新のバージョンでやってみる
まず(1)の形式でモデルをロード
AttributeError: Can't get attribute 'Vocab' on <module 'gensim.models.word2vec' from '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/gensim/models/word2vec.py'>
どうやら"Vocab"という属性がないらしい
というのも、モデルのバージョンが古く、新しいバージョンのWord2Vecではロードできない様子
詳細: https://github.com/RaRe-Technologies/gensim/issues/3013
そこで(2)の形式でロードしてみた。
AttributeError: The index2word attribute has been replaced by index_to_key since Gensim 4.0.0.
#下は日本語訳
AttributeError:Gensim 4.0.0以降、index2word属性はindex_to_keyに置き換えられました。
エラーの通り、index2wordをindex_to_keyに書き換えてみると
VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
TypeError: only size-1 arrays can be converted to Python scalars
#下は日本語訳
VisibleDeprecationWarning:不規則なネストされたシーケンス(リストまたはタプルのリストまたはタプル、または長さや形状が異なるndarray)からのndarrayの作成は非推奨になりました。これを行う場合は、ndarrayを作成するときに「dtype = object」を指定する必要があります。
TypeError:サイズ1の配列のみをPythonスカラーに変換できます
ジャグ配列からndarrayオブジェクトを生成することは非推奨らしい。
そもそもndarrayはNumpyの計算用の多次元配列であるため、わざわざジャグ配列にすることは理にかなっていない
しかし、警告なので無視
詳細: https://teratail.com/questions/297263
dtype=objectを実際に入れていきます
return numpy.array(w_ls, dtype=object).astype(numpy.float32), vocab #エラーが出ている箇所
#下記エラー
TypeError: only size-1 arrays can be converted to Python scalars
#下は日本語訳
TypeError:サイズ1の配列のみをPythonスカラーに変換できます
これはどうやら、object型でnumpy配列に入れたり、object型にキャストしたりすると配列扱いされないか空配列になってしまう模様...
##3, 結論
4.0.0以降のgensimでは古いモデルをロードできない(?)
古いモデルを利用する場合は3.8.3が推奨されてる様子