2024-03-28 08:53:57 发布
网友
我试图通过比较主题列表来计算书籍的相似性
需要从0-1之间的2个列表中获得相似性分数
例如:
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 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相似性,但这取决于您
n
n=2
现在将其应用到您的示例中,我将亲自计算每个列表中每对单词的bigram Jaccard相似度,并平均这些值(假设您有上面定义的jaccard_similarity函数):
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)
This
如果主题集不大,可能是一个很好的近似值。否则,我会尝试研究Word2Vec及其后续产品等模型
我建议使用spaCy,一个Python nlp库
输出:
注
您可能需要安装spacy:
模型:
除了spaCy之外,我还建议使用Jaccard similarity index,如果您所寻找的只是词汇重叠/相似性
你需要install NLTK
在上面的函数中,您可以选择
n
(指n-gram中的“n”)作为您想要的内容。我通常使用n=2
来使用bigram-Jaccard相似性,但这取决于您现在将其应用到您的示例中,我将亲自计算每个列表中每对单词的bigram Jaccard相似度,并平均这些值(假设您有上面定义的
jaccard_similarity
函数):This
如果主题集不大,可能是一个很好的近似值。否则,我会尝试研究Word2Vec及其后续产品等模型
相关问题 更多 >
编程相关推荐