仅仅考虑两篇文章的词组,并未考虑文本的语义信息。

实现原理:

1.  对两篇文档进行词频统计;

2.  利用“TF-IDF和余弦相似度”原理,计算两篇文档的相似度。

实现过程:

1.利用lucene对大量文章建立索引,创建语料库,来提高TF-IDF的准确度。

2. 通过余弦公式计算出两篇文章的相似度。

package twodocsimiliary;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Map;import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory;
import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;
/*** 仅仅考虑词组,并未考虑文本的语义信息* @author wangss * @date Aug 26, 2014*/
public class comparisontwodoc {public static Map<Long,String> words = new HashMap<Long,String>();public static void main(String []args){
//      AnalyzerWord analyzer = new AnalyzerWord();String path_a = "H:\\a.txt";String path_b = "H:\\c.txt";String str = readFiles(path_a);String str2 = readFiles(path_b);Map<Long,Double> tf_a = iniCosine(str);Map<Long,Double> tf_b = iniCosine(str2);long molecular=0;//分子long denominator_a=0;//分母long denominator_b=0;System.out.println("两篇文档相似的词有:");DecimalFormat df = new DecimalFormat("0.00");for(long tfa :tf_a.keySet()){denominator_a += tf_a.get(tfa)*tf_a.get(tfa);molecular += tf_a.get(tfa)*(null==tf_b.get(tfa)?0:tf_b.get(tfa));if(tf_a.get(tfa)!=null && tf_b.get(tfa)!=null){System.out.println(words.get(tfa)+"  TF-IDF词频统计 文档一:" +df.format(tf_a.get(tfa))+";文档二:"+df.format(tf_b.get(tfa)));}}for(long tfb : tf_b.keySet()){denominator_b += tf_b.get(tfb)*tf_b.get(tfb);}double result = 0;if(denominator_a!=0 && denominator_b!=0){result =  (molecular/(Math.sqrt(denominator_a)*Math.sqrt(denominator_b)));}System.out.println("两篇文档相似度:"+df.format(result*100) +"%");}private static String readFiles(String path_a) {try {InputStreamReader file_a = new InputStreamReader(new FileInputStream(new File(path_a)), "GBK");BufferedReader bufferedReader = new BufferedReader(file_a);StringBuffer str_a = new StringBuffer();String lineTxt = null;while((lineTxt = bufferedReader.readLine()) != null){
//                System.out.println(lineTxt);str_a.append(lineTxt);}file_a.close();return str_a.toString();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();return null;}}private static Map<Long,Double> iniCosine(String str) {Map<Long,Long> tf = new HashMap<Long,Long>();Map<Long,Double> idf = new HashMap<Long,Double>();Reader input = new StringReader(str);// 智能分词关闭(对分词的精度影响很大)IKSegmenter iks = new IKSegmenter(input, true);Lexeme lexeme = null;
//        StringBuilder sb = new StringBuilder();try {//读取索引IndexReader indexReader = DirectoryReader.open(FSDirectory.open(new File("H:\\testIndex")));int allDocs = indexReader.numDocs();//文档总数
//          System.out.println("文档总数:"+allDocs);/*QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_45,new String[]{"content"} , new IKAnalyzer());*/while ((lexeme = iks.next()) != null) {String lexemeText = lexeme.getLexemeText();long hash = ELFHash(lexemeText);IndexSearcher indexSearcher = new IndexSearcher(indexReader);TopDocs topDocs = indexSearcher.search(new TermQuery(new Term("content",lexemeText)), indexReader.maxDoc());int totalHits = topDocs.scoreDocs.length;double log = Math.log(allDocs/(totalHits+1));if(log<0) log = 0;//文档反转频度|idf.put(hash, log);tf.put(hash, null==tf.get(hash)?1:tf.get(hash).longValue()+1);words.put(hash, lexemeText);}//计算TF-IDF的值for(long m : idf.keySet()){idf.put(m, tf.get(m)*idf.get(m));}} catch (IOException e) {e.printStackTrace();}return idf;}public static long ELFHash(String str){long hash = 0;long x = 0;for(int i = 0; i<str.length();i++){hash = (hash << 4)+str.charAt(i);if((x = hash & 0xF0000000L)!= 0){hash ^= (x >> 24);hash &= ~x;}}return (hash & 0x7FFFFFFF);}
}
对比两篇文档的相似度,分析结果如下:
      样本说明(字数600左右,来自新浪博客文章):a.txt分别和b.txt  c.txt  d.txt进行对比
1.  a.txt和b.txt内容一样;
2.  a.txt和c.txt有一半左右内容一样;
      3.  a.txt和d.txt是两篇不同的新浪博客文章;
      对比结果:
     1.  两篇文档(一样的文档)相似度:100.00%;
2.  两篇文档(一半类似)相似度:53.25%;
          两篇文档相似词的词频统计如下:
“诉说”  TF-IDF词频统计 文档一:0.69;文档二:0.69
“文坛”  TF-IDF词频统计 文档一:0.69;文档二:0.69
           “简称”  TF-IDF词频统计 文档一:0.69;文档二:0.69
           “挖苦”  TF-IDF词频统计 文档一:0.69;文档二:0.69
           “命名”  TF-IDF词频统计 文档一:0.69;文档二:0.69
           “票”  TF-IDF词频统计 文档一:0.69;文档二:0.69
           “拽”  TF-IDF词频统计 文档一:0.69;文档二:0.69
           ......
3.  两篇文档(来自不同的博客文章)相似度:8.46%;
两篇文档相似词的词频统计如下:
           “纳税人”  TF-IDF词频统计 文档一:2.08;文档二:3.47
           “过去”  TF-IDF词频统计 文档一:0.00;文档二:0.00
           “关心”  TF-IDF词频统计 文档一:0.69;文档二:0.69
           “写”  TF-IDF词频统计 文档一:0.69;文档二:0.69
           “真正”  TF-IDF词频统计 文档一:0.69;文档二:0.69
           “今天”  TF-IDF词频统计 文档一:0.00;文档二:0.00   ----(为0,说明在每篇文档中都出现了这个词,重要性就会很低)
           “奖金”  TF-IDF词频统计 文档一:0.69;文档二:0.69
           ......
相似性大于指定阈值(通常应大于40-50%),即可认定两篇文档相似。

两篇文章的相似度比较相关推荐

  1. C++/JAVA 计算两篇文章的相似度

    C++/JAVA 计算两篇文章的相似度 这位少侠,要不要进店瞧瞧? 实验介绍及思路 问题描述: 编写程序,计算任意两篇文章的相似度. 基本思路: 利用余弦相似度来计算其相似度. 完整代码 C++ 代码 ...

  2. [将小白进行到底] 如何比较两篇文章的相似度

    其实这个题目已经有很多人写过了,数学之美里就有,最近阮一峰的博客里也写了,本文基本上遵循的就是他的思路,只是让其看起来再小白一点点.其实说白了就是用自己的话,再把同样一件事描述一下,顺便扩扩句,把其中 ...

  3. php类似if,php 比较两篇文章的相似度的方法

    昨天说了一下php中的 similar_text() 函数,此函数可以比较两个字符串之间的相似度(以百分比计),但此函数在比较中文字符串时感觉不是那么的准确. 在网上搜索了一些php用户比较两个中文字 ...

  4. 【python 走进NLP】simhash 算法计算两篇文章相似度

    互联网网页存在大量的重复内容网页,无论对于搜索引擎的网页去重和过滤.新闻小说等内容网站的内容反盗版和追踪,还是社交媒体等文本去重和聚类,都需要对网页或者文本进行去重和过滤.最简单的文本相似性计算方法可 ...

  5. 【NLP学习笔记】文本相似度计算——判断两篇文章是否相似

    一.算法流程 (1)使用TF-IDF算法,提取出两篇文章的关键词: (2)每篇文章各取出若干个关键词(比如20个),合并成一个集合,计算每篇文章对于这个集合中的词的词频(为了避免文章长度的差异,可以使 ...

  6. 【读书笔记】NeurIPS2018的两篇文章:The Tradeoffs of Large Scale Learning和Neural Ordinary Differential Equations

    今天看了 NeurIPS 2018 上的两篇文章,一篇是获得 best paper 的 Neural Ordinary Differential Equations (陈天奇的文章),一篇是获经典论文 ...

  7. 比较两篇文章的相似性方法

       对于这个题目,开始毫无头绪,后来经过查阅资料现在讲方法总结如下:   1.利用余弦定理    我们知道向量a,b之间的夹角可用余弦定理求得:              如果夹角的余弦值越小,那么 ...

  8. 目前需要开发出一个功能,对比查找并标注出两篇文章中类似的段落或者词句,有什么开源项目有这个功能吗? 其实有点像论文查重的功能,有论文查重的比较通用的开源项目推荐吗?...

    是的,你可以使用论文查重的工具来对比查找并标注两篇文章之间的相似段落或词句. 你可以尝试使用这些开源项目: MOSS (Measure Of Software Similarity):这是一个用于检测 ...

  9. 关于微服务的两篇文章以及Eventuate

    微服务相关的两篇文章,很多之前一知半解的概念与关系,看过之后,茅塞顿开! 微服务架构之事件驱动架构 http://m.blog.csdn.net/article/details?id=52537886 ...

  10. python余弦定理_使用余弦定理计算两篇文章的相似性

    使用余弦定理计算两篇文章的相似性:(方法论,细致易懂版) http://blog.csdn.net/dearwind153/article/details/52316151 python 实现(代码) ...

最新文章

  1. 控制C++的内存分配
  2. 第三届蓝桥杯预赛c++b组
  3. 从构建分布式秒杀系统聊聊WebSocket推送通知
  4. python 列表比较不同_python实现比较两段文本不同之处的方法
  5. iOS 正则表达式判断纯数字以及匹配11位手机号码
  6. eclipse xml文件报错_Maven教程6: Maven与Eclipse整合
  7. 2019牛客多校四 E. triples II (容斥)
  8. BZOJ2286 [Sdoi2011]消耗战 【虚树 + 树形Dp】
  9. java 2015001_hbase的Java操作
  10. 财报识别OCR,披露虚假财务报表
  11. Web大学生网页作业成品——个人班级网站设计与实现(HTML+CSS)
  12. C 程序设计语言——第七章练习题
  13. 马云在2017乌镇互联网大会讲了这三个观点
  14. 小篮子玩意儿、你苏爷就是扣字神话不服气么。
  15. 量子计算机是伪科学,别再被伪科学“量子产品”蒙蔽了
  16. 容积式水表与速度式水表对比
  17. 志愿模板-大学生寒暑假社会实践报告/企业实习报告模板
  18. 图像处理——KL变换原理
  19. IO流案例-熊猫烧香
  20. 使用python下载简单的m3u8视频

热门文章

  1. LaTeX种数学符号公式编写
  2. 大前研一,柳井正《放胆去闯》读书笔记
  3. 我国计算机发展历程简述,简述计算机的发展历程??
  4. cim系统 是什么_CIM和IBM i:它是什么以及它如何工作
  5. 杭州电子科技大学 计算机专硕复试分数线,2020杭州电子科技大学考研复试分数线已公布...
  6. www是什么,http是什么,到底什么区别?
  7. 飞图FLYTOUAV垂起固定翼无人机采用交叉环绕飞行搭载单镜头相机做高精度,高效率,长航时,大比例尺地籍测量中应用
  8. 我理解的myisam引擎之六 MYI、MYD文件的解析
  9. pulseaudio 播放卡顿的解决方法
  10. python计算方位角_python如何计算方位角 python计算方位角代码实例