Word2vecを使い始めたばかりで、ベクトルに最も近いWordを見つけるにはどうすればよいのかと思っていました。ベクトルのセットの平均ベクトルであるこのベクトルがあります:
array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32)
このベクターとトレーニングデータで最も類似したWordを見つける簡単な方法はありますか?
または、唯一の解決策は、このベクトルとトレーニングデータ内の各単語のベクトル間のコサイン類似度を計算し、最も近いものを選択することですか?
ありがとう。
gensim Word2vecの実装には、特定のWordに意味的に近い単語を検索できるmost_similar()
関数があります。
>>> model.most_similar(positive=['woman', 'king'], negative=['man'])
[('queen', 0.50882536), ...]
またはそれのベクトル表現に:
>>> your_Word_vector = array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32)
>>> model.most_similar(positive=[your_Word_vector], topn=1))
topn
は、返される結果の望ましい数を定義します。
しかし、私の直感では、関数はあなたが提案したものとまったく同じです、つまり、指定されたベクトルと辞書内の各ベクトルのコサイン類似度を計算します(これは非常に非効率的です...)
most_similar関数に負の単語を含む空の配列を追加することを忘れないでください:
import numpy as np
model_Word_vector = np.array( my_vector, dtype='f')
topn = 20;
most_similar_words = model.most_similar( [ model_Word_vector ], [], topn)
または、model.wv . similar_by_vector(vector、topn = 10、restrict_vocab = None) もgensim
パッケージで利用できます。
ベクトルで上位N個の最も類似した単語を見つけます。
パラメータ:
vector(numpy.array)–類似性の計算元となるベクトル。
topn({int、False}、オプション)–返される上位N個の類似ワードの数。 topnがFalseの場合、similar_by_vectorは類似度スコアのベクトルを返します。
restrict_vocab(int、optional)–ほとんどの場合に検索されるベクトルの範囲を制限する整数-同様の値。たとえば、restrict_vocab = 10000は、語彙順で最初の10000ワードベクトルのみをチェックします。 (これは、頻度を降順で語彙をソートした場合に意味があります。)
戻り値:(単語、類似性)のシーケンス。
戻り値の型:(str、float)のリスト