文本在线查重(Online Copy Detection)的实现

文本在线查重(Online Copy Detection)的实现

1 概述

1.1 需求

给定一段文本,需要返回其和网络开放性数据相比的整体重复率以及具体的重复情况(具体重复的句子/字符串以及重复程度)。

1.2 问题分析

该问题属于copy-detection领域。

由于需要给出查询文本具体重复的句子/字符串以及相应的重复程度,所以我们需要对查询文本进行合理的切分,并需要一一计算出切分后得到的字符串与在线开放互联网数据的相似内容和相似度。

该问题属于短文本相似性计算问题。需寻求短文本相似性计算方案。另外,对于计算规模,大体上一条300字的查询文本,可以被切分为10-20条短文本,对于每一条短文本,利用爬虫返回搜索引擎匹配的前20条结果(即20条长文本,切分后平均得到约为4000条短文本)。

在这里插入图片描述

系统的关键性能指标主要包括结果精度和计算速度。由上图可知,主要影响因素可概括为4点:查询文本切分策略、相似性度量算方法、爬虫自身性能、返回文本数的设置。

1.3 整体技术框架

在这里插入图片描述

2 爬虫设计

主要python包:requests+BeautifulSoup+jparser+url2io
其中jparser、url2io都用于网页文本正文提取,url2io准确率高,但不稳定,解析错误时则调用jparser。通过两者结合使用来提高正文提取的效果。
爬虫整体实现方法和代码放置于github:https://github.com/Neo-Luo/scrapy_baidu

3 查询文本切分策略

考虑到如下几个问题:

(1)百度搜索输入框中文字符的最大输入个数为:38。
(2)通用中文查重标准认为:连续重复字符数大于等于13属于抄袭。
(3)句意统一,字符串越长,百度搜索返回的结果往往和查询结果越匹配。

我们制定如下的查询文本切分策略:

  • 对于查询文本,首先以“,;。!?”为切分符进行切分,得到切分后的字符串集合。
  • 对于切分后的字符串,从前往后尽量组合,在组合后的字符串长度小于38的前提下,组合成的字符串长度越长越好。例如,如果s[i+1]+s[i]>s[i]且s[i+1]+s[i]<38,则将s[i+1]、s[i]两者组合成新的字符串。

具体实现代码如下:

def split_search(query_all):query_array = re.split(u"[,;。!?]", query_all.decode('utf-8'))if(len(query_array[-1])<5):query_array.pop(-1)flag = len(query_array)-1i = -1while (i<flag):i += 1if(i>flag-1):breakelif(len(query_array[i])<38):if(len(query_array[i])+len(query_array[i+1])>38):continueelse:query_array[i+1] = query_array[i] + query_array[i+1]query_array.pop(i)flag -= 1i -= 1else:continuereturn query_array

4 文本相似性计算

4.1 计算粒度

对于查询文本和搜索结果文本,皆以“,;。!?”为切分符。
对于切分后的字符串,从前往后组合成长度大于13的字符串,也就是使每一个用于计算的字符串都满足长度大于13。

def split_content_all(query_all):query_array = re.split(r"[,;。!?]", query_all)flag = len(query_array)-1for i in range(flag):if(i>flag-1):breakelif(len(query_array[i])>=13):continueelse:query_array[i+1] = query_array[i] + query_array[i+1]query_array.pop(i)flag -= 1return query_array

4.2 相似性度量算法

在介绍具体算法之前,我们先来了解一下有关copy-detection的知识。copy-detection主要用于检测文件或网页中相同的内容,判定是否存在拷贝、抄袭等行为以及程度。在下面的讨论中,我们将范围缩减到只考虑包含ASCII字符的文件,不考虑图片及视屏等内容。通常情况下,我们认为用于copy-detection的算法应该满足以下要求:

1、无视空白符(Whitespace insensitivity)。
在比较文件内容的过程中,我们通常不希望被空格、制表符、标点符号等影响我们判定的结果,因为它们并不是我们感兴趣的内容。在不同的应用下,我们感兴趣的内容会有些不同,比如在程序代码文件中,变量名通常是我们不感兴趣的。
2、噪音抑制(Noise suppression)。
主要是指应该排除一些可以接受的拷贝,比如成语、谚语、免责声明等,这些也不是我们感兴趣的。比如在程序代码文件中,你或许希望排除一些教师给定标程中的内容。
3、位置无关性(Position independence)。
在完全拷贝一份文件后,简单的将文件内容调换一下位置,仍然属于抄袭行为。位置无关性就反映了这么一种性质,粗粒度的位置调换不会影响最终的判定。更进一步说,从原文件中添加或者删除一段内容,不应该影响到其他部分的判断。

基于对问题的分析,我们选取了hash类算法(计算速度快)和字符串直接匹配算法(准确度高)进行了相应实验,下文将对各类算法的实现和实验结果进行阐述。

4.2.1 hash类算法

hash 算法的实质就是把数据映射成比较短的固定长度的散列值,从而提高存储效率或者是计算效率。
具体来说,Hash 算法就是把任意长度的输入,通过散列算法,变换成固定长度的输出。该输出就是散列值。这种转换是一种压缩映射,散列值的空间一般远小于输入的空间。 但是如果不同的数据通过hash 算法得到了相同的输出,这个就叫做碰撞,因此不可能从散列值来唯一确定输入值。
一个优秀的 hash 算法,满足:

正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
冲突避免:很难找到两段内容不同的明文,使得它们的 hash值一致(发生冲突)。即对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。

常见的hash算法包括如下几种:

  • winnowing算法
    具体原理和实现代码可参考博客:《【文本相似性计算】winnowing算法》。

  • simHash类算法
    具体原理和实现代码可参考博客:《【文本相似性计算】simHash算法》。

  • minHash类算法
    具体原理和实现代码可参考博客:《【文本相似性计算】minHash和LSH算法》。

4.2.2 字符串直接匹配算法

常见的字符串直接匹配算法有很多,例如欧几里得距离、余弦距离、最长公共子序列、编辑距离(levenshtein距离)、Jaccard相似性系数等。

各类算法的实现代码参考github:https://github.com/Neo-Luo/TextSimilarity

4.2.3 实验结果

我们比较了上述各类算法的结果准确率、召回率以及时间复杂度,所得结果如下:

模型准确度召回率时间复杂度
winnowing<60%<60%
simHash<60%<60%
minHash<60%<60%
minHash-LSH Forest70%-90%70%-90%
编辑距离>85%>85%
Jaccard系数>85%>85%

上述结果中:

  • simHash和minHash采用的个人源码实现,由于对短文本进行hash,尽管提高了计算速度,但冲撞率较高,模型精度和准确率较低,并不适用于我们的问题情境。
  • minHash-LSH Forest采用的是python包datasketch实现的,通过利用多个hash函数以及LSH中的概率统计原理,降低了冲撞,模型效果较好,但计算速度有所减慢。
  • 传统的字符串直接匹配算法在短文本相似性计算中,准确率较高,但计算速度慢。

结合现实需求,我们选取minHash-LSH Forest算法作为系统实现的算法。

4.3 整体相似度的评估

通过上述算法,我们可以得到查询文本中每一条字符串 q u e r y S t r i queryStr_i queryStri及其与开放互联网数据的重复度为 s i m R a t e i simRate_i simRatei
我们定义整个查询文本 q u e r y S t r queryStr queryStr与开放互联网数据的重复度 t o t a l S i m R a t e totalSimRate totalSimRate为:

t o t a l S i m R a t e = ∑ i = 0 n s i m R a t e i ∗ l e n ( q u e r y S t r i ) ∑ i = 0 n l e n ( q u e r y S t r i ) totalSimRate = \frac {\sum_{i=0}^n simRate_i \ast len(queryStr_i)} {\sum_{i=0}^n len(queryStr_i)} totalSimRate=i=0nlen(queryStri)i=0nsimRateilen(queryStri)

具体实现代码如下:

def cal_total_rate(final_res,query_all):score = 0for item in final_res['detail']:score += final_res['detail'][item]['dist'] * \len(final_res['detail'][item]['query_str'])final_res['total_rate'] = float(score) / float(len(query_all))return final_res

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/9412.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

查重系统,在线提交作业

查重系统&#xff0c;在线提交作业 后台代码和数据库源地址&#xff1a; https://gitee.com/aynuzbj/check-system.git 该系统使用SSM三层架构实现查重 文件上传&#xff0c;对各个数据库表的基本操作等 1、登录自己的GitHub账户&#xff0c;并创建一个与我的查重系统项目的项…

[ChatGPT 勘误] SAP UI5 的 sap.ui.base.Object

ChatGPT 对 SAP UI5 sap.ui.base.Object 作用的解答&#xff1a; 在SAP UI5中&#xff0c;sap.ui.base.Object是所有UI5对象的基础类。该类提供了一个通用的、灵活的基础框架&#xff0c;可用于构建SAP UI5应用程序。该类提供了许多方法和属性&#xff0c;包括但不限于以下内容…

从零实现Transformer的简易版与强大版:从300多行到3000多行

前言 最近一直在做类ChatGPT项目的部署 微调&#xff0c;关注比较多的是两个&#xff1a;一个LLaMA&#xff0c;一个ChatGLM&#xff0c;会发现有不少模型是基于这两个模型去做微调的&#xff0c;说到微调&#xff0c;那具体怎么微调呢&#xff0c;因此又详细了解了一下微调代…

机器人国内免费

该网站无需注册即可免费使用&#xff0c;大家打开网站即可使用&#xff0c;而且相应速度是目前我使用的这几款免费网站中最快的一个了&#xff0c;大家可以测试一下&#xff0c;回答的风格和chatGPT几乎无异。 网站链接&#xff1a;https://chat.forchange.cn/

Chat 插件上线,免注册即可使用~

OpenAI 新上线的 Chat 可谓是火爆出圈&#xff0c;这个语言对话模型可以回答问题&#xff0c;承认错误&#xff0c;挑战不正确的前提&#xff0c;还能帮你修改代码中的 bug…… Chat 的应用场景很广泛。它可以用于处理多种类型的对话&#xff0c;包括对话机器人、问答机器人和客…

高效创作助手:ChatGPT最新版实现批量撰写聚合文章的全新水平

随着人工智能技术的不断发展&#xff0c;ChatGPT最新版作为一款智能创作助手&#xff0c;实现了批量撰写聚合文章的全新水平。它能够在短时间内生成高质量的文章&#xff0c;极大地提高了创作效率。本文将从随机8-20个方面对ChatGPT最新版进行详细的阐述&#xff0c;让我们一起…

IntelliJ IDEA 的chatGPT插件 Bito

1、chatGPT爆火 最近你是否听说过“ChatGPT”这个词&#xff1f;它指的是一种基于深度学习技术的人工智能语言生成模型。自从2018年由OpenAI发布以来&#xff0c;ChatGPT就备受关注&#xff0c;甚至在2022年成为了全球最强AI模型之一。 2、chatGPT介绍 ChatGPT&#xff08;Gen…

从选题、创作、编辑、推广到优化,23个必用的内容营销工具

咱们做内容营销的&#xff0c;要懂营销懂产品&#xff0c;看得懂技术语言&#xff0c;写得了行业洞察&#xff0c;做出来的内容要有创意还要接地气&#xff0c;专业内容也不能落下&#xff0c;除了会写&#xff0c;还要会运营会设计会剪视频&#xff0c;简直就是全才嘛。 但是…

chatgpt赋能python:Python报错重新执行技巧

Python报错重新执行技巧 如果你在使用Python编程时&#xff0c;经常遇到报错的情况&#xff0c;特别是在大量数据处理或者复杂算法实现时&#xff0c;报错更是常态。那么&#xff0c;你是否不知道该如何处理这些报错信息&#xff0c;或者对于重新执行代码有一些不确定的想法&a…

GPT-4震撼来袭,ChatGPT已成过去?

背景 ChatGPT 点燃了科技行业的明灯&#xff0c;从他发布那天起&#xff0c; AI 下一步的发展已经成为最热门的话题之一&#xff0c;ChatGPT 是否已经是 AI 的一个突破&#xff1f;下一个大突破是否再等十年&#xff1f; 就在 2023年3月15日 凌晨&#xff0c;OpenAI 发布了多模…

ChatGpt入门指南:用提示词构建网站和应用

这个系列专题文章将教你如何使用OpenAI的GPT-4和Midjourney进行设计和编码。文章包括提示词、源代码、灵感、设计等内容。它非常适合初学者&#xff0c;即使对该领域没有什么了解也可以建立自己的应用程序&#xff08;0经验代码和设计也能上手&#xff09;。我会提供指导和入门…

别担心ChatGPT距离替代程序猿还有距离

经过多天对chat-GPT在工作的使用&#xff0c;我得出一个结论&#xff0c;它睁眼瞎说就算了&#xff0c;它还积极认错&#xff0c;绝不改正&#xff0c;错误答案极具误导性&#xff0c;啥也不说了&#xff0c;请看图。 经过N次较量它固执的认为 0011 1101 0110 0101在最高位是左…

Yann LeCun:不在乎社会规范,ChatGPT离真正的人还差得远

ChatGPT 虽能对答如流、花样百出&#xff0c;但离真正的人还差多远&#xff1f;深度学习三巨头之一的 Yann LeCun 等人撰文&#xff0c;对这一问题进行了深入探讨。 2022年底OpenAI推出ChatGPT&#xff0c;其爆火程度一直持续到今天&#xff0c;这个模型简直就是行走的流量&…

为何ChatGPT如此擅长编造故事?

“幻觉”——人工智能中的一个偏见性术语 AI聊天机器人(如OpenAI的ChatGPT)依赖于一种称为“大型语言模型”(LLM)的人工智能来生成它们的响应。LLM是一种计算机程序&#xff0c;经过数百万文本源的训练&#xff0c;可以阅读并生成“自然语言”文本语言&#xff0c;就像人类自然…

chatgpt赋能python:Python代码出错:常见的错误和如何避免它们

Python 代码出错&#xff1a;常见的错误和如何避免它们 在Python编程中&#xff0c;即使那些经验丰富的工程师也会遇到代码出错的情况。让我们一起探讨一下常见的Python代码错误以及如何避免它们。 代码缩进错误 Python是一种使用缩进来区分代码块的语言。如果缩进出现问题&…

真会玩:莫言用ChatGPT为余华写了一篇获奖词

5月16日&#xff0c;《收获》杂志65周年庆典暨新书发布活动在上海舞蹈中心举行。 典礼现场&#xff0c;余华凭借《文城》获得收获文学榜2021年长篇小说榜榜首。 作为老友&#xff0c;莫言在颁奖时故意卖了个关子&#xff1a;“这次获奖的是一个了不起的人物&#xff0c;当然了&…

《HelloGitHub》第 87 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 …

如何成为世界级软件公司

【CSDN 编者按】该文是指标管理与数据分析平台供应商Kyligence CEO 韩卿&#xff08;Luke&#xff09; 在公司6周年时撰写的全员信&#xff0c;就目前行业现状、未来行业竞争格局以及应对之道都有非常精彩的讨论&#xff0c;转发&#xff0c;以飨读者。 作者 | LukeKyligence …

让语言学习更简单的 WordFlow

作为一个英语并不是那么特别好的计算机专业学生&#xff0c;长期积累英语的学习对个人发展还是有意义的。简单来说&#xff0c;我在语言上最大的两个问题&#xff0c;一个自己「不理解」&#xff0c;另一个是自己「不会表达」。 上述两个问题主要体现在口语层面&#xff0c;而…

chatgpt赋能Python-pythonista免费

Pythonista - 一个强大的Python开发工具 Python是一种广泛使用的高级编程语言&#xff0c;它是一门易于学习&#xff0c;代码简洁&#xff0c;易于阅读和编写的语言。 Python具有许多强大的库和框架&#xff0c;可以轻松地处理各种任务。 Pythonista是一款专门为 iOS 设备开发…