Python实例:申报项目查重系统设计与实现

作者:白宁超

2017年5月18日17:51:37

摘要:关于查重系统很多人并不陌生,无论本科还是硕博毕业都不可避免涉及论文查重问题,这也对学术不正之风起到一定纠正作用。单位主要针对科技项目申报审核,传统的方式人力物力比较大,且伴随季度性的繁重工作,效率不高。基于此,单位觉得开发一款可以达到实用的智能查重系统。遍及网络文献,终未得到有价值的参考资料,这个也是自然。首先类似知网,paperpass这样的商业公司其毕业申报专利并进行保密,其他科研单位因发展需要也不会开源。笔者就结合NLP相关知识进行设计一款自主的查重系统,首先采用自然语言处理方法主要提出两个模型:科技项目查重的训练模型和科技项目查重的测试模型。其中训练模型主要对数据的清洗预处理及其规约化处理,测试系统也是主查重系统,对其查重原理和性能进行设计实现。最后将其封装成包,PHP或者Java等语言调用即可。(本文原创编著,转载注明出处:Python实例:申报项目查重系统设计与实现)

1 开发环境部署


硬件环境:普通台式机或者笔记本一台,可以正常连网,配置不作特别要求

软件环境:win7以上系统,本机采用WIN10 64位系统

开发环境:Sublime + Python3.5(Anaconda)

分词工具:先行的分词工具都可以,本文采用结巴分词

PHP调用环境:WampServer(php开发集成环境)

2 查重系统需要分析


背景:科技相关工作者通过计划项目管理平台进行项目申报,这个过程中存在涉嫌造假,修改本人以往项目等一系列违规操作。为了遏制这种现象,开发一款智能的项目查重系统必然不能或缺。

需求:低版本主要控制申报项目的标题和简介查重问题,实现对相似度较高的项目进行查重。用户提交申报项目后,自动审查是否存在违规行为。

解决:1 从服务器中导出今年真实的申报项目作为训练集(目前采用真实项目2400多个),通过对训练数据集的一系列数据清洗,然后进行语料库构建工作。2 采用文本相似度原理对测试文本进行建模,最后通过文本相似算法的实现,完成查重系统。3 PHP调用python查重文件,实现操作。

问题:1 真实语料规模有所限制,伴随语料扩大效果更好。2 文本相似度多种算法比较,包括:欧几里德距离、余弦定理、皮尔逊相关度、曼哈顿距离、Jaccard系数、gensim相似度等,改进版采用合适的相似度算法。3 对同义词、近义词、稀有词、核心词等权重问题的改进 4 后续改进针对整篇文章和主题识别

3 查重系统设计流程


本查重系统设计分为两大步骤:训练模型和测试模型。

训练模型:

1 首先从数据库中导出原始申报项目核心字段数据,其中subject代表项目课题名称,summary代表课题项目简介。

2 通过算法完成语料标记工作,具体算法原理和实现参见下文,效果如下图:

3 对数据进行预处理,其中包括正则匹配、文本分词、停用词处理、字符串操作、规约化数据等,处理后结果如下:

4 采用余弦相似度进行相似算法处理,最后识别结果如下:

5 PHP调用Python算法的运行结果:

当重复率大于阈值时:

当重复率小于阈值时:

4 科技项目查重训练模型


1 针对路径进行配置,其中源语料为datas.txt,标记处理后保存到同目录下的flagdatas.txt中

2 对原始语料进行标记和简单清洗,之所以采用标记,一方面便于序列化展示,另一方面区分项目名称和简介。

3 保存标记后的语料并统计处理结果

4 对标记数据进行分词处理。本文采用的结巴分词,分词后可以采用两种情况的处理,其一是不带词性标记的处理方式,直接将分词结果与停用词词典进行比对,去除停用词。其二是采用带有词性标注的分词结果,我们然后采用词典和去除词性的方式进行预处理,其中诸如虚词,助词等可以根据业务需求去除。而相对于名词、动词等主要词性,可以通过增加权重的方式进行处理。最终保村分词结果。作为训练语料库即对比语料库。

具体预处理源码如下:

    # 1 针对语料路径进行配置path="../CheckRepeat/database/OrigCorpus/datas.txt" # 训练语料库flagpath="../CheckRepeat/database/OrigCorpus/flagdatas.txt" # 语料标记# 2 对原始语料进行标记和简单清洗listset="" # 标记后的语料集合i,j=1,1with open(path,'r',encoding='utf-8') as f:for rline in f.readlines():line = rline.strip().replace(" ","")if "summary" in line :listset +="\n"+str(i)+"_"+linei+=1 # 简介打标签elif "subject" not in line:listset +=lineelif "subject" in line:listset +="\n"+str(j)+"_"+linej+=1 # 项目题目打标签# 3 保存标记后语料并统计标记结果with open(flagpath,'w',encoding='utf-8') as f1:f1.write(listset.strip())print("="*70)print("项目共计标题:"+str(len(listset.split("subject"))-1))print("项目共计简介:"+str(len(listset.split("summary"))-1))print("-"*70)# 4 对标记数据进行分词处理cutpath="../CheckRepeat/database/OrigCorpus/cutdatas.txt" # 保存分词后的结果cutword(flagpath,cutpath)

其执行2405条数据的性能如下:具体分析发现启动分词工具耗时1.2秒左右,其余耗时量主要是停用词比对时,两个矩阵计算造成的,这个问题可以通过算法改进,缩短耗时。

5 科技项目查重实现(测试)系统


1 接收项目文件(项目名称/项目简介)进行预处理操作,其实这个过程跟模型训练时的预处理算法是一致的。

2 将训练阶段处理后的数据进行处理,分割出项目名称/项目简介,分布存放在两个list中。

3 判断参数是否为空,如果不为空将对应的参数放入验证查重结果。

4 以测试数据和训练的每条数据的词项构建文本向量,通过文本向量的夹角即判断文本相似度,并反馈出结果。本文采用的是python自带的difflib模块进行处理,difflib是python提供的比较序列(string list)差异的模块。实现了三个类:1>SequenceMatcher 任意类型序列的比较 (可以比较字符串)2>Differ 对字符串进行比较3>HtmlDiff 将比较结果输出为html格式.理由是其相对比较成熟,本项目的处理量并不大。倘若处理G级或P级规模的数据,可以考虑使用google的gensim相似度算法,大大提高处理速度,幸运的是该算法也是python自带的一个模块。当然对其原理的理解,建议还是自己实现下。

5 对查重后的结果进行处理,可以保存到本地,也可以直接输出,由于本项目主要提供php调用,切php调用执行py文件之后,对输出结果不能换行处理,所以本项目添加一些html标签和css样式。

查重实现核心源码如下:

def checkfun(namestr):subject={} # 记录查重结果,键值对,原句+重复率summary={}# 1 找到对比库的历史数据checkpath ="../CheckRepeat/database/OrigCorpus/cutdatas.txt" # 数据库中对比项目语料库with open(checkpath,"r",encoding="utf-8") as f:checklist=[line[:] for line in f.readlines()]subjectname=[sub for sub in checklist if "subject" in sub] # 项目名称summaryname=[summ for summ in checklist if "summary" in summ] # 项目简介if "subject" in namestr:# 2 进行项目名称验证操作for rline in subjectname:line = ''.join(str(rline).split(' ')[2:])subp = difflib.SequenceMatcher(None,namestr.split('\n')[0].replace('subject',''),line).ratio()subject[line]=float('%.4f'%(subp))if "summary" in namestr:# 3 进行项目简介验证操作for rline in summaryname:line = ''.join(str(rline).split(' ')[2:])sump = difflib.SequenceMatcher(None,namestr.split('\n')[1].replace('summary',''),line).ratio()summary[line]=float('%.4f'%(sump))# 4 打印检测结果outreslut=""sort1=sorted(subject.items(),key=lambda e:e[1],reverse=True)   #排序outreslut +="项目名称:"+"*"*5+"["+namestr.split('\n')[0].replace('subject','') + "]"+"*"*5+"的查重结果如下:\n\n"for item in sort1[:1]:if item[1] >= 0.5:outreslut += "与项目库中\t[<span style=\"color:red\">"+item[0].replace("\n",'')+"</span>]\t的相似率最高:<span style=\"color:red\">"+str(item[1]) +"</span>\n"else:outreslut += "<span style=\"color:green\">没有查出重复的项目简介</span>\n"sort2=sorted(summary.items(),key=lambda e:e[1],reverse=True)   #排序outreslut += "\n\n项目简介:"+"*"*5+"["+namestr.split('\n')[1].replace('summary','') + "]"+"*"*5+"的查重结果如下:\n\n"for item in sort2[:1]:if item[1] >= 0.5:outreslut += "与项目库中\t[<span style=\"color:red\">"+item[0].replace("\n",'')+"</span>]\t的相似率最高:<span style=\"color:red\">"+str(item[1]) +"</span>\n"else:outreslut += "<span style=\"color:green\">没有查出重复的项目简介</span>\n"# 5 写到文件里面with open("../CheckRepeat/database/DealCorpus/checkout.txt",'w',encoding='utf-8') as f:f.write(outreslut)print(outreslut)

其运行结果如下:

6 PHP调用Python查重系统


1 php调用主要是$program变量下的语句,原理是:

python.exe的绝对路径,空格,调用py的主文件绝对路径,空格,参数1,空格,参数2

2 py文件通过sys相关参数进行接收,sys.argv[0]是py文本名,所以1-n对应你传入的参数如下:

# subject = sys.argv[1]
# summary = sys.argv[2]

3 exec($program,$result,$N)其执行py程序并返回一条字符串,返回结果保存在$result中。$N代表执行是否成功,成功返回1

4  shell_exec($program) 返回py文件所有语句的输出

5 php与py之间存在乱码问题,可以通过mb_convert_encoding ($output,"UTF-8", "GBK")解决

<?php$name=mb_convert_encoding($_POST['projectname'], "GBK","UTF-8");$sumb=mb_convert_encoding($_POST['projectsumb'], "GBK","UTF-8");$program="D:/Users/Administrator/Anaconda3/python E:/pythonSource/CheckArticle/CheckRepeat/checkIndex.py ".$name." ".$sumb.""; #注意使用绝对路径.$name."".$sumb$output = nl2br(shell_exec($program));// $program1="D:/Users/Administrator/Anaconda3/python ../CheckRepeat/test.py ".$name." ".$sumb.""; #注意使用绝对路径.$name."".$sumb// $result1 = shell_exec($program1);echo mb_convert_encoding ($output,"UTF-8", "GBK");// if ($output!=null){//     print_r(nl2br(file_get_contents('../CheckRepeat/database/DealCorpus/checkout.txt')));// }
?>

7 参考文献:


[1] TF-IDF与余弦相似性的应用:http://www.ruanyifeng.com/blog/2013/03/tf-idf.html
[2] 海量数据相似度计算之simhash短文本查找:http://www.lanceyan.com/tag/simhash
[3] 用TF特征向量和simhash指纹计算中文文本的相似度:https://github.com/zyymax/text-similarity
[4] gensim文档相似度判断:http://kekefund.com/2016/05/27/gensim-similarity/
[5] python文本相似度计算:http://www.jianshu.com/p/edf666d3995f
[6] 如何计算两个文档的相似度:https://flystarhe.github.io/2016/08/30/document-similarity/
[7] gensim文档相似度判断:http://kekefund.com/2016/05/27/gensim-similarity/

转载于:https://www.cnblogs.com/baiboy/p/check.html

【NLP】Python实例:基于文本相似度对申报项目进行查重设计相关推荐

  1. 使用Word2Vec完成基于文本相似度的推荐

    使用 Word2Vec 完成基于文本相似度的推荐 之前的基于文本相似度的推荐使用的是one-hot的词向量,虽然可以使用稀疏向量来存储里面的非0值,但是以这种形式的词向量存在很多问题: 稀疏的向量表达 ...

  2. 【Python】基于文本匹配的微信自动问答

    [Python]基于文本匹配的微信自动问答 摘要 一.引言 二.相关工作 三.方法描述 1.数据预处理 2.特征提取 3.文本匹配 四.代码部分 五.实验结果 六.总结 摘要   本文针对传统的基于规 ...

  3. 详解利用基于gensim的TF-IDF算法实现基于文本相似度的推荐算法

    详解利用基于gensim的TF-IDF算法实现基于文本相似度的推荐算法 TF-IDF的基本原理 算法思想 计算公式 相似度计算原理 微型图书推荐案例 案例背景 开发工具 数据预处理 TF-IDF模型建 ...

  4. 【基于文本相似度的论文查重系统-哔哩哔哩】 https://b23.tv/6JJBMur

    [基于文本相似度的论文查重系统-哔哩哔哩] https://b23.tv/6JJBMur https://b23.tv/6JJBMur

  5. 基于Python3.x pandas实现大疫情的查重功能

    基于Python3.x pandas实现大疫情的查重功能 https://blog.csdn.net/ky200904020/article/details/88693219 系统使用 win7 32 ...

  6. python专业方向 | 文本相似度计算

    作者系浙江大学生物医学工程专业的硕士在读:专注于自然语言处理 iOS开发. 步骤 1.分词.去停用词 2.词袋模型向量化文本 3.TF-IDF模型向量化文本 4.LSI模型向量化文本 5.计算相似度 ...

  7. 系统学习NLP(十七)--文本相似度

    转自:https://blog.csdn.net/qq_28031525/article/details/79596376 看原文吧,这里公式改不过来,烂 在自然语言处理(Natural Langua ...

  8. 文本解析 python 多行,关于python:基于文本的数据格式,支持多行字符串

    我搜索支持多行字符串的基于文本的数据格式. JSON不允许多行字符串: >>> import json >>> json.dumps(dict(text='firs ...

  9. [原创]python计算中文文本相似度神器

    介绍 最近因为工作需要,需要使用一个功能,就是中文文本相似度的计算.属于nlp领域的一个应用吧,这里找到一个非常好的包和大家分享.这个包叫sentence-transformers. 这里给大家介绍, ...

最新文章

  1. 汇编语言--转移指令
  2. php smeoa,install.php
  3. MySQL浅谈 LEFT JOIN
  4. java 双重检查加锁弊端
  5. 玛莎拉蒂“跨界”腾讯车联打造车载互联系统,新Ghibli “触电新生”
  6. 系统架构设计师 - 软件架构设计 - 特定领域软件架构DSSA(Domain Speciffic Softwore Architecture)
  7. Field+offset(len)
  8. acfun html5 转换,AcFun剧场模式插件
  9. Jmeter自定义Java请求,继承AbstractJavaSamplerClient
  10. 必须掌握的30种SQL语句优化
  11. 树莓派HDMI分辨率的设置
  12. 微信小程序商城开发记录一之需求分析
  13. 《私募股权基金投资基础知识》---第八章
  14. Android10源码AOSP(从Ubuntu14.04环境搭建到下载编译运行)
  15. 利用nodemcu和mqtt协议让嵌入式设备接入互联网(一.layui前端框架)
  16. cadence 画电路图时出现绿色的倒三角
  17. 量子通信利用量子力学原理产生密钥对信息进行加密和解密,并采用量子纠缠效应进行密钥分发,被认为是当今最安全的通信系统.有两项特性,一个是不可分割,一个是不可复制...
  18. 米的换算单位和公式_毫米和米的换算
  19. Cannot open precompiled header file: 'Debug/****.pch': No such file or directory
  20. 题目7:猴子跳台阶 1级和3级

热门文章

  1. 51nod 1526 分配笔名
  2. 【LeetCode困难】1263. 推箱子
  3. iMazing最新版2.16.1Apple设备管理器功能介绍
  4. 我们可以一起来聊聊算法工程师当前选哪个方向好?
  5. 屏蔽笔记本自带键盘的简短命令
  6. grafana share 页面链接
  7. 智云通CRM:客户的成交过程就像“拍拖”到“结婚”?
  8. LabelImg介绍
  9. 解决iframe嵌套登录页面,登录无反应,需刷新才能进游戏问题
  10. Linux命令之Centos 7 systemctl和防火墙firewalld命令(初学一)