web-dev-qa-db-ja.com

gensim Word2vecのmost_similarとsimilar_by_vectorの違いは?

GensimのWord2vecKeyedVectorsからのmost_similarとsimilar_by_vectorの結果と混同されました。それらは同じ方法でコサイン類似度を計算することになっています-しかし:

それらを1つのWordで実行すると、同じ結果が得られます。たとえば、model.most_similar(['obama'])とsimilar_by_vector(model ['obama'])

しかし、私がそれに方程式を与えるならば:

model.most_similar(positive=['king', 'woman'], negative=['man'])

与える:

[('queen', 0.7515910863876343), ('monarch', 0.6741327047348022), ('princess', 0.6713887453079224), ('kings', 0.6698989868164062), ('kingdom', 0.5971318483352661), ('royal', 0.5921063423156738), ('uncrowned', 0.5911505818367004), ('prince', 0.5909028053283691), ('lady', 0.5904011130332947), ('monarchs', 0.5884358286857605)]

と一緒に:

q = model['king'] - model['man'] + model['woman']
model.similar_by_vector(q)

与える:

[('king', 0.8655095100402832), ('queen', 0.7673765420913696), ('monarch', 0.695580005645752), ('kings', 0.6929547786712646), ('princess', 0.6909604668617249), ('woman', 0.6528975963592529), ('lady', 0.6286187767982483), ('prince', 0.6222133636474609), ('kingdom', 0.6208546161651611), ('royal', 0.6090123653411865)]

クイーン、モナークなどの単語のコサイン距離に顕著な違いがあります。なぜだろうか。

ありがとう!

6
peidaqi

_most_similar_同様の関数は、_"king"_、_"woman"_、および_"man"_に対応するベクトルを取得し、正規化_king - man + woman_( ソースコード :_use_norm=True_)を計算する前にそれら。

関数呼び出しmodel.similar_by_vector(v)model.most_similar(positive=[v])を呼び出すだけです。したがって、違いは_most_similar_が入力のタイプ(文字列またはベクトル)に応じた動作をするためです。

最後に、_most_similar_に文字列入力がある場合、出力から単語が削除されます(そのため、結果に「king」は表示されません)。

違いを確認するためのコード:

_>>> un = False
>>> v = model.Word_vec("king", use_norm=un) + model.Word_vec("woman", use_norm=un) - model.Word_vec("man", use_norm=un)
>>> un = True
>>> v2 = model.Word_vec("king", use_norm=un) + model.Word_vec("woman", use_norm=un) - model.Word_vec("man", use_norm=un)
>>> model.most_similar(positive=[v], topn=6)
[('king', 0.8449392318725586), ('queen', 0.7300517559051514), ('monarch', 0.6454660892486572), ('princess', 0.6156251430511475), ('crown_prince', 0.5818676948547363), ('prince', 0.5777117609977722)]
>>> model.most_similar(positive=[v2], topn=6)
[('king', 0.7992597222328186), ('queen', 0.7118192911148071), ('monarch', 0.6189674139022827), ('princess', 0.5902431011199951), ('crown_prince', 0.5499460697174072), ('prince', 0.5377321243286133)]
>>> model.most_similar(positive=["king", "woman"], negative=["man"], topn=6)
[('queen', 0.7118192911148071), ('monarch', 0.6189674139022827), ('princess', 0.5902431011199951), ('crown_prince', 0.5499460697174072), ('prince', 0.5377321243286133), ('kings', 0.5236844420433044)]
_
6
mcoav