【算法无用系列】计算文本相似度——余弦相似


前言

如下三句话:
我爱妈妈。
我爱祖国。
你要去哪里?
在人脑识别下,很容易可以识别出前两句话比较相似。但是机器缺没有人脑的思维,只有1和0,是或者不是,在这种相似度的计算中,没有办法直观的表达出来。


一、one-hot编码

机器无法识别中文的相似情况,但是可以想办法将中文转换为数字,将这些文本信息进行分词
我 爱 妈妈 祖国 你 要 去 哪里,然后转换为特征向量,如果文本中存在这个词,则这一位是1,不存在是0。
如:
   我爱妈妈可以表示为 1 1 1 0 0 0 0 0
   我爱祖国可以表示为 1 1 0 1 0 0 0 0
你要去哪里可以表示为 0 0 0 0 1 1 1 1

现在不懂这些数字也没关系,但是我们也可以发现,这种转换是合理的,因为可以很清楚的发现转换出来的数字,前两个是比较相似。这种时候虽然发现了前两句比较相似,但是没有一个合理的数值来表达出来他们的相似度。或者说,如果这些数字达到几十位的时候,通过人眼是没有办法更好的识别出哪些文本比较相似(0101的看, 眼就瞎了),所以需要一个数字来表示句子与句子之间的相似程度。

二、余弦相似度

1.温习余弦定理知识

在二维表中如果想求得两个向量的相似度,可以看两个向量夹角的大小,夹角越小,则两个向量越相似。

在这里插入图片描述
如果定义ab的夹角为 θ \theta θ,则cos θ \theta θ等于
在这里插入图片描述

推导方式

在这里插入图片描述
在这里插入图片描述
好在我数学知识没有还给数学老师。凑合能看懂。

2.向量相似度计算

在这里插入图片描述
因此,a·b = |a| · |b| · cos θ \theta θ,这里即可得到一个结论
在这里插入图片描述

cos<a,b>的值就是我们想要的相似度的值(上面的箭头打不出来,大家理解一下)。
到了这里隐隐约约貌似知道余弦定理来求相似度的意义,但是又不知道如何计算。下面给例子。
在二维坐标系中,可以很轻易的计算出cos的值。有如下公式:
在这里插入图片描述
如上是一个二维空间的计算公式,上面展示的我爱妈妈可以表示为 1 1 1 0 0 0 0 0 可以认为是在一个8维空间的一个向量。在高纬度的计算公式如下:
在这里插入图片描述
高维度会比2维的复杂一点,但是无需了解是如何推导的,直接套用即可,计算方式是一样的。
通过这个公式来计算两个文本的相似度。
   我爱妈妈可以表示为 1 1 1 0 0 0 0 0
   我爱祖国可以表示为 1 1 0 1 0 0 0 0
在这里插入图片描述
计算cos θ \theta θ约等于0.66;

余弦相似度百科

3.代码演示

计算我爱妈妈我爱祖国 的相似度。
代码如下(python示例):

import numpy as np
# 转化为矩阵
A = np.mat(np.array([1,1, 1, 0, 0, 0, 0, 0]))
B = np.mat(np.array([1,1, 0, 1, 0, 0, 0, 0]))
# 分子 两个向量的内积
i = float(A * B.T)
# 分母 两个向量模的乘积
# 向量的模就是向量的大小
# np.linalg.norm()是求范数
# 在机器学习中,范数是指向量的大小
# 所以,向量的模 == 向量的L2范数
n = np.linalg.norm(A) * np.linalg.norm(B)
# A,B的余弦相似度
sim = i / n
print("sim for numpy =",sim)

输出:

sim for numpy = 0.6666666666666667

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叁滴水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值