菜单

注册免费送38元体验金文件去又第一步:基于内容的文本相似性计算

2018年11月16日 - 注册免费送38元体验金

http://yshjava.iteye.com/blog/1560661

缘何设算文档相似性

      在今年新春底下,我开尝试做文本的自动聚类,当时凡自网上,找到的一个K-Means算法,稍作了修改。从测试结果来拘禁,分类功能
不顶好,究其原因,我当产生些许只,一个凡词库的题目,停用词词库太小,没有噪音词库,也未尝近义词词库,最着重之是绝下的歌词,统计的TFIDF权重不准
确,第二个原因则是算某文档与对象项目的相似度的算法不够客观。第一独问题通过少上多之品尝,于昨天缓解了,剩下了亚单问题,真是为人口头疼。
当然我曾经打算放一阵子底,但就当面前几上Merry跟我开口了他文本去重的法则同有些细节问题,让自家以更燃起了望。同时自啊以为,计算文档相似度,不仅会为去再提供重要依据,稍后也得于文书分类/聚类上奋发有为,于是,我打算抽一点点时空,去尝尝一下。 

 

 

 

算法模型

 算法的模子,可以省略描述为:

1、加载与即将分析的文档无关之TFIDF词库、停用词库;
2、假而我们收获的凡有限首正常的文档,首先切词,去除停用词;
3、抽取两篇文档中之公共词汇,计算其的TFIDF权重和;
4、分别计两首文档的TFIDF权重,即每首文档中有着词汇的TFIDF和;
5、使用公共词汇的权重分别对片首文档的权重求模,并盘算其的积;
6、乘积即为少篇文档的相似度;

 

算法的理论依据是,TFIDF权重越强的词,其于篇章中象征意义就是越怪,由此,假要我们具有了一个规范的TFIDF词库,那么我们不怕可以在用稿子分
词后,将那奔量化,并加权后虚拟成一个面积,两篇稿子公共的组成部分,也足以虚拟成一个面积值,根据概率论的概率分布理论,公共部分于点滴独面积中起的票房价值的
乘积,即为两岸的相似程度。

 

 

算法代码

 

 

Java代码  注册免费送38元体验金 1

  1. /* 
  2.  * To change this template, choose Tools | Templates 
  3.  * and open the template in the editor. 
  4.  */  
  5. package cn.ysh.studio.text.cluster.main;  
  6.   
  7. import cn.ysh.studio.text.cluster.TFIDFHelper;  
  8. import cn.ysh.studio.text.cluster.core.Dictionary;  
  9. import cn.ysh.studio.text.cluster.core.Document;  
  10. import cn.ysh.studio.text.cluster.utils.FileHelper;  
  11. import java.io.File;  
  12. import java.io.FileNotFoundException;  
  13. import java.io.IOException;  
  14.   
  15. /** 
  16.  * 计算两首文档的貌似度 
  17.  * 
  18.  * @author 杨胜寒 
  19.  */  
  20. public class SimpleComputeSimilarity {  
  21.   
  22.     public static float repeatValue(Document doc1, Document doc2) {  
  23.         float keywordTFIDF = 0.0f;  
  24.         float doc1TFIDF = 0.0f;  
  25.         float doc2TFIDF = 0.0f;  
  26.         for (String word : doc1.getContentTerms().keySet()) {  
  27.             if (doc2.getContentTerms().containsKey(word)) {  
  28.                 keywordTFIDF += doc1.getContentTerms().get(word);  
  29.             }  
  30.             doc1TFIDF += doc1.getContentTerms().get(word);  
  31.         }  
  32.         for (String word : doc2.getContentTerms().keySet()) {  
  33.             doc2TFIDF += doc2.getContentTerms().get(word);  
  34.         }  
  35.         return (keywordTFIDF / doc1TFIDF) * (keywordTFIDF / doc2TFIDF);  
  36.     }  
  37.   
  38.     public static void main(String[] s) throws FileNotFoundException, IOException {  
  39. //        String docPath1 = “F:\\Workspaces\\NetBeansTest\\TextCluster\\txt\\洛阳空气质量差环保部门为批 环保局向市民道歉.txt”;  
  40. //        String docPath2 = “F:\\Workspaces\\NetBeansTest\\TextCluster\\txt\\洛阳空气质量差环保局明白赔礼道歉 细说原因对策.txt”;  
  41.         String docPath1 = “F:\\Workspaces\\NetBeansTest\\TextCluster\\txt\\英美传媒:美国临时对南海失和避而远之.txt”;  
  42.         String docPath2 = “F:\\Workspaces\\NetBeansTest\\TextCluster\\txt\\美媒:黄岩岛纠纷结束中国捷 美只请自由通航.txt”;  
  43.         Document doc1 = FileHelper.loadDocument(new File(docPath1));  
  44.         Document doc2 = FileHelper.loadDocument(new File(docPath2));  
  45.         Dictionary.getInstance().loadDictionary(“F:\\Workspaces\\NetBeansTest\\TextCluster\\自由自在词典.dic”);  
  46.         Dictionary.getInstance().loadStopDictionary(“F:\\Workspaces\\NetBeansTest\\TextCluster\\txt\\stopwords.txt”);  
  47.         long start = System.currentTimeMillis();  
  48.         TFIDFHelper.tfidf(new Document[]{doc1, doc2});  
  49.         float repeatValue = SimpleComputeSimilarity.repeatValue(doc1, doc2);  
  50.         long end = System.currentTimeMillis();  
  51.         System.out.println(“相似值:” + repeatValue + “,用时[” + (end – start) + “]毫秒!”);  
  52.     }  
  53. }  

 

 

测试结果截图:

 

 

注册免费送38元体验金 2

 

 

测试中利用到零星篇文档来自百渡过新闻,在附件中来,感兴趣之同窗可以扣押一下情,然后评定上述结果是否规范。

 

运用上述算法,对数据库中之18609篇新闻资讯进行相似度计算,输出相似度大于0.5之消息的音。截图如下:

 

 注册免费送38元体验金 3

 

注册免费送38元体验金 4

 

算法优劣

 


似度计算的算法极为简略,但是本着赖之词典要求大高,算法中使的”自由自在词典.dic”是笔者的另外一个家伙根据爬虫收集的海量情报信息抽取好统计出
来的,包含了词汇及其TF、IDF权重值,旨在为分析器提供一个中立的、与被分析文档无关之TF/IDF权重词库。附件面临附带提供了同样卖小的词典样例,随
着分析工具分析情报信息的数额的随地长,词库也用不断扩大。

 

 

私家总结

 

虽说手上来拘禁,效果还得,但是自己认为还有以下几只地方应改善:
1、扩大停用词库,增加噪音词库,降低无用词汇的打扰;
2、扩大TFIDF词库,同时标注词性,我觉着新鲜词性的词汇在不同场所当非常处理,如名词、动词和专用词汇在相似性计算中应该让加权;
3、增加近义词库和转换词库(比如美方=美国,华盛顿=美国,北京=中国,叙=叙利亚等等),据我预测,在多数场所被,合并近义词、转换词可以增长计算结果的精确度;

哼吧,就先行总结这么多吧,希望会抛砖引玉,为大家提供一些思路。

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图