java文档相似度计算,计算文档与文档的相似度

最近帮很多本科毕业生做文本数据分析,经常遇到的一个需求是计算文档相似度。

思路:

抽取语料(所有文档)中的词语,构建词典(词语与数字对应起来)。

根据构建的词典对每个文档进行重新编码(将文档转化为向量)。

使用余弦计算相似度

下面的corpus是我在知乎live随便找到的几个评论,拿来当做测试的例子。好像数据不怎么好玩,大家跟着一起凑合凑合吧。

corpus = ['老师讲的很好很全面干货很多',

'讲述的很好干货满满',

'满满的干货很实用',

'感谢老师无私的分享啦',

'真水呵呵哒']

构建词典-学习语料特征

其实在机器学习里,学习语料的所有词语并将其转化为数字,这一步骤叫做特征化。强烈推荐对数据科学感兴趣的童鞋学学scikit-learn库,人工智能咱们小白可能还玩不转,但是调用封装好的机器学习算法,浅显的玩玩机器学习还是没啥难度的。

在scikit-learn中,涉及到文本数据特征化的类有sklearn.feature_extraction.text.CountVectorizer 和sklearn.feature_extraction.text.TfidfVectorizer 。我们先以常见的词频统计作为特征抽取的方式开始探索,由于scikit默认使用英文空格作为分词符号,所以处理中文数据前我们要分词并以空格间隔开来。

from sklearn.feature_extraction.text import CountVectorizer

import jieba

corpus = [' '.join(jieba.lcut(doc))

for doc in corpus]corpus

['老师 讲 的 很 好 很 全面 干货 很多',

'讲述 的 很 好 干货 满满',

'满满的 干货 很 实用',

'感谢 老师 无私 的 分享 啦',

'真水 呵呵 哒']

wordcounter = CountVectorizer()

#学习特征(构建词典)fit 并转化为特征矩阵。

matrix=wordcounter.fit_transform(corpus)

print(matrix.toarray())

#查看下特征与词语对应关系

print(wordcounter.get_feature_names())

[[1 0 0 0 1 1 0 0 0 0 0 1 0]

[0 0 0 0 1 0 0 0 1 0 0 0 1]

[0 0 0 1 1 0 0 0 0 1 0 0 0]

[0 1 0 0 0 0 1 1 0 0 0 1 0]

[0 0 1 0 0 0 0 0 0 0 1 0 0]]

['全面', '分享', '呵呵', '实用', '干货',

'很多', '感谢', '无私', '满满', '满满的',

'真水', '老师', '讲述']

计算相似度

这里使用scikit提供的cosine-similarity函数。

from sklearn.metrics.pairwise import cosine_similarity

cosine_similarity(matrix)

array([[1. , 0.28867513, 0.28867513, 0.25 , 0. ],

[0.28867513, 1. , 0.33333333, 0. , 0. ],

[0.28867513, 0.33333333, 1. , 0. , 0. ],

[0.25 , 0. , 0. , 1. , 0. ],

[0. , 0. , 0. , 0. , 1. ]])

我们看到这个矩阵是沿着对角线对称的,所以我们只需要看第一行。

第一个评论与第一个评论之间的相似度为1

第一个评论与第二个评论的相似度为0.28867513

第一个评论与第三个评论的相似度为0.28867513

第一个评论与第四个评论的相似度为0.25

第一个评论与第四个评论的相似度为0

高中数学知识cos相似性计算公式

本以为自己对这里很熟悉,结果自己写cos计算公式时居然出错了。粘贴到这里,帮助大家回忆高中知识。(a和b是向量)

d939ab0025782ae64bd7c6dc097f9998.png

#cos相似性计算

def cosVector(x,y):

result1=0.0

result2=0.0

result3=0.0

for i in range(len(x)):

result1 +=x[i]*y[i] #sum(a*b)

result2 +=x[i]**2 #sum(a*a)

result3 +=y[i]**2 #sum(b*b)

return str(result1/((result2*result3)**0.5))

vect1 = [1,0,1]

vect2 = [0,1,0]

vect3 = [1,1,1]

print("vect1与vect2相似度为:", cosVector(vect1, vect2))

print("vect1与vect3相似度为:", cosVector(vect1, vect3))

print("vect2与vect3相似度为:", cosVector(vect2, vect3))

vect1与vect2相似度为: 0.0

vect1与vect3相似度为: 0.8164965809277261

vect2与vect3相似度为: 0.5773502691896258

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值