我的 python 程序中有一个单词列表。现在我需要遍历这个列表并找出语义相似的词并将它们放入另一个列表中。我一直在尝试使用 gensim 和 word2vec 来做到这一点,但可以找到合适的解决方案。这就是我到目前为止所实现的。我需要有关如何遍历可变句子中的单词列表并找到语义相似的单词并将其保存在另一个列表中的帮助。
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]
如果你真的想对单词进行聚类,这里有一些注意事项:
- 可以有多个这样的集群。
- 集群的数量取决于一个超参数,一些阈值。当阈值很大时,所有的词都相似并且属于同一个簇,当它太小时,它们都不相似。
- 单词可以自然地传递包含到一个簇中,即
A
类似于B
而B
是类似于C
,所以这三个应该在同一个集群中。这意味着您必须实现某种图形遍历算法。 - 性能在很大程度上取决于训练语料库:只有足够大,gensim word2vec 才能捕捉到适当的相似性。因此,Gemnsim 超参数和文本预处理也很重要。
这是一个简单且可能不是很有效的算法并识别集群:
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
关于python - 如何在 python 中使用 gensim 和 word2vec 查找语义相似性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48990935/