如何在 python 中使用 gensim 和 word2vec 查找语义相似性

How to find semantic similarity using gensim and word2vec in python

我的 python 程序中有一个单词列表。现在我需要遍历这个列表并找出语义相似的词并将它们放入另一个列表中。我一直在尝试使用带有 word2vec 的 gensim 来做到这一点,但可以找到一个合适的 solution.This 是我到目前为止实现的。我需要有关如何遍历变量句子中的单词列表并找到语义相似的单词并将其保存在另一个列表中的帮助。

import gensim, logging

import textPreprocessing, frequentWords , summarizer
from gensim.models import Word2Vec, word2vec

import numpy as np
from scipy import spatial

sentences = summarizer.sorteddict

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
model = word2vec.Word2Vec(sentences, iter=10, min_count=5, size=300, workers=4)

如果你不关心适当的集群,你可以使用这个代码:

similar = [[item[0] for item in model.most_similar(word)[:5]] for word in words]

如果你真的想聚类的话,这里有一些注意事项:

  • 可以有多个这样的集群。
  • 集群的数量取决于超参数,某个阈值。当阈值很大时,所有的词都相似并且属于同一个簇,当阈值太小时,none 个是。
  • 单词可以自然地传递成一个簇,即A类似于BB类似于C,所以这三个应该在同一个集群中。这意味着您必须实施某种图形遍历算法。
  • 性能很大程度上取决于训练语料库:只有足够大,gensim word2vec 才能捕捉到适当的相似性。 Gemnsim 超参数和文本 pre-processing 因此也很重要。

这是一个简单且可能不是很有效的算法并识别集群:

model = gensim.models.word2vec.Word2Vec(sentences, iter=10, min_count=5, size=300, workers=4)
vocab = model.wv.vocab.keys()

threshold = 0.9
clusters = {}
for word in vocab:
  for similar_word, distance in model.most_similar(word)[:5]:
    if distance > threshold:
      cluster1 = clusters.get(word, set())
      cluster2 = clusters.get(similar_word, set())
      joined = set.union(cluster1, cluster2, {word, similar_word})
      clusters[word] = joined
      clusters[similar_word] = joined