Python - 中文文本进行余弦相似度比较

发布时间 2023-06-20 10:57:13作者: 修炼诗人

   今天,在看论文的时候,突然想到了一件事情,爱是相对的,是双方的事情。那么“你爱我”和“你爱我”的相似度是多少呢?采用余弦相似度的方式来进行相似度比较。首先“简单”的介绍一下余弦相似度:

    概念:余弦相似性通过计算两个向量的余弦角来测量两个向量之间的相似性。

    余弦相似性公式如下:

     当时,找关于中文的相似度比较的时候,废了一点点时间,干脆自己写一个,当做笔记了。关于一些过程都放到了代码里面。代码如下所示:

import numpy as np
from numpy.linalg import norm
import jieba
# 1、原始文本
origin_text1 = "我爱你"
origin_text2 = "你爱我"
# 2、NLP 分词 jieba
text1_list=jieba.cut(origin_text1,cut_all=False, HMM=False)
text2_list=jieba.cut(origin_text2,cut_all=False, HMM=False)

# 3、使用Python中的collections库,将分词后的文本转换成词汇向量
import collections
A = ['我','爱','你']
B = ['你','爱','我']
text1_counter = collections.Counter(text1_list)
text2_counter = collections.Counter(text2_list)

# 4、使用Python中的math库,计算两个词汇向量的余弦相似度:
import math

def cos_sim(vector1, vector2):
    numerator = sum(a * b for a, b in zip(vector1, vector2))
    denominator = math.sqrt(sum(a**2 for a in vector1)) * math.sqrt(sum(b**2 for b in vector2))
    return round(numerator / denominator, 3)

print(cos_sim(text1_counter.values(), text2_counter.values()))
# 0.577

   其实,从结果来看的话,是0.577。那么是不是说,单纯一方面的爱别人,只能得到一般成功的概率。

      因为,我采用jieba分词的形式,对这两句话进行分词,但是通过结果查看得知,jieba分完词之后,结果还是“我爱你”、“你爱我”。然后我采用['我','爱','你']、['你','爱','我']的形式,发现结果为1。这表明了爱别人是有收获的。

          如果有错误,欢迎大家指正,谢谢!!!