开发记录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());
    }
 
}

写入数据库截图如下:

 

posted @ 2019-04-07 17:39  Ayeah~夭夭  阅读(110)  评论(0编辑  收藏  举报