除了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)