最近针对爬虫爬下来的新闻进行去重。这个去重要考虑很多方面:

  • 不同网站发布的要点新闻,基本上是有通稿的,内容大同小异,基本一致,有些细节不同,需要去掉重复的,保留质量最好的。
  • 去重对比的时间跨度是多大呢?可能刚开始我们会考虑搜索整个库,每篇文章都对比,但是这样会效率太差了,没有必要。新闻有发布时间,以新闻发布时间前后一周为时间段, 对比这个时间段内的新闻即可。
  • 发布的新闻可能有很类似的,例如一个新闻是另外一个新闻的简述版,需要去掉简述版的。
  • 有些同样事件的新闻编辑不一样,写的文字不一样但是讲的是同一件事,这个也最好剔除掉(这种的新闻可能比较少,资讯比较多)

对于前两点需求,基本上在线去重就可以解决。后两种需求,需要更仔细严谨的分析算法(例如建立初始语料库训练word2vec进行进一步主成分分析等等),一般是离线方式实现。这个在之后会详细讲解。

本方案将基于在线和离线两种实现方式。先说说在线方式,基于的技术主要是:Levenshtein距离(编辑距离)和SimHash算法。

Levenshtein距离

莱文斯坦距离,又称Levenshtein距离,是编辑距离的一种。指两个字串之间,由一个转成另一个所需的最少编辑操作次数。允许的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

例如将whale转成whatif:

  1. whate (l→t)
  2. whati (e→i)
  3. whatif (+f)

距离为3

Levenshtein距离算法比较简单并且在字符串比较小的时候比较高效,算法基本思路是:

假设m为词1的字符长度,n为词2的字符长度:

  1. 构造 行数为m+1 列数为 n+1 的矩阵 , 用来保存完成某个转换需要执行的操作的次数,将串s[1…n] 转换到 串t[1…m] 所需要执行的操作次数为matrix[n][m]的值;

  2. 初始化matrix第一行为0到n,第一列为0到m。

  3. Matrix[0][j]表示第1行第j-1列的值,这个值表示将串s[1…0]转换为t[1…j]所需要执行的操作的次数,很显然将一个空串转换为一个长度为j的串,只需要j次的add操作,所以matrix[0][j]的值应该是j,其他值以此类推。

  4. 检查每个从1到n的s[i]字符;

  5. 检查每个从1到m的s[i]字符;

  6. 将串s和串t的每一个字符进行两两比较,如果相等,则让cost为0,如果不等,则让cost为1(这个cost后面会用到);

    a. 如果我们可以在k个操作里面将s[1…i-1]转换为t[1…j],那么我们就可以将s[i]移除,然后再做这k个操作,所以总共需要k+1个操作。

    b. 如果我们可以在k个操作内将 s[1…i] 转换为 t[1…j-1] ,也就是说d[i,j-1]=k,那么我们就可以将 t[j] 加上s[1…i],这样总共就需要k+1个操作。

    c. 如果我们可以在k个步骤里面将 s[1…i-1] 转换为 t [1…j-1],那么我们就可以将s[i]转换为 t[j],使得满足s[1…i] == t[1…j],这样总共也需要k+1个操作。(这里加上cost,是因为如果s[i]刚好等于t[j],那么就不需要再做替换操作,即可满足,如果不等,则需要再做一次替换操作,那么就需要k+1次操作)

因为我们要取得最小操作的个数,所以我们最后还需要将这三种情况的操作个数进行比较,取最小值作为d[i,j]的值;然后重复执行4,5,6,最后的结果就在d[n,m]中;

拿刚才的例子图示:



Levenshtein距离优缺点分析

通过Levenshtein距离/文档长度这个比值评估是否相似。
Levenshtein距离优势很明显,简单快速。
缺点就是,字符串比较长的时候,占用空间比较大(N*M的数组),高并发时会吃掉很多内存。针对长一点的新闻,需要用其他方式。

SimHash

论文地址:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.473.7179&rep=rep1&type=pdf

SimHash广为人知,大概流程就是:

  1. 分词:根据语料库进行分词,对于英语,最好分成词组。例如这句话:
    Information technology is the use of computers to store, retrieve, transmit, and manipulate data. 最好就分成:“Information technology”, “is”, “the”, “use”, “of”, “computers”, “to”, “store”, “retrieve”, “transmit”, “and”, “manipulate”, “data”. 然后,需要你针对每个词按照你想侧重的规定权重,一般的可以取tfidf值为权重,或者出现次数。如果取出现次数为权重,最好去掉所有停止词,因为停止词出现频率还是很高的,将这个干扰去掉。假设分词结果为"Information technology"(5), “use”(1), “computers”(4), store"(1), “retrieve”(1), “transmit”(1), manipulate"(1), “data”(2).

  2. hash:通过hash函数计算各个特征向量的hash值,hash值为二进制数01组成的n-bit签名。比如"Information technology"的哈希值为1001001,"computers"哈希值为1010101。

  3. 加权:在hash值的基础上,给所有特征向量进行加权,即W = Hash * weight,且遇到1则hash值和权值正相乘,遇到0则hash值和权值负相乘,即1001001 —> 1 -1 -1 1 -1 -1 1 * 5 —> 5 -5 -5 5 -5 -5 5, 1010101 —> 1 -1 1 -1 1 -1 1 * 4 —> 4 -4 4 -4 4 -4 4

  4. 合并: 5 -5 -5 5 -5 -5 5 与 4 -4 4 -4 4 -4 4 按位相加,9 -9 -1 1 -1 -9 9

  5. 降维:如果大于0则置1,否则置0,从而得到该语句的simhash值:9 -9 -1 1 -1 -9 —> 1001001

得到两篇新闻的simhash之后,计算海明距离。一般的,对于64位simhash,距离小于等于3的即为相似。

simHash优缺点分析

非常省内存空间,只是计算哈希值和汉明距离;比较消耗CPU,相对于Levenshtein距离更费时。适用于比较长一点的文章,对于比较短的文章,差异过于敏感。网上一般说需要500词以上,对于我这边的英语新闻,一般在去掉停止词,词组划分之后100~200词以上的利用simHash并且距离为3的就比较准确了。

方案落地

我们初步考虑采用短文章Levenshtein距离 + 长文章SimHash海明距离来去重。

Levenshtein距离+SimHash海明距离共同的局限性分析

首先,Levenshtein距离和SimHash海明距离都是针对两个新闻进行对比是否相似。没办法直接判断,一篇文章是否在某一集合中存在与他相似的。也就是说,对于任何一篇文章,我们都要和目前库里面的每篇文章进行Levenshtein距离计算和SimHash海明距离计算。这样显然对于在线方案来说是不能接受的。

SimHash分块存储

针对新闻业务呢,每篇新闻有发布时间,可以只取一段时间内的新闻。但是随着频道的增多,总会达到一个不能接受的量级,必须得需要一个更细致区分的方案。

回顾一下SimHash海明距离方案:针对64位的simHash值,如果海明距离小于等于3,那么就可以认为相似。那么,对于一篇新闻A,如果库中有相似的新闻B,那么A的simHash值的64位里面至少有16位和B相同(海明距离是两个哈希值不同值位的个数,海明距离为3就是两个哈希值之间有三位不同,如果把64位平均分成4块每块16位,最坏的情况是这3位分布在不同的3块,还是至少有一块是完全一样的)。利用这个特性,我们可以这么存储新闻:

News:id,simhash(完整的simhash),simhash-A(simhash前16位),simhash-B(simhash17-32位),simhash-C(simhash33-48位),simhash-D(simhash49-64位),content(文章内容)

搜寻的时候,按照如下算法:

计算新闻simhash,设为sh, 前16位为sh-a,以此类推
如果存在simhash为sh的news:return 新闻相似
并行执行:1. 寻找simhash-A为sh-a的所有文章存入集合A2. 寻找simhash-B为sh-b的所有文章存入集合A3. 寻找simhash-C为sh-c的所有文章存入集合A4. 寻找simhash-D为sh-d的所有文章存入集合A
对于集合A中的每篇文章的simHash与sh计算海明距离

短文章补充冗余词

上面针对长文章的simhash方案搞定了,对于短文章还是得检索所有的(利用长度+时间检索)。

我们可以考虑,将短新闻补充冗余词,例如“test test test” 这样的,补充到长度为100~200以上,这样就可以用simHash判断是否可能有相似的文章,再把这些文章搜出来,利用content计算Levenshtein距离,这样也是通过上面simHash分块减少检索与计算量

其他未来可行的方案

我还查询了一些其他方式,例如

分层布隆过滤器论文地址:https://arxiv.org/pdf/1712.04544.pdf

github地址:https://github.com/ishnid/mrsh-hbft


利用分块思想,类似于ConcurrentHashMap的锁,将BloomFilter分布下去,BloomFilter本来是个空间换取时间的思想,这里用更多的空间来减少检索和计算。

如果未来有更成熟的实现,可能会考虑用,有精力我也想实现个,哈哈。

大数据级新闻去重实现 - 1.在线实时方案相关推荐

  1. 行业应用 | 大数据对新闻传播的影响 大数据

    在科学技术日新月异的时代中,数据与媒体行业间的联系也日益紧凑,计算机设备在社会各个行业中得到广泛应用,并使信息处理方式发生一定变动,使各类新闻数据信息的采集.梳理与分析效率均有不同程度的提升,强化信息 ...

  2. 某县大数据资源平台建设项目可行性研究报告暨建设方案

    某县大数据资源平台建设项目可行性研究报告暨建设方案 一.项目概述 1.1.项目名称 县大数据资源平台建设项目 1.2.项目建设单位 某县大数据发展管理局 编制单位 编制依据 <国家信息化领导小组 ...

  3. 如何基于大数据及AI平台实现业务系统实时化?

    简介: 后疫情时代的新社会模式及经济形态必将催生出新的商业模式,在线业务及相关应用场景的流量呈现井喷式发展,常规的离线系统及离线机器学习平台已无法满足业务发展要求. 作者:高旸(吾与),阿里巴巴高级技 ...

  4. 利用大数据风控教你全栈式实时反欺诈

    "很久没有碰到这么大的漏洞了,你们继续,我睡了." 2019年1月20日凌晨1点半,在某"羊毛党"聚集的电报(Telegram,一款社交APP)群里,一位圈内& ...

  5. 运营商精准大数据获客 网站APP访客实时截流

    企业想要获得精准客户线索的问题主要表现为两个方面,一是目标人群不够精准;二是轻视用户画像.因此,精准获客成败的前提是,是否有足够精确的"用户画像"来做支撑.因此企业解决精准获客这两 ...

  6. 突破传统—复旦大学大数据学院张力课题组提出语义分割全新方案

    突破传统--复旦大学大数据学院张力课题组提出语义分割全新解决方案,论文已被CVPR2021收录. 论文名称:Rethinking Semantic Segmentation from a Sequen ...

  7. 消防隐患同比下降约60%,基于物联网大数据的智慧消防水系统远程监测方案

    近十年全国共发生高层建筑火灾3.1万起,死亡474人,直接财产损失15.6亿元.其中,特别重大火灾3起.重大火灾4起.较大火灾24起,形势非常严峻.消防给水系统完善与否直接影响火灾扑救的效果,据火灾统 ...

  8. 651页23万字智慧教育大数据信息化顶层设计及智慧应用建设方案

    目录 一. 方案背景 1.1 以教育现代化支撑国家现代化 1.2 教育信息化是教育现代化重要内容和标志 1.3 大数据驱动教育信息化发展 1.4 政策指导大数据推动教育变革 1.5 教育大数据应用生态 ...

  9. 毕业设计-基于大数据的新闻推荐系统-python

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言

最新文章

  1. Liunx 查看硬件信息
  2. 陕西宝鸡2021年高考成绩查询,2021年宝鸡网上查询中考成绩
  3. hdu 2563
  4. 产品功能上线前,如何高效的埋点?
  5. python进阶08并发之四map, apply, map_async, apply_async差异
  6. kubernetes视频教程笔记 (36)-部署 prometheus granfana
  7. 阶段3 2.Spring_03.Spring的 IOC 和 DI_11 set方法注入
  8. 485通讯的校验和_台达PLC和昆仑通态触摸屏通讯设置
  9. Spring MVC学习(6)—Spring数据类型转换机制全解【一万字】
  10. c语言质因数分解算法蓝桥杯,【算法】 蓝桥杯 基础练习 分解质因数
  11. 医院病房监护系统和图书管理系统数据流图
  12. c盘空间清理,无需软件
  13. 他本硕博连跨3大专业,毕业后没多久被破格聘为985高校教授!
  14. 把这一群人称为“知识分子”,实在有一点勉强
  15. 2021年中国化学纤维行业发展现状分析,循环再利用或为产品未来发展方向「图」
  16. python读取excel画出饼状图_python操作Excel、openpyxl 之图表,折线图、饼图、柱状图等...
  17. iframe相关,iframe样式
  18. 计算机科学与技术论文摘要范文,计算机科学与技术论文范文两篇(2)
  19. 世纪互联数据中心有限公司
  20. Dcoker安装mysql

热门文章

  1. c51语言1秒延时程序,KeilC51程序设计中几种精确延时方法
  2. TCGA 临床数据 表型 phenotype 各列的含义
  3. 论文翻译:双端通话频域回声消除中学习速率的调整
  4. java单步跳入单步跳过_Eclipse 单步调试
  5. dell服务器显示器接口在哪里,【Dell S2719H 显示器使用总结】安装|接口|边框|背板_摘要频道_什么值得买...
  6. wallpaper engine怎么用?
  7. SDN环境搭建和基本功能验证
  8. SCI和SCIE, EI, ISTP 等数据库
  9. Mysql-mmm高可用集群(有mysql环境)
  10. 射击选手得分的排序问题