计算python中的单词相似性得分



我试图通过比较主题列表来计算书籍的相似性。

需要从0-1之间的两个列表中获得相似性得分。

示例:

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

尝试使用wordnet,但不确定如何计算分数。

有什么建议吗?

我建议使用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

除了spaCy,如果你想要的只是词汇重叠/相似性,我还建议使用Jaccard相似性指数。

您将需要安装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来使用二元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)

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

最新更新