【问题标题】:Gensim word2vec finding nearest words given a wordGensim word2vec 查找给定单词最近的单词
【发布时间】:2015-08-15 11:35:54
【问题描述】:

如何使用 gensim 的 word2vec 实现找到给定单词的 N-最近单词。什么是 API?我在这里指的是跳过克。也许我错过了什么,我阅读了所有关于寻找相似词,找出奇怪的词等等......

在 DL4j 中,我有一个名为 wordsNearest(String A, int n) which gives me the n-nearest words to A 的方法。在 Gensim 中相当于什么?

【问题讨论】:

  • 感谢 Radim。很高兴从创作者本人那里得到答案。我的意思是说模型的输入是 wi,输出可以是 wi−1,wi−2,wi+1,wi+2。所以这里的任务是预测给定单词的上下文,即 Skip Gram 模型,所以我只想知道什么 API 可以给我 wi−1,wi−2,wi+1,wi+2 给定 wi。跨度>
  • @Radim:我可能错了。例如,给定一个单词地震,most_similar 会给我里氏震级,震颤等。但是我需要的是预测上下文的概率,这样我就可以得到一个上下文,比如“日本是地震震中”,这样 API 就可以给我-2 = 日本 wi-1=was 和 wi+1=epicenter。现在又可以有几个上下文,我只会得到 wi-1、wi-2 等的发生概率。

标签: gensim word2vec


【解决方案1】:

这个问题真的很老了,但无论如何: 我仍然不完全确定分层softmax和负采样是如何工作的,但原则上你应该能够从输入矩阵中获取一个向量,将它乘以输出矩阵中的向量,然后选择最大值。

w1_vec = model[word] #Get the vector for the word you're interested in.
# Loop over the words in the output matrix and take dot products.
for idx, w2_vec in enumerate(model.syn1neg):
    print(idx, model.index2word[idx], np.exp(np.dot(w1_vec, w2_vec)))

然后从输出中选择最高值。根据负采样/分层 softmax 使用 syn1neg / syn1。我在一些示例文本上使用了这种技术,结果是合理的。

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题,您可以使用most_similar

    model.most_similar(positive=['woman'])
    

    【讨论】:

      猜你喜欢
      • 2016-06-06
      • 2017-02-25
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多