开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 29396|回复: 300
收起左侧

[易语言软件开源] 【文章查重】改自谷歌海量Simhash文本去重

    [复制链接]

结帖率:100% (47/47)
发表于 2023-3-16 18:24:26 | 显示全部楼层 |阅读模式   江西省南昌市
分享源码
界面截图: -
是否带模块: -
备注说明: -
本帖最后由 明天自然醒 于 2023-3-18 22:29 编辑

1. SimHash与传统hash函数的区别
  传统的Hash算法只负责将原始内容尽量均匀随机地映射为一个签名值,原理上仅相当于伪随机数产生算法。传统的hash算法产生的两个签名,如果原始内容在一定概率下是相等的;如果不相等,除了说明原始内容不相等外,不再提供任何信息,因为即使原始内容只相差一个字节,所产生的签名也很可能差别很大。所以传统的Hash是无法在签名的维度上来衡量原内容的相似度,而SimHash本身属于一种局部敏感哈希算法,它产生的hash签名在一定程度上可以表征原内容的相似度。
  我们主要解决的是文本相似度计算,要比较的是两个文章是否相识,当然我们降维生成了hash签名也是用于这个目的。看到这里估计大家就明白了,我们使用的simhash就算把文章中的字符串变成 01 串也还是可以用于计算相似度的,而传统的hash却不行。我们可以来做个测试,两个相差只有一个字符的文本串,“你妈妈喊你回家吃饭哦,回家罗回家罗” 和 “你妈妈叫你回家吃饭啦,回家罗回家罗”。
  通过simhash计算结果为:
  1000010010101101111111100000101011010001001111100001001011001011
  1000010010101101011111100000101011010001001111100001101010001011
  通过传统hash计算为:
  0001000001100110100111011011110
  1010010001111111110010110011101
  大家可以看得出来,相似的文本只有部分 01 串变化了,而普通的hash却不能做到,这个就是局部敏感哈希的魅力。

2. SimHash算法思想
  假设我们有海量的文本数据,我们需要根据文本内容将它们进行去重。对于文本去重而言,目前有很多NLP相关的算法可以在很高精度上来解决,但是我们现在处理的是大数据维度上的文本去重,这就对算法的效率有着很高的要求。而局部敏感hash算法可以将原始的文本内容映射为数字(hash签名),而且较为相近的文本内容对应的hash签名也比较相近。SimHash算法是Google公司进行海量网页去重的高效算法,它通过将原始的文本映射为64位的二进制数字串,然后通过比较二进制数字串的差异进而来表示原始文本内容的差异。
3. SimHash流程实现
  simhash是由 Charikar 在2002年提出来的,本文为了便于理解尽量不使用数学公式,分为这几步:
  (注:具体的事例摘自Lanceyan的博客《海量数据相似度计算之simhash和海明距离》)
  • 1、分词,把需要判断文本分词形成这个文章的特征单词。最后形成去掉噪音词的单词序列并为每个词加上权重,我们假设权重分为5个级别(1~5)。比如:“ 美国“51区”雇员称内部有9架飞碟,曾看见灰色外星人 ” ==> 分词后为 “ 美国(4) 51区(5) 雇员(3) 称(1) 内部(2) 有(1) 9架(3) 飞碟(5) 曾(1) 看见(3) 灰色(4) 外星人(5)”,括号里是代表单词在整个句子里重要程度,数字越大越重要。
  • 2、hash,通过hash算法把每个词变成hash值,比如“美国”通过hash算法计算为 100101,“51区”通过hash算法计算为 101011。这样我们的字符串就变成了一串串数字,还记得文章开头说过的吗,要把文章变为数字计算才能提高相似度计算性能,现在是降维过程进行时。
  • 3、加权,通过 2步骤的hash生成结果,需要按照单词的权重形成加权数字串,比如“美国”的hash值为“100101”,通过加权计算为“4 -4 -4 4 -4 4”;“51区”的hash值为“101011”,通过加权计算为 “ 5 -5 5 -5 5 5”。
  • 4、合并,把上面各个单词算出来的序列值累加,变成只有一个序列串。比如 “美国”的 “4 -4 -4 4 -4 4”,“51区”的 “ 5 -5 5 -5 5 5”, 把每一位进行累加, “4+5 -4+-5 -4+5 4+-5 -4+5 4+5” ==》 “9 -9 1 -1 1 9”。这里作为示例只算了两个单词的,真实计算需要把所有单词的序列串累加。
  • 5、降维,把4步算出来的 “9 -9 1 -1 1 9” 变成 0 1 串,形成我们最终的simhash签名。 如果每一位大于0 记为 1,小于0 记为 0。最后算出结果为:“1 0 1 0 1 1”。
  • 整个过程的流程图为:

764050-20160220122034206-345045199.png


4. SimHash签名距离计算
  我们把库里的文本都转换为simhash签名,并转换为long类型存储,空间大大减少。现在我们虽然解决了空间,但是如何计算两个simhash的相似度呢?难道是比较两个simhash的01有多少个不同吗?对的,其实也就是这样,我们通过海明距离(Hamming distance)就可以计算出两个simhash到底相似不相似。两个simhash对应二进制(01串)取值不同的数量称为这两个simhash的海明距离。举例如下: 1010100110 从第一位开始依次有第一位、第四、第五位不同,则海明距离为3。对于二进制字符串的a和b,海明距离为等于在a XOR b运算结果中1的个数(普遍算法)。
5. SimHash存储和索引
  经过simhash映射以后,我们得到了每个文本内容对应的simhash签名,而且也确定了利用汉明距离来进行相似度的衡量。那剩下的工作就是两两计算我们得到的simhash签名的汉明距离了,这在理论上是完全没问题的,但是考虑到我们的数据是海量的这一特点,我们是否应该考虑使用一些更具效率的存储呢?其实SimHash算法输出的simhash签名可以为我们很好建立索引,从而大大减少索引的时间,那到底怎么实现呢?
  这时候大家有没有想到hashmap呢,一种理论上具有O(1)复杂度的查找数据结构。我们要查找一个key值时,通过传入一个key就可以很快的返回一个value,这个号称查找速度最快的数据结构是如何实现的呢?看下hashmap的内部结构:

764050-20160220134006238-717732611.png
如果我们需要得到key对应的value,需要经过这些计算,传入key,计算key的hashcode,得到7的位置;发现7位置对应的value还有好几个,就通过链表查找,直到找到v72。其实通过这么分析,如果我们的hashcode设置的不够好,hashmap的效率也不见得高。借鉴这个算法,来设计我们的simhash查找。通过顺序查找肯定是不行的,能否像hashmap一样先通过键值对的方式减少顺序比较的次数。看下图:
764050-20160220134028128-1522804689.png
存储
  1、将一个64位的simhash签名拆分成4个16位的二进制码。(图上红色的16位)
  2、分别拿着4个16位二进制码查找当前对应位置上是否有元素。(放大后的16位)
  3、对应位置没有元素,直接追加到链表上;对应位置有则直接追加到链表尾端。(图上的 S1 — SN)
  查找
  1、将需要比较的simhash签名拆分成4个16位的二进制码。
  2、分别拿着4个16位二进制码每一个去查找simhash集合对应位置上是否有元素。
  3、如果有元素,则把链表拿出来顺序查找比较,直到simhash小于一定大小的值,整个过程完成。
  原理
  借鉴hashmap算法找出可以hash的key值,因为我们使用的simhash是局部敏感哈希,这个算法的特点是只要相似的字符串只有个别的位数是有差别变化。那这样我们可以推断两个相似的文本,至少有16位的simhash是一样的。具体选择16位、8位、4位,大家根据自己的数据测试选择,虽然比较的位数越小越精准,但是空间会变大。分为4个16位段的存储空间是单独simhash存储空间的4倍。之前算出5000w数据是 382 Mb,扩大4倍1.5G左右,还可以接受

6. SimHash存储和索引
  1. 当文本内容较长时,使用SimHash准确率很高,SimHash处理短文本内容准确率往往不能得到保证;
  2. 文本内容中每个term对应的权重如何确定要根据实际的项目需求,一般是可以使用IDF权重来进行计算。
7. 参考内容8. 实现(附带2015年新闻语料库)
1.查重设置
你可以设置文章切分成一句一句话,也可以大概每30字符切分一次,(论文一般取13个字)
最大汉明距离取3,为大数据实验结果值。
性能选择:高效模式,只要判断重复即可返回。精准模式,检索所有重复结果,并取最大相似度的那一分段。

QQ截图20230316155400.png

2.使用效果。黄色为中等相似度,红色为高相似度。下图为每30字符对比结果。数据库已加载1万新闻语料库。上图右侧是每一句话的重复出处,因为要展示效果,所以复制了这个文章,并修改了一下。
QQ截图20230316143949.png
3.生成分析。暂未实现完。下次更新附上生成论文查重详细报表。应该是用内存画板画出来。
下图展示了句子相似度分布图。采用内存画板实现。但是可能和分词模块冲突了,所以我用另外一个程序写出来了,然后特别粗糙的调用的,但效果丝毫不影响。

QQ截图20230316174552.png

4.源码
码字不易,来点好评回血,支持作者继续更新

回复可见
https://share.weiyun.com/w9YVwiPM





补充内容 (2023-12-31 14:28):
最新帖:1.04

https://bbs.125.la/thread-14807724-1-1.html

点评

旧版本删掉了,置顶帖是最新的源码   广东省广州市  发表于 2023-7-11 14:32
进我的收藏夹吃灰吧   广东省佛山市  发表于 2023-3-18 17:42
https://bbs.125.la/thread-14767988-1-1.html   江西省南昌市  发表于 2023-3-18 16:04
为什么上不了精华,大哥们投个票助我一把   江西省南昌市  发表于 2023-3-18 15:43
主程序更新1.01,在置顶帖   江西省南昌市  发表于 2023-3-16 23:52
给分段1-4加索引速度会快点,但是会加大内存,想降低内存可以不存储句子内容,只存储句子序号   江西省南昌市  发表于 2023-3-16 23:44

评分

参与人数 48好评 +20 精币 +63 收起 理由
聿聿 + 1 感谢分享,很给力!~
3266167 + 1 感谢分享,很给力!~
qweipuq + 1 感谢分享,很给力!~
t176 + 1 感谢分享,很给力!~
风雨3137 + 1 感谢分享,很给力!~
望尘莫及 + 1 感谢分享,很给力!~
Zźh926 + 1 感谢分享,很给力!~
keyi5566 + 1 感谢分享,很给力!~
1828902364 + 1 感谢分享,很给力!~
YzZA + 1 感谢分享,很给力!~
周晓宇 + 1 奉上小小红包希望笑纳
司徒西 + 1 + 2 支持开源~!感谢分享
qq73s5456 + 1 (114200)分享资源已经删除
denz2008 + 1 + 2 新技能已get√
qq40962060 + 1 + 2 支持开源~!感谢分享
cbl521ysys + 1 感谢分享,很给力!~
VR非凡 + 1 感谢分享,很给力!~
hhhql + 1 感谢分享,很给力!~
三克油 + 1 + 2 YYDS~!
A9952 + 1 + 2 开源精神必须支持~
云韵 + 1 + 1 支持开源~!感谢分享
龍宵九天 + 1 感谢分享,很给力!~
钱多多28 + 1 + 2 干货,多谢分享
llxx123 + 1 + 2 tql
orjg + 1 开源精神必须支持~
难解 + 1 + 3 YYDS~!
微风已过 + 1 感谢分享,很给力!~
qiyuer + 1 感谢分享,很给力!~
※逍遥游※ + 1 感谢分享,很给力!~
Arui + 1 感谢分享,很给力!~
国王软件 + 1 + 2 YYDS~!
mypursue + 1 感谢分享,很给力!~
飘在空气里 + 1 YYDS~!
默念、 + 1 + 1 YYDS~!
无尘666 + 1 感谢分享,很给力!~
pj小黑屋 + 1 感谢分享,很给力!~
XXGL2005 + 1 感谢分享,很给力!~
flyk + 1 感谢分享,很给力!~
ican8 + 1 感谢分享,很给力!~
远赴 + 1 + 2 新技能已get√
mumulu + 1 感谢分享,很给力!~
dwcq + 1 + 2 看着好专业的样子,顶顶顶
梦想ol + 1 + 2 支持开源~!感谢分享
冰点 + 1 + 5 感谢发布原创作品,精易因你更精彩!
完玩 + 1 + 2 你他娘真是个人才
半辈子 + 1 + 1 厉害!
光影魔术 + 1 支持开源~!感谢分享
quary + 1 支持开源~!感谢分享

查看全部评分


本帖被以下淘专辑推荐:

结帖率:100% (47/47)

签到天数: 26 天

 楼主| 发表于 2023-12-31 14:29:01 | 显示全部楼层   江西省赣州市
最新帖2024新版本  1.04
https://bbs.125.la/thread-14807724-1-1.html
回复 支持 反对

使用道具 举报

结帖率:75% (6/8)

签到天数: 14 天

发表于 2024-4-16 14:17:10 | 显示全部楼层   河北省保定市
66666666666666666
回复 支持 反对

使用道具 举报

结帖率:78% (7/9)

签到天数: 25 天

发表于 2024-3-8 08:11:13 | 显示全部楼层   福建省泉州市
学习学习
回复 支持 反对

使用道具 举报

签到天数: 3 天

发表于 2024-3-3 13:03:01 | 显示全部楼层   广东省湛江市
支持支持支持支持支持支持支持支持
回复 支持 反对

使用道具 举报

发表于 2024-2-28 18:44:27 | 显示全部楼层   重庆市重庆市
座上第一排,永远跟博主走
回复 支持 反对

使用道具 举报

结帖率:82% (9/11)

签到天数: 8 天

发表于 2024-2-10 00:19:14 | 显示全部楼层   辽宁省大连市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:82% (9/11)

签到天数: 8 天

发表于 2024-1-31 08:46:29 | 显示全部楼层   辽宁省大连市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:82% (9/11)

签到天数: 8 天

发表于 2024-1-26 08:33:57 | 显示全部楼层   辽宁省大连市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:82% (9/11)

签到天数: 8 天

发表于 2024-1-25 08:49:22 | 显示全部楼层   辽宁省大连市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)

签到天数: 9 天

发表于 2024-1-23 13:53:55 | 显示全部楼层   江苏省南京市
感谢大佬分享
回复 支持 反对

使用道具 举报

签到天数: 3 天

发表于 2024-1-22 19:28:27 | 显示全部楼层   重庆市重庆市
111111111111111111111111111
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表