【问题标题】:Calculating words similarity score in python在python中计算单词相似度得分
【发布时间】:2021-06-29 07:56:24
【问题描述】:

我正在尝试通过比较主题列表来计算书籍相似度。

需要从0-1之间的2个列表中获取相似度分数。

例子:

book1_topics = ["god", "bible", "book", "holy", "religion", "Christian"]

book2_topics = ["god", "Christ", "idol", "Jesus"]

尝试使用 wordnet 但不知道如何计算分数。

有什么建议吗?

【问题讨论】:

  • 建议大家看this讨论
  • 如果你告诉我们你是如何比较它们的,那么在你的问题中会很好。是什么让它们相似?
  • 完成我之前的评论:我现在看到你想通过主题而不是单词来计算相似度,所以我建议的讨论可能不是重点,我的错

标签: python nlp wordnet cosine-similarity sentence-similarity


【解决方案1】:

我建议使用spaCy,一个 Python nlp 库

import spacy

book1_topics = ['god', 'bible', 'book', 'holy', 'religion', 'Christian']
book2_topics = ['god', 'Christ', 'idol', 'Jesus']

nlp = spacy.load('en_core_web_md')
doc1 = nlp(' '.join(book1_topics))
doc2 = nlp(' '.join(book2_topics))

print(doc1.similarity(doc2))

输出:

0.822639616995468

注意

你可能想安装 spacy:

pip3 install spacy

和模型:

python3 -m spacy download en_core_web_md

【讨论】:

    【解决方案2】:

    This

    如果主题集不大,可能是一个很好的近似值。否则我会尝试研究像 Word2Vec 及其继任者这样的模型。

    【讨论】:

      【解决方案3】:

      除了 spaCy,如果您要寻找的只是词汇重叠/相似性,我还建议您使用 Jaccard similarity index

      你需要install NLTK

      from nltk.util import ngrams
      
      def jaccard_similarity(str1, str2, n):
          str1_bigrams = list(ngrams(str1, n))
          str2_bigrams = list(ngrams(str2, n))
      
          intersection = len(list(set(str1_bigrams).intersection(set(str2_bigrams))))
          union = (len(set(str1_bigrams)) + len(set(str2_bigrams))) - intersection
      
          return float(intersection) / union
      

      在上面的函数中,你可以选择n(指n-gram中的“n”)作为你想要的任何东西。我通常使用n=2 来使用bigram Jaccard 相似度,但这取决于你。

      现在将其应用于您的示例,我将亲自计算每个列表中每对单词的二元 Jaccard 相似度并将这些值平均(假设您具有上面定义的 jaccard_similarity 函数):

      >>> from itertools import product
      >>> book1_topics = ["god", "bible", "book", "holy", "religion", "Christian"]
      >>> book2_topics = ["god", "Christ", "idol", "Jesus"]
      >>> pairs = list(product(book1_topics, book2_topics))
      >>> similarities = [jaccard_similarity(str1, str2, 2) for str1, str2 in pairs]
      >>> avg_similarity = sum(similarities) / len(similarities)
      

      【讨论】:

        猜你喜欢
        • 2018-05-20
        • 2017-03-27
        • 2017-03-19
        • 2019-08-05
        • 2017-06-07
        • 1970-01-01
        • 2018-06-26
        • 2015-05-03
        • 2019-07-02
        相关资源
        最近更新 更多