Python-给定2个句子字符串,计算余弦相似度

发布于 2021-02-02 23:15:09

Python:tf-idf-cosine:查找文档相似度,可以使用tf-idf余弦计算文档相似度。如果不导入外部库,是否有任何方法可以计算2个字符串之间的余弦相似度?

s1 = "This is a foo bar sentence ."
s2 = "This sentence is similar to a foo bar sentence ."
s3 = "What is this string ? Totally not related to the other two lines ."

cosine_sim(s1, s2) # Should give high cosine similarity
cosine_sim(s1, s3) # Shouldn't give high cosine similarity value
cosine_sim(s2, s3) # Shouldn't give high cosine similarity value
关注者
0
被浏览
108
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    一个简单的纯Python实现是:

    import re, math
    from collections import Counter
    
    WORD = re.compile(r'\w+')
    
    def get_cosine(vec1, vec2):
         intersection = set(vec1.keys()) & set(vec2.keys())
         numerator = sum([vec1[x] * vec2[x] for x in intersection])
    
         sum1 = sum([vec1[x]**2 for x in vec1.keys()])
         sum2 = sum([vec2[x]**2 for x in vec2.keys()])
         denominator = math.sqrt(sum1) * math.sqrt(sum2)
    
         if not denominator:
            return 0.0
         else:
            return float(numerator) / denominator
    
    def text_to_vector(text):
         words = WORD.findall(text)
         return Counter(words)
    
    text1 = 'This is a foo bar sentence .'
    text2 = 'This sentence is similar to a foo bar sentence .'
    
    vector1 = text_to_vector(text1)
    vector2 = text_to_vector(text2)
    
    cosine = get_cosine(vector1, vector2)
    
    print 'Cosine:', cosine
    

    印刷品:

    Cosine: 0.861640436855
    

    这里所用的余弦公式描述这里。

    这不包括通过tf-idf对单词进行加权,但是为了使用tf-idf,你需要具有一个相当大的语料库才能从中估计tfidf的权重。

    你还可以通过使用更复杂的方法从一段文本中提取单词,对其进行词干或词义化等来进一步开发它。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看