文本去重第一步:基于内容的文本相似性计算

2024-06-07 00:58

本文主要是介绍文本去重第一步:基于内容的文本相似性计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


为何要计算文档相似性

      在今年年初的时候,我开始尝试做文本的自动聚类,当时是从网上,找到的一个K-Means算法,稍作了修改。从测试结果来看,分类效果不太好,究其原因,我认为有两个,一个是词库的问题,停用词词库太小,没有噪音词库,也没有近义词词库,最关键的是切出来的词,统计的TFIDF权重不准确,第二个原因则是计算某文档与目标类别的相似度的算法不够合理。第一个问题经过两天多的尝试,于昨日解决了,剩下了第二个问题,真是让人头疼。
本来我已打算放一阵子的,但就在前几天Merry跟我讲了他文本去重的原理和一些细节问题,让我又重新燃起了希望。同时我也认为,计算文档相似度,不仅能够为去重提供重要依据,稍后也可以在文本分类/聚类上有所作为,于是,我打算抽一点点时间,去尝试一下。 

 

 

 

算法模型

 算法的模型,可以简单描述为:

1、加载与将要分析的文档无关的TFIDF词库、停用词库;
2、假设我们得到的是两篇正常的文档,首先切词,去除停用词;
3、抽取两篇文档中的公共词汇,计算它们的TFIDF权重和;
4、分别计算两篇文档的TFIDF权重,即每篇文档中所有词汇的TFIDF和;
5、使用公共词汇的权重分别对两篇文档的权重求模,并计算它们的乘积;
6、乘积即为两篇文档的相似度;

 

算法的理论依据是,TFIDF权重越高的词,其在文章中代表意义就越大,由此,假设我们拥有了一个标准的TFIDF词库,那么我们就可以在将文章分词后,将其向量化,并加权后虚拟成一个面积,两篇文章公共的部分,也可以虚拟成一个面积值,根据概率论的概率分布理论,公共部分在两个面积中出现的概率的乘积,即为二者的相似程度。

 

 

算法代码

 

 

Java代码   收藏代码
  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. }  

 

 

测试结果截图:

 

 

 

 

测试中使用到两篇文档来自百度新闻,在附件中有,感兴趣的同学可以看一下内容,然后评判上述结果是否准确。

 

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

 

 

 

 

算法优劣

 

相似度计算的算法极为简单,但是对依赖的词典要求很高,算法中使用的"自由自在词典.dic"是作者的另外一个工具根据爬虫收集的海量资讯信息抽取好统计出来的,包含了词汇及其TF、IDF权重值,旨在为分析器提供一个中立的、与被分析文档无关的TF/IDF权重词库。附件中顺便提供了一份小的词典样例,随着分析工具分析资讯信息的数量的不断增加,词库也将不断扩大。

 

 

个人总结

 

虽然目前来看,效果还可以,但是我认为还有以下几个方面应该改进:
1、扩大停用词库,增加噪音词库,降低无用词汇的干扰;
2、扩大TFIDF词库,同时标注词性,我认为特殊词性的词汇在不同场合应该特殊处理,如名词、动词和专用词汇在相似性计算中应该被加权;
3、增加近义词库和转换词库(比如美方=美国,华盛顿=美国,北京=中国,叙=叙利亚等等),据我预测,在多数场合中,合并近义词、转换词可以提高计算结果的精确度;

好吧,就先总结这么多吧,希望能够抛砖引玉,为大家提供一点思路。

 

原创文章,转载请注明出处:http://www.yshjava.cn/post/332.html

 

  • 测试语料.rar (3.5 KB)
  • 下载次数: 42
  • 自由自在词典.rar (1 MB)
  • 下载次数: 54
  • 查看图片附件

这篇关于文本去重第一步:基于内容的文本相似性计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1037729

相关文章

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

XTU 1237 计算几何

题面: Magic Triangle Problem Description: Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU. Huangriq works in a big compa

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

计算数组的斜率,偏移,R2

模拟Excel中的R2的计算。         public bool fnCheckRear_R2(List<double[]> lRear, int iMinRear, int iMaxRear, ref double dR2)         {             bool bResult = true;             int n = 0;             dou

Level3 — PART 3 — 自然语言处理与文本分析

目录 自然语言处理概要 分词与词性标注 N-Gram 分词 分词及词性标注的难点 法则式分词法 全切分 FMM和BMM Bi-direction MM 优缺点 统计式分词法 N-Gram概率模型 HMM概率模型 词性标注(Part-of-Speech Tagging) HMM 文本挖掘概要 信息检索(Information Retrieval) 全文扫描 关键词

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro