用Python计算词语相似度得分

3
我将尝试通过比较主题列表来计算书籍相似度。
需要从两个列表中获得0-1之间的相似度分数。
例如:
book1_topics = ["god", "bible", "book", "holy", "religion", "Christian"]

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

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

有什么建议吗?


我建议你看一下这个讨论。 - SilentCloud
1
如果您能告诉我们您是如何进行比较的,那就太好了。比如说,它们有什么相似之处? - program.exe
补充一下我的上一个评论:我现在明白你想要按主题而不是单词计算相似度,所以我之前提出的讨论可能不太相关,我的错。 - SilentCloud
3个回答

2
我建议使用Python自然语言处理库spaCy
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

1
除了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来使用bigram Jaccard相似性,但这取决于您。

现在将其应用于您的示例中,我个人会计算每个列表中每对单词的bigram 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)

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接