csdn博客推荐系统实战-2文本相似度-simhash和海明距离

上一篇我讲到了TF-IDF(term frequency–inverse document frequency)模型,再配合余弦定理来计算2篇文本的相似度,但是这样也有一个缺点,如果文本很长,那文本的特征向量会特别的多,比如5W个词,20W个词,那用余弦来计算的话,计算量就会很大,如果语料库文本量又很大,500W,5000W,那两两比较的话,计算量是一个天文数字,时间成本太高了,这种方法肯定不行。

为什么要进行相似度的计算?

既然上面的方法在大数据量的时候不行,那就回到问题的原点,为什么要计算相似度?是为后面能更好的分类(聚类也是分类),推荐,预测,总之是为下一步操作准备。我以推荐为例,推荐系统是把合适的内容推荐给用户,依据是用户的历史行为,人的兴趣点是有限的,youtube几十亿的视频,一般用户看几百个就不错了,重度用户看几千上万个,看几十万个视频的用户,太少太少了,可以忽略了。例如:我看了‘记录片《枪》第一集 冲锋枪’,相关推荐如下图,


不会给我推荐,日文的记录片,韩剧,韩综,中国偶像剧,即使我历史行为中有这些内容,但是如果不达到一定的比例都不会在这页给我推荐。

现在有个问题要面对,如何给用户推荐与现在看的文档不同,但相关的内容。与现在的文档不同,就是计算2个文档是否重复,这个就是接下来要说的内容。

与现在的文档相关的内容,刚才说到了,youtube有几十亿的视频,与某一视频相关的内容,会有很多,但肯定不是几十亿,而是几十几百,和几十亿总量一比,千万分之一啊,我们只计算相关的几十几百个内容即可,大部分都是无关的,或者是相关性很差的内容,那怎么发现这些相关的内容呢,后面我文章我会介绍。

文档去复

就是今天的主要内容。找出内容重复的文档,接下来是聚合,还是去除看产品而定。刚才说了,用TF-IDF和余弦来处理,时间成本太高,那怎么办?降维是一种通用的作法,把20W维降到20维,计算量肯定小很多啊。那该怎么降维呢?用simhash

simhash

simhash的主要思想是降维,将高维的特征向量映射成一个f-bit的指纹(fingerprint),又因为它的局部敏感性(局部敏感性指的是非常相似的文本,即便只差一个字符,md5后的序列也可能非常不同,但是simHash之后的序列可能只是某几位不同),通过比较两篇文章的f-bit指纹的海明来确定文章是否重复或者高度近似。

simhash是google用来处理海量文本去重的算法,简单实用。

将文章simhash得到一串64位的二进制,一般取海明距离为3作为阈值,即在64位二进制中,只有三位不同,我们就认为两个文档是相似的。当然了,这里可以根据自己的需求来设置阈值。

算法实现

1.将文档分词,取一个文章的TF-IDF模型中TF权重最高的前20个词(feature)和权重(weight)。即一篇文档得到一个长度为20的(feature:weight)的集合。
2.对其中的词(feature),进行普通的哈希之后得到一个64为的二进制,得到长度为20的(hash : weight)的集合。
3.根据(2)中得到一串二进制数(hash)中相应位置是1是0,对相应位置取正值weight和负值weight。例如一个词进过(2)得到(010111:5)进过步骤(3)之后可以得到列表[-5,5,-5,5,5,5],即对一个文档,我们可以得到20个长度为64的列表[weight,-weight...weight]。
4.对(3)中20个列表进行列向累加得到一个列表。如[-5,5,-5,5,5,5]、[-3,-3,-3,3,-3,3]、[1,-1,-1,1,1,1]进行列向累加得到[-7,1,-9,9,3,9],这样,我们对一个文档得到,一个长度为64的列表。
5.对(4)中得到的列表中每个值进行判断,当为负值的时候去0,正值取1。例如,[-7,1,-9,9,3,9]得到010111,这样,我们就得到一个文档的simhash值了。
6.计算相似性。连个simhash取异或,看其中1的个数是否超过3。超过3则判定为不相似,小于等于3则判定为相似。

simhash算法,python有实现的包,包名就叫 simhash, 安装pip install simhash。

这个算法我又写了一遍,代码在 https://github.com/worry1613/csdn-blog-recommend/blob/master/code/simhash.py 这里。

文本相似度计算为什么要说simhash算法,simhash就是sim hash ,sim就是Similarity,相似度计算hash方案,最初就是用来做相似度计算的,只不过google把simhash用在去重方面,很多人才知道了simhash,就只知道用在去重方面了。

在去重方面minhash也是很著名的算法,实现也比较简单,网上大把大把的文章说minhash,我就不说了。

百度的去重算法最简单,就是直接找出此文章的最长的n句话,做一遍hash签名。n一般取3。 工程实现巨简单,据说准确率和召回率都能到达80%以上。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值