ランダムに初期化された配列に最も類似した単語を見つける

Aug 21 2020

Gensimパッケージを使用して、次のように作業しているコーパスでword2vecモデルをトレーニングしました。

word2vec = Word2Vec(all_words, min_count = 3, size = 512, sg = 1)

Numpyを使用して、同じ次元のランダム配列を初期化しました。

vector = (rand(512)-0.5) *20

ここで、word2vecから、初期化したランダムベクトルに最も類似している単語を見つけたいと思います。

word2vec内の単語については、次のコマンドを実行できます。

word2vec.most_similar('word')

そして、出力は、最も類似した単語とそれに応じた距離のリストです。

初期化された配列に対して同様の出力を取得したいと思います。

ただし、実行すると:

word2vec.most_similar(vector)

次のエラーが発生します。

Traceback (most recent call last):

  File "<ipython-input-297-3815cf183d05>", line 1, in <module>
    word2vec.most_similar(vector)

  File "C:\Users\20200016\AppData\Local\Continuum\anaconda3\lib\site-packages\gensim\utils.py", line 1461, in new_func1
    return func(*args, **kwargs)

  File "C:\Users\20200016\AppData\Local\Continuum\anaconda3\lib\site-packages\gensim\models\base_any2vec.py", line 1383, in most_similar
    return self.wv.most_similar(positive, negative, topn, restrict_vocab, indexer)

  File "C:\Users\20200016\AppData\Local\Continuum\anaconda3\lib\site-packages\gensim\models\keyedvectors.py", line 549, in most_similar
    for word, weight in positive + negative:

TypeError: cannot unpack non-iterable numpy.float64 object

このエラーを克服し、配列に最も類似した単語を見つけるにはどうすればよいですか?

これとこのページをチェックしました。しかし、これらの提案で自分の問題をどのように解決できるかは私にはわかりません。

回答

1 gojomo Aug 21 2020 at 23:03

GensimのKeyedVectorsインターフェイス.most_similar()メソッド生のベクトルをターゲットとして使用できますが、現在の(少なくともgensim-3.8.3)argument-type-detectionが単一のベクトルをキーのリストと間違えないようにするには、明示的に1つとして提供する必要があります。名前付きpositiveパラメーターの項目リストのメンバー。

具体的には、これは機能するはずです。

similars = word2vec.wv.most_similar(positive=[vector,])
1 MatthieuBrucher Aug 21 2020 at 21:18

浮動小数点数が文字列に類似しているかどうかを確認しようとしていますが、それは機能しません(cannot unpack non-iterable numpy.float64 object)。

あなたがする必要があるのは、ランダムな浮動小数点数ではなく、ランダムな文字列を適切に生成することです。これが完了すると、コードは機能します。記載されているドキュメントも参照してくださいlist of str(https://radimrehurek.com/gensim/models/keyedvectors.html#gensim.models.keyedvectors.WordEmbeddingsKeyedVectors.most_similar)