zoukankan      html  css  js  c++  java
  • 开发记录4

    完成了任务2,实现了对词条的自动分类以及对词条关键字的提取,这次就是开始任务3对百度百科进行全文检索,判断抄袭语句,以及全文相似比。

    思路:对任务2中提取的关键字为准对爬取百度百科,然后对比词条解释和爬取的内容进行比对,相似度大于80%的就将抄袭语句插入数据库,然后再写入PDF,其中抄袭的语句用红色标注出来

    方法:1.用余弦相似度对语句进行比对,将相似度大于80%且长度大于13个字符的语句写入数据库。代码如下:

    package com.servlet;
     
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    import java.util.stream.Collectors;
    
    import org.jsoup.Jsoup;
    
    import com.dao.InformationDao;
    import com.hankcs.hanlp.HanLP;
    import com.model.Information;
     
    /**
     * 字符串相似性匹配算法
     * Created by panther on 15-7-20.
     */
    public class Cha {
        Map<Character, int[]> vectorMap = new HashMap<Character, int[]>();
     
        int[] tempArray = null;
     
        public Cha(String string1, String string2) {
     
            for (Character character1 : string1.toCharArray()) {
                if (vectorMap.containsKey(character1)) {
                    vectorMap.get(character1)[0]++;
                } else {
                    tempArray = new int[2];
                    tempArray[0] = 1;
                    tempArray[1] = 0;
                    vectorMap.put(character1, tempArray);
                }
            }
            for (Character character2 : string2.toCharArray()) {
                if (vectorMap.containsKey(character2)) {
                    vectorMap.get(character2)[1]++;
                } else {
                    tempArray = new int[2];
                    tempArray[0] = 0;
                    tempArray[1] = 1;
                    vectorMap.put(character2, tempArray);
                }
            }
        }
     
        // 求余弦相似度
        public double sim() {
            double result = 0;
            result = pointMulti(vectorMap) / sqrtMulti(vectorMap);
            return result;
        }
     
        private double sqrtMulti(Map<Character, int[]> paramMap) {
            double result = 0;
            result = squares(paramMap);
            result = Math.sqrt(result);
            return result;
        }
     
        // 求平方和
        private double squares(Map<Character, int[]> paramMap) {
            double result1 = 0;
            double result2 = 0;
            Set<Character> keySet = paramMap.keySet();
            for (Character character : keySet) {
                int temp[] = paramMap.get(character);
                result1 += (temp[0] * temp[0]);
                result2 += (temp[1] * temp[1]);
            }
            return result1 * result2;
        }
     
        // 点乘法
        private double pointMulti(Map<Character, int[]> paramMap) {
            double result = 0;
            Set<Character> keySet = paramMap.keySet();
            for (Character character : keySet) {
                int temp[] = paramMap.get(character);
                result += (temp[0] * temp[1]);
            }
            return result;
        }
     
        public static void main(String[] args) throws IOException {
            
              Chachong cha=new Chachong();  
              InformationDao indao=new InformationDao();
              List<Information> infos=indao.loadAll();
              String baiduAll="";
              String information="";
              //List<String> chaoxi = new ArrayList<String>();
              for(Information info:infos)//查重数据库中所有词条内容
            {
                  
                   String key[]=info.getKeyword().split(" ");//划分关键字
                   
                   
                 //按照标题爬去查重
                   List<String> fenci= getSplitWords(info.getTitle());//划分标题 
                   for(String ke:fenci)
                   {
                       boolean b=true;
                       for(String name:key)//如果标题划分的词语在关键字中存在,就不再查重
                       {
                           if(ke.equals(name));
                           {
                               b=false;
                           }
                       }
                       //System.out.println(ke);
                       String baidu[]=cha.paqu(ke);
                       if(baidu.length!=0&&b==true)//查重
                       {
                             String juhao[]=info.getContent().split("。");//对热词内容进行“。”的划分
                             String[]cont=new String[500];//初始化逗号句号划分内容
                             int x=0;
                             for(String douhao:juhao)
                             {
                                 String temp[]=douhao.split(",");//对热词内容进行逗号的划分
                                 for(String dou:temp)
                                 {
                                     //System.out.println(dou);
                                     cont[x]=dou;
                                     x++;
                                 }
                             }
                             
                             String bai[]=baidu[1].split("。");//对百度词条内容进行“。”的划分
                             String[]baidu1=new String[500];//初始化百度划分
                             int y=0;
                             for(String douhao:bai)
                             {
                                 String temp[]=douhao.split(",");//对百度内容逗号的划分
                                 for(String dou:temp)
                                 {
                                     baidu1[y]=dou;
                                     y++;
                                 }
                             }
                             for(String con:cont)//将划分好的百度内容和数据库中热词的内容进行相似度的对比
                             {
                                 for(String ba:baidu1)
                                 {
                                     if(con!=null&&ba!=null)
                                     {
                                     //System.out.println(con);
                                     Cha similarity = new Cha(ba, con);
                                     if(similarity.sim()>=0.8&&con.length()>=13)//如果相似度大于0.8且句子长度大于等于13则认为抄袭
                                     {
                                          System.out.println(info.getIndex()+"抄袭"+con);
                                         System.out.println(similarity.sim());
                                         indao.add(con,info.getIndex());
                                     }
                                     }
                                 }
                             }
                             //System.out.println(ke);
                               //indao.add(co, info.getIndex());
                             }
                       }
                
                   
                   
                   
             //按数据库中划分的关键字查重
               String key1[]=info.getKeyword().split(" ");
               //System.out.println(info.getTitle());  
               information=information+info.getContent(); 
              for(String name:key1)
              {
                 String baidu[]=cha.paqu(name);
                 //baiduAll=baiduAll+baidu[1];
                 String juhao[]=info.getContent().split("。");
                 String[]cont=new String[500];
                 int x=0;
                 for(String douhao:juhao)
                 {
                     String temp[]=douhao.split(",");
                     for(String dou:temp)
                     {
                         //System.out.println(dou);
                         cont[x]=dou;
                         x++;
                     }
                 }
                 
                 String bai[]=baidu[1].split("。");//先按句号划分百度内容
                 String[]baidu1=new String[500];
                 int y=0;
                 for(String douhao:bai)
                 {
                     String temp[]=douhao.split(",");//逗号划分百度内容
                     for(String dou:temp)
                     {
                         baidu1[y]=dou;
                         y++;
                     }
                 }
                 for(String con:cont)
                 {
                     for(String ba:baidu1)
                     {
                         if(con!=null&&ba!=null)
                         {
                         //System.out.println(con);
                         Cha similarity = new Cha(ba, con);
                         if(similarity.sim()>=0.8&&con.length()>=13)//如果相似度大于0.8且句子长度大于等于13则认为抄袭
                         {
                              System.out.println(info.getIndex()+"抄袭"+con);
                             System.out.println(similarity.sim());
                             indao.add(con,info.getIndex());
                         }
                         }
                     }
                 }
              }
              
              //
        }
            /*String str1 = "互联网+概念于2012年11月易观国际董事长兼首席执行官于扬首次提出,并于2015年7月4日,国务院印发了《国务院关于积极推进“互联网+”行动的指导意见》。“互联网+”作为知识社会创新2.0推动下的互联网形态演进,成为了中国互联网发展的新形态和新业态。“互联网+”既是互联网的移动与泛在,促进了传统行业与互联网的融合及应用,将数据、计算、知识三者融合,使创新渗入到各行各业,从而开创了创新驱动发展的“新常态”。 ";
            String [] key=str1.split(",");
            String str2 = "互联网+概念于2012年11月易观国际董事长兼首席执行官于扬首次提出";   
            for(String str:key)
            {
                Cha similarity = new Cha(str, str2);
                if(similarity.sim()>=0.9)
                {
                    System.out.println(str);
                    System.out.println(similarity.sim());
                }
            }*/
             
              
            /*String[] arr1 = str1.split(",") ;
            String[] arr2 = str2.split(",") ; 
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < arr2.length; i++){
               for (int j = 0; j < arr1.length; j++){
                  if (arr1[j].equals(arr2[i])){
                      sb.append(arr1[j] + ",") ;
                      }
                }
             }
            System.out.println("结果:" + sb.toString().substring(0, sb.toString().length()));*/
    
        }
        private static List<String> getSplitWords(String sentence) {
            // 去除掉html标签
            sentence = Jsoup.parse(sentence.replace("&nbsp;","")).body().text();
            // 标点符号会被单独分为一个Term,去除之
            return HanLP.segment(sentence).stream().map(a -> a.word).filter(s -> !"`~!@#$^&*()=|{}':;',\[\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、? ".contains(s)).collect(Collectors.toList());
        }
     
    }

    写入数据库截图如下:

  • 相关阅读:
    java常用类-----String类的源码分析、可变和不可变序列
    java常用类-----包装类及自动装箱和拆箱
    java数组---------二分查找_折半检索
    java数组------冒泡排序和优化
    java数组--------多维数组及数组存储表格数据
    java数组------Arrays工具类使用
    Volley超时重试机制
    Volley框架原理
    模块化实现(好处,原因)
    Android系统显示原理
  • 原文地址:https://www.cnblogs.com/lovema1210/p/10666160.html
Copyright © 2011-2022 走看看