代码之家  ›  专栏  ›  技术社区  ›  j-s

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

  •  3
  • j-s  · 技术社区  · 6 年前

    我的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)
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Maxim    6 年前

    如果你不在乎 适当的 群集,您可以使用以下代码:

    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