当前位置: 首页 > news >正文

python文字识别算法_使用Python检测文章抄袭及去重算法原理解析

在互联网出现之前,“抄”很不方便,一是“源”少,而是发布渠道少;而在互联网出现之后,“抄”变得很简单,铺天盖地的“源”源源不断,发布渠道也数不胜数,博客论坛甚至是自建网站,而爬虫还可以让“抄”完全自动化不费劲。这就导致了互联网上的“文章”重复性很高。这里的“文章”只新闻、博客等文字占据绝大部分内容的网页。

2019061411511363.jpg

中文新闻网站的“转载”(其实就是抄)现象非常严重,这种“转载”几乎是全文照抄,或改下标题,或是改下编辑姓名,或是文字个别字修改。所以,对新闻网页的去重很有必要。

一、去重算法原理

文章去重(或叫网页去重)是根据文章(或网页)的文字内容来判断多个文章之间是否重复。这是爬虫爬取大量的文本行网页(新闻网页、博客网页等)后要进行的非常重要的一项操作,也是搜索引擎非常关心的一个问题。搜索引擎中抓取的网页是海量的,海量文本的去重算法也出现了很多,比如minihash, simhash等等。

在工程实践中,对simhash使用了很长一段时间,有些缺点,一是算法比较复杂、效率较差;二是准确率一般。

网上也流传着百度采用的一种方法,用文章最长句子的hash值作为文章的标识,hash相同的文章(网页)就认为其内容一样,是重复的文章(网页)。

这个所谓的“百度算法”对工程很友好,但是实际中还是会有很多问题。中文网页的一大特点就是“天下文章一大抄”,各种博文、新闻几乎一字不改或稍作修改就被网站发表了。这个特点,很适合这个“百度算法”。但是,实际中个别字的修改,会导致被转载的最长的那句话不一样,从而其hash值也不一样了,最终结果是,准确率很高,召回率较低。

为了解决这个问题,我提出了nshash(top-n longest sentences hash)算法,即:取文章的最长n句话(实践下来,n=5效果不错)分别做hash值,这n个hash值作为文章的指纹,就像是人的5个手指的指纹,每个指纹都可以唯一确认文章的唯一性。这是对“百度算法”的延伸,准确率还是很高,但是召回率大大提高,原先一个指纹来确定,现在有n个指纹来招回了。

二、算法实现

该算法的原理简单,实现起来也不难。比较复杂一点的是对于一篇文章(网页)返回一个similar_id,只要该ID相同则文章相似,通过groupby similar_id即可达到去重目的。

为了记录文章指纹和similar_id的关系,我们需要一个key-value数据库,本算法实现了内存和硬盘两种key-value数据库类来记录这种关系:

HashDBLeveldb 类:基于leveldb实现, 可用于海量文本的去重;

HashDBMemory 类:基于Python的dict实现,可用于中等数量(只要Python的dict不报内存错误)的文本去重。

这两个类都具有get()和put()两个方法,如果你想用Redis或MySQL等其它数据库来实现HashDB,可以参照这两个类的实现进行实现。

2019061411511364.jpg

2019061411511465.jpg

HashDBLeveldb类的实现

2019061411511566.jpg

2019061411511567.jpg

HashDBMemory类的实现

从效率上看,肯定是HashDBMemory速度更快。利用nshash对17400篇新闻网页内容的测试结果如下:

HashDBLeveldb: 耗时2.47秒; HashDBMemory: 耗时1.6秒;

具体测试代码请看 example/test.py。

有了这两个类,就可以实现nshash的核心算法了。

首先,对文本进行分句,以句号、感叹号、问号、换行符作为句子的结尾标识,一个正在表达式就可以分好句了。

其次,挑选最长的n句话,分别进行hash计算。hash函数可以用Python自带模块hashlib中的md5, sha等等,也可以用我在爬虫教程中多次提到的farmhash。

最后,我们需要根据这n个hash值给文本内容一个similar_id,通过上面两种HashDB的类的任意一种都可以比较容易实现。其原理就是,similar_id从0开始,从HashDB中查找这n个hash值是否有对应的similar_id,如果有就返回这个对应的similar_id;如果没有,就让当前similar_id加1作为这n个hash值对应的similar_id,将这种对应关系存入HashDB,并返回该similar_id即可。

这个算法实现为NSHash类:

2019061411511668.jpg

2019061411511669.jpg

NSHash类的实现

三、使用方法

import nshash

nsh = nshash.NSHash(name='test', hashfunc='farmhash', hashdb='memory')

similar_id = nsh.get_similar(doc_text)

NSHash 类有三个参数:

name : 用于hashdb保存到硬盘的文件名,如果hashdb是HashDBMemory, 则用pickle序列化到硬盘;如果是HashDBLeveldb,则leveldb目录名为:name+'.hashdb'。name按需随便起即可。

hashfunc : 计算hash值的具体函数类别,目前实现两种类型: md5 和 farmhash 。默认是 md5 ,方便Windows上安装farmhash不方便。

hashdb :默认是 memory 即选择HashDBMemory,否则是HashDBLeveldb。

至于如何利用similar_id进行海量文本的去重,这要结合你如何存储、索引这些海量文本。可参考example/test.py文件。这个test是对excel中保存的新闻网页进行去重的例子。

总结

以上所述是小编给大家介绍的使用Python检测文章抄袭及去重算法原理解析 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

本文标题: 使用Python检测文章抄袭及去重算法原理解析

本文地址: http://www.cppcns.com/jiaoben/python/262294.html

相关文章:

  • python代码图片头像_Python图片裁剪实例代码(如头像裁剪)
  • python视频转换字符动画_视频转字符动画
  • python的requests模块功能_Python中requests模块的核心使用(上)
  • python分块处理功能_在python3下对数据分块(8x8大小)使用OpenCV的离散余弦变换DCT
  • mlp神经网络_PyTorch可视化理解卷积神经网络
  • python word处理_用python处理MS Word的实例
  • python安装成功是什么样的图片_python 图像处理(从安装Pillow开始)
  • python求最大素数_Python实现求最大公约数及判断素数的方法
  • java assert使用场景_Java基础:详解equals
  • vs code 如何版本控制_codeserver 是如何把 vscode 搬到浏览器的
  • work节点使用外部包_unity DOTS中的JobComponentSystem使用介绍
  • python控制手机自动刷新闻_如何使用python控制手机(以微信游戏跳一跳为例)
  • 在线编译python的_python在线编译器的简单原理及简单实现代码
  • springboot 拦截器 favicon.ico 404_基于Spring Boot的RESTful API项目种子参考(骨架)
  • sessionid会重复吗_springboot2.2.X手册:分布式系统下,重复提交的解决方案
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JS字符串转数字方法总结
  • Netty源码解析1-Buffer
  • PhantomJS 安装
  • PHP那些事儿
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Python中eval与exec的使用及区别
  • SegmentFault 2015 Top Rank
  • SpiderData 2019年2月16日 DApp数据排行榜
  • WebSocket使用
  • 安装python包到指定虚拟环境
  • 系统认识JavaScript正则表达式
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 容器镜像
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​学习一下,什么是预包装食品?​
  • # 透过事物看本质的能力怎么培养?
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • $.each()与$(selector).each()
  • (C#)获取字符编码的类
  • (floyd+补集) poj 3275
  • (Java数据结构)ArrayList
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)详解PHP处理密码的几种方式
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .Net中ListT 泛型转成DataTable、DataSet
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • @Autowired注解的实现原理
  • [<死锁专题>]
  • [1] 平面(Plane)图形的生成算法
  • [autojs]逍遥模拟器和vscode对接
  • [BZOJ4016][FJOI2014]最短路径树问题
  • [C++] 统计程序耗时