自然语言处理 | 文本相似度计算
文本是一种高维的语义空间,需要对其进行抽象分解,从而能够从数学角度去量化其相似性。
距离度量的方式有多种多样,但是一种相似度计算方式并不适用与所有的情况,需要根据不同的情况和数据类型进行选择。
余弦相似度
余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小,余弦值越接近1,就表明夹角越接近0度,两个向量越相似。
相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。
适合word2vec模型向量化的数据。
Python代码实现:
def cosine_similarity(vector1, vector2):
dot_product = 0.0
normA = 0.0
normB = 0.0
for a, b in zip(vector1, vector2):
dot_product += a * b
normA += a ** 2
normB += b ** 2
if normA == 0.0 or normB == 0.0:
return 0
else:
return round(dot_product / ((normA**0.5)*(normB**0.5)) * 100, 2)
或者
import numpy as np
def get_cossimi(x,y):
myx=np.array(x)
myy=np.array(y)
cos1=np.sum(myx*myy)
cos21=np.sqrt(sum(myy*myy))
cos22=np.sqrt(sum(myx*myx))
return (cos1/float(cos22*cos21))
曼哈顿距离(L1范数)
统计相同坐标轴上的距离的和。
欧式距离(L2范数)
欧氏距离是最常用的距离计算公式,衡量的是多维空间中各个点之间的绝对距离,当数据很稠密并且连续时,这是一种很好的计算方式。
因为计算是基于各维度特征的绝对数值,所以欧氏度量需要保证各维度指标在相同的刻度级别,如在KNN中需要对特征进行归一化。
def distance(vector1,vector2):
d=0;
for a,b in zip(vector1,vector2):
d+=(a-b)**2;
return d**0.5;
闵可夫斯基距离(Lp范数)
欧式距离和曼哈顿距离在形式上比较相近,其实它们都是闵可夫斯基距离的特殊化。闵可夫斯基距离适合TF-IDF向量化后的数据或者提炼出来的主题模型数据。
皮尔森相关系数(pearson)
皮尔森相关系数是衡量线性关联性的程度。
两个连续变量(X,Y)(X,Y)的pearson相关性系数PX,YPX,Y等于它们之间的协方差cov(X,Y)cov(X,Y)除以它们各自标准差的乘积σXσX,σYσY。系数的取值总是在-1.0到1.0之间,接近0的变量被成为无相关性,接近1或者-1被称为具有强相关性。
from math import sqrt
def multipl(a,b):
sumofab=0.0
for i in range(len(a)):
temp=a[i]*b[i]
sumofab+=temp
return sumofab
def corrcoef(x,y):
n=len(x)
#求和
sum1=sum(x)
sum2=sum(y)
#求乘积之和
sumofxy=multipl(x,y)
#求平方和
sumofx2 = sum([pow(i,2) for i in x])
sumofy2 = sum([pow(j,2) for j in y])
num=sumofxy-(float(sum1)*float(sum2)/n)
#计算皮尔逊相关系数
den=sqrt((sumofx2-float(sum1**2)/n)*(sumofy2-float(sum2**2)/n))
return num/den
Jaccard相似性系数
Jaccard(杰卡德)相似性系数主要用于计算两个一元unary向量(buy or not, click or not)相似性的度量,或者用于集合sets相似性形式定义。若样本间的特征属性由符号和布尔值标识,无法衡量差异具体值的大小,只能获得“是否相同”这样一种结果,而Jaccard系数关心的是样本间共同具有的特征。适合词集模型向量化的数据。
Jaccard相似度没有考虑评分的大小。
kl散度/相对熵/kl距离
相对熵(relative entropy)又称为KL散度(Kullback–Leibler divergence,简称KLD)、信息散度(information divergence)、信息增益(information gain)。
KL散度是两个概率分布P和Q差别的非对称性的度量(designed to measure the difference between probability distributions),KL散度是用来度量使用基于Q的编码来编码来自P的样本平均所需的额外的位元数。 典型情况下,P表示数据的真实分布,Q表示数据的理论分布,模型分布,或P的近似分布。