需求背景:

http://3g.k.sohu.com/t/n384943815,如这篇搜狐新闻,内容存在明显重复,那为了保障线上文章质量,我们需要对文章段落进行判重。于是我们需要一个判重的逻辑和标准

算法逻辑:

获取文章段落,根据换行符\r、\n、<br/>、</br>进行分割,再循环段落,逐一与下一个段落进行比较,计算段落间的重复率(计算两字符间的最大公共子串长度/被比较段落字符长度),如果段落间重复率大于某个值(0.95),则判断此文章存在段落重复(此处可优化为判断整体段落重复率:重复段落数/总段落数)

算法实现:(直接上代码,不解释)

一、获取两字符串重复子串长度和重复子串

算法详解参考 https://www.cnblogs.com/Springtie/p/4068964.html

class CommonResult{private String commonStr;private int commonCount;public CommonResult() {}public String getCommonStr() {return commonStr;}public void setCommonStr(String commonStr) {this.commonStr = commonStr;}public int getCommonCount() {return commonCount;}public void setCommonCount(int commonCount) {this.commonCount = commonCount;}}public  CommonResult maxUtilStr(String str1, String str2) {CommonResult commonResult = new CommonResult();//把字符串转成字符数组char[] arr1 = str1.toCharArray();char[] arr2 = str2.toCharArray();// 把两个字符串分别以行和列组成一个二维矩阵int[][] temp = new int[arr1.length][arr2.length];// 存储最长公共子串长度int length = 0;//start表明最长公共子串的起始点,end表明最长公共子串的终止点int end = 0;int start = 0;初始化二维矩阵中的第一行for (int i = 0; i < arr2.length; i++) {temp[0][i] = (arr1[0] == arr2[i]) ? 1 : 0;}//初始化二维矩阵中的第一列for (int j = 0; j < arr1.length; j++) {temp[j][0] = (arr2[0] == arr1[j]) ? 1 : 0;}//嵌套for循环:比较二维矩阵中每个点对应行列字符中否相等,相等的话值设置为1,否则设置为0for (int i = 1; i < arr1.length; i++) {for (int j = 1; j < arr2.length; j++) {if (arr1[i] == arr2[j]) {temp[i][j] = temp[i - 1][j - 1] + 1;if (temp[i][j] > length) {length = temp[i][j];end = j;}} else {temp[i][j] = 0;}}}//求出最长公共子串的起始点start=end-length+1;StringBuilder sb=new StringBuilder();//通过查找出值为1的最长对角线就能找到最长公共子串for (int j = start; j < end+1; j++) {sb.append(arr2[j]);}commonResult.setCommonCount(length);commonResult.setCommonStr(sb.toString());return commonResult;}

二、判断段落是否存在重复

 public FilterResult apply(MrdNewsObject news) {String co = removeAltAttr(news.getCo(),news.getOid());String compareCo = co.replaceAll("\\pP|\\pS|[a-zA-Z0-9]", "");int co_len = compareCo.length();if(co_len>0){Pattern patternS= Pattern.compile("\r|\n|(</?br/?>)");Matcher matcherTS = patternS.matcher(co);if(matcherTS.find()){String sp = matcherTS.group();String []colea = co.split("\\"+sp);if(colea!=null&&colea.length>0){Set<String> set=new HashSet<String>();for(int i=0;i<colea.length;i++){set.add(colea[i]);}LOG.info("part set size = "+set.size()+" colea size = "+colea.length+" oid ="+news.getOid());
//                      if(set.size()<colea.length){
//                          LOG.info(" news is duplication  set size = "+set.size()+" colea size =  "+colea.length+" nid = "+news.getNid()+" ds = "+news.getDs());return new FilterResult(Level.BAD_CONTENT, "News content duplication filter");
//                      }}if(colea!=null&&colea.length>=2){for(int i=0;i<colea.length;i++){for(int j=i+1;j<colea.length;j++){String NewPart1 = colea[i];String NewPart2 = colea[j];try {NewPart1=  NewPart1.replaceAll("\\pP|\\pS|[a-zA-Z0-9]", "");NewPart2= NewPart2.replaceAll("\\pP|\\pS|[a-zA-Z0-9]", "");} catch (Exception e) {// TODO Auto-generated catch blockLOG.error("NewPart replace error e = "+e.toString());e.printStackTrace();}if (NewPart1.length() >= 6 && NewPart2.length() >= 6) {//int count = ContentDuplicationFilter.LCSLength(NewPart1.toCharArray(), NewPart2.toCharArray());//System.out.println(" count  = "+count);CommonResult commonResult = maxUtilStr(NewPart1,NewPart2);int count = commonResult.getCommonCount();String commonStr = commonResult.getCommonStr();double common_ratio = 0;if (count > 0 && co_len > 0) {if (NewPart1.length() > NewPart2.length()) {common_ratio = 1.0 * count / NewPart1.length();} else {common_ratio = 1.0 * count / NewPart2.length();}if ((common_ratio > 0.95)&&NewPart1.length()>30&&NewPart2.length()>30) {LOG.info("Common_ratio check and nid: = "+ news.getNid() + " oid: = " + news.getOid()+ " ds: = " + news.getDs()+ " common_ratio: = " + common_ratio + " i = "+ i + " index = " + i+" NewPart1 = "+NewPart1+" NewPart2 = "+NewPart2);news.setReason(256);return new FilterResult(Level.BAD_CONTENT, "News content duplication filter,commonStr:"+commonStr);}else{}}} else {continue;}}
//                      boolean b = hasSame(colea,i,colea.length,news);
//                      if(b){
//                           return new FilterResult(Level.BAD_CONTENT, "News content duplication filter");
//                      }} } }}if (co_len > 100) {String part1 = co.substring(0, co.length() / 2);
//            System.out.println(" part1 = ===============》》》 "+ part1);String part2 = co.substring(co.length() / 2, co.length());
//            System.out.println(" part2 = ===============》》》 "+ part2);//int common_len = ContentDuplicationFilter.LCSLength(part1.toCharArray(), part2.toCharArray());CommonResult commonResult = maxUtilStr(part1,part2);int common_len = commonResult.getCommonCount();String commonStr = commonResult.getCommonStr();if (common_len > 0 && co_len > 0) {double ratio = 1.0 * common_len / part1.length();LOG.info("Content Duplicaton check, nid=" + news.getNid() + " oid=" + news.getOid() + " from=" + news.getFrom() + " ratio=" + ratio+" commonStr="+commonStr);if (ratio > 0.3) {news.setReason(256);return new FilterResult(Level.BAD_CONTENT, "Content contains duplication, ratio=" + ratio+",commonStr="+commonStr);}}}if(news.getCo().length()==0&&news.getPic().length==0){return new FilterResult(Level.BAD_CONTENT, "Content length duplication, length=" + news.getCo().length());}return new FilterResult(Level.FINE, "");}
 

判断文章内容重复率的算法实现相关推荐

  1. java 判断文章的重复率_5个避免意外论文重复率高的方法

    即使你不是故意抄袭,但你可能在无意中抄袭了别人的论文, 这个叫做意外抄袭,它可能正发生在你身上,如果你不熟悉学术 道德规范,这里将告诉你5个基本的方法来避免意外抄袭. Tip1 熟悉其他人的论文 请检 ...

  2. 怎样改论文能降低论文重复率

    毕业论文的顺利通过查重,意味着离毕业又近了一步,但这是很难做到的.毕竟,机器查重是非常严格的,而且通过了学校的重复率,也并不意味着学校和老师都能得到认可,因此,掌握论文的修改和优化技巧尤为重要,你知道 ...

  3. 投稿别踩雷!| SCI论文重复率问题不容小觑

    [SciencePub学术干货]SCI重复率很低或较低就一定安全吗?弄懂这三个问题,让重复率不再成为困扰: 问题一:SCI论文重复率26%,还需要降重吗? 简单回答:需要. 目前大部分SCI期刊都没有 ...

  4. 改写(Paraphrase)是一种有效降低英文论文重复率和字数的方法

    在学术研究领域,写作是不可或缺的一部分.然而,当你提交论文时,你可能会遇到一个常见的问题:你的文章长度超过了要求的字数限制.这时候,你可以通过改写(paraphrasing)来降低文章的字数,同时保持 ...

  5. 论文降重有效减少重复率修改的方法

    今年,学校对论文检测的似乎比往年更加严格,对文章的重复率的要求也是再创新高,有些高校甚至要求重复率低于8%,所以对于学生掌握一些论文降重有效减少重复率修改的方法非常必要,具体方法小编整理如下:   一 ...

  6. php 判断文章重复率,(一)、社区反垃圾化之文字重复率检测

    (一).社区反垃圾化之文字重复率检测 序言: 随着用户量的增长和内容化过渡化增长,总会有一些不坏好意的人在你的产品或者应用中留下一些垃圾,这些垃圾并不是传统意义的垃圾,而是指互联网上的垃圾文本.垃圾邮 ...

  7. 产品网络推广带你了解蜘蛛是依靠什么判断文章质量的?助力提升网站收录率!...

    在网站优化中,做产品网络推广内容优化时很注重一些文章的发布.众所周知,高质量性.原创度高.具有创新性等文章是非常受蜘蛛的青睐的.对于蜘蛛来说,对网站上的文章是有质量评判的,通过判断这些文章的质量性.原 ...

  8. seo文章重复率高不利于收录

    内容是一个网站灵魂, 有句话说的很好:一切以您的内容开始和结束.内容为王,不是吹出来的,而是由千千万万的站长朋友所验证过的.一个网站如果没有内容,就没有可读性而言了,想要让更多的人对你网站有好感,就要 ...

  9. php正文重复度,百度如何判断网页文章的重复度?两个页面相似度确认方法介绍...

    在这个科技高度发达的时代,百度已经成为人们能获取消息的主要途径.但如今的百度,到处充斥着一些重复的内容,对用户的访问造成很大的困扰.因此,百度需要对网页重复进行判断,对重复的网页,只选取一些高质量的我 ...

  10. php文章重复度检测,百度如何判断网页文章的重复度?两个页面相似度确认方法介绍...

    在这个科技高度发达的时代,百度已经成为人们能获取消息的主要途径.但如今的百度,到处充斥着一些重复的内容,对用户的访问造成很大的困扰.因此,百度需要对网页重复进行判断,对重复的网页,只选取一些高质量的我 ...

最新文章

  1. BZOJ 1194: [HNOI2006]潘多拉的盒子 [DP DFA]
  2. Java Servlet 技术简介
  3. 如何在 Apache 中为你的网站设置404页面
  4. (转)用 Fiddler 看看 UpdatePanel 发生了什么
  5. 蓝桥杯嵌入式第七届模拟题 代码
  6. Linux服务器的初步配置流程
  7. go web db每次关闭_竟然不用写代码!一款可视化 Web 管理后台生成工具
  8. java线程池 core_Java 线程池 ThreadPoolExecutor 的使用
  9. QT 创建鼠标右键菜单
  10. 全连接层后面加bn层_神经网络基本组成 - 池化层、Dropout层、BN层、全连接层 13...
  11. 【九天教您南方cass 9.1】 09 提取坐标的几种方法
  12. GD32VF103移植SVSTEMVIEW
  13. linux 可执行文件反编译,如何反汇编,修改,然后重新组装一个Linux可执行文件?...
  14. 测试用例之因果图分析法
  15. spss并行配置不正确解决方案
  16. 节点英雄榜之脑海链:构建区块链化的知识变现经济生态
  17. 坚持学习100天:象棋网上对弈系统(表示看不懂,有待加油)
  18. Wireless Communications - 2.4 Ray Tracing
  19. 零基础搭建Tomcat集群(超详细)
  20. RAC 网络心跳 磁盘心跳 本地心跳 控制文件磁盘心跳

热门文章

  1. win10计算机 需要新应用,win10 计算器提示:需要新应用打开此calculator
  2. Python学习笔记-2017.5.4thon学习笔记-2017.5.19
  3. 在excel中如何筛选重复数据_Excel快速筛选数据方法集锦
  4. MySQL外键更新删除设置cascade、set null、restrict、no action的区别
  5. Python报错unindent does not match any outer indentation level如何解决?
  6. 联想台式计算机光驱启动,联想台式机怎么样设置光盘启动
  7. c语言setw,C++ iomanip setw()用法及代码示例
  8. 简洁的表白java_java简短表白代码是什么
  9. 软件开发过程回归与回溯之区别
  10. 好家伙,花了一个月时间写了个网易云,以后再也不用充VIP了!