Python 使用Word2vec确定一组单词中最相似的两个单词

Python 使用Word2vec确定一组单词中最相似的两个单词,python,word2vec,Python,Word2vec,我试图在Word2vec周围使用python包装器。我有一个单词嵌入或一组单词,可以在下面看到,从中我试图确定哪两个单词彼此最相似 我该怎么做 ['architect'、'nurse'、'外科医生'、'Grandma'、'dad']根据您的评论,鉴于您使用的是gensim的word2vec: 为嵌入加载或训练模型,然后在模型上调用: min_distance = float('inf') min_pair = None word2vec_model_wv = model.wv # Unsure

我试图在Word2vec周围使用python包装器。我有一个单词嵌入或一组单词,可以在下面看到,从中我试图确定哪两个单词彼此最相似

我该怎么做


['architect'、'nurse'、'外科医生'、'Grandma'、'dad']

根据您的评论,鉴于您使用的是gensim的word2vec:

为嵌入加载或训练模型,然后在模型上调用:

min_distance = float('inf')
min_pair = None
word2vec_model_wv = model.wv  # Unsure if this can be done in the loop, but just to be safe efficiency-wise
for candidate_word1 in words:
    for candidate_word2 in words:
        if candidate_word1 == candidate_word2:
            continue  # ignore when the two words are the same

        distance = word2vec_model_wv.distance(candidate_word1, candidate_word2)
        if distance < min_distance:
            min_pair = (candidate_word1, candidate_word2)
            min_distance = distance

min\u distance=float('inf')
最小对=无
word2vec_model_wv=model.wv#不确定这是否可以在循环中完成,但只是为了安全高效
对于候选单词1(大写):
对于候选单词2(大写):
如果候选单词1==候选单词2:
继续#两个词相同时忽略
距离=单词2向量模型距离(候选单词1,候选单词2)
如果距离小于最小距离:
最小对=(候选字1,候选字2)
最小距离=距离

也可能是相似性(我不完全确定是否有差异)


如我所料,如果单词越近,相似度越大,那么您将希望最大化而不是最小化,并用相似度调用替换距离函数调用。基本上,这只是对的简单的min/max函数。

@rylan feldspar的答案通常是正确的方法,并且会起作用,但是您可以使用标准Python库/习惯用法,特别是
itertools
,一个列表理解和排序函数,更简洁地实现这一点

例如,首先使用
itertools
中的
combinations()
生成所有候选词对:

来自itertools导入组合的

候选词=[“建筑师”、“护士”、“外科医生”、“祖母”、“父亲”]
所有单词对=组合(候选单词,2)
然后,用成对的相似性装饰成对:

scored_pairs=[(w2v_model.wv.similarity(p[0],p[1]),p)
对于p,所有_对]
最后,排序将最相似的一对放在第一位,并报告该分数和一对:

sorted\u pairs=已排序(计分\u pairs,reverse=True)
打印(已排序的_对[0])#第一项是最相似的对
如果您希望简洁但可读性稍差,则可以使用(长)“1行程序”:

print(排序([(w2v_model.wv.similarity,p[0],p[1]),p)
对于组合中的p(候选词,2)
],reverse=True)[0])
更新:

综合@ryan feldspar关于
max()
的建议,并追求最低限度,这也应该有助于报告最佳组合(但不是其得分):

print(最大组合(候选单词,2个),
key=lambda p:w2v_模型wv.相似性(p[0],p[1]))

您能使用Word2Vec python包发布到目前为止您拥有的代码吗?编辑:当我在做的时候,你能特别链接到你正在使用的包装器吗?不止一个如果你用的是gensim的word2vec,它看起来很可能接近您想要的。如果您使用的是Danielfrg的python google word2vec界面,那么这里有一些示例:我绝对建议您查看“预测”部分中的最后一个示例。@RylanFeldspar我正在使用Gensim@RylanFeldspar对于根辛来说,这并不能满足我的要求。考虑到['architect'、'nurse'、'surgerman'、'dad'],我希望返回两个最相似的词,例如['nurse'、'surgerman'],您也可以使用较少的调用模型,但我将把这个练习留给读者。我必须承认,我从来没有听说过
组合!你每天都能学到新东西!如果我们只是像提问者所建议的那样寻找最小值,那么使用
max(scored_pairs,key=lambda p:p[1])
和相似性或
min
来表示差异可能会更有效。通常人们想要排名靠前的几个,所以我的习惯是排序,但你是对的-a
max()
将比完全分拣稍微高效,一次就可以抓到最好的物品。由于分数位于元组的第一个(
[0]
)索引中,我认为您不需要指定一个
:比较是按元素进行的,从
p[0]
开始,只有在前面的元素中出现平局的情况下,才会进行
p[1]
(等)的比较。(但您也可以完全跳过理解/排序,使用
max()
key
函数来计算配对的相似性!)