为何要计算文档相似性
在今年年初的时候,我开始尝试做文本的自动聚类,当时是从网上,找到的一个K-Means算法,稍作了修改。从测试结果来看,分类效果不太好,究其原因,我认为有两个,一个是词库的问题,停用词词库太小,没有噪音词库,也没有近义词词库,最关键的是切出来的词,统计的TFIDF权重不准确,第二个原因则是计算某文档与目标类别的相似度的算法不够合理。第一个问题经过两天多的尝试,于昨日解决了,剩下了第二个问题,真是让人头疼。
本来我已打算放一阵子的,但就在前几天Merry跟我讲了他文本去重的原理和一些细节问题,让我又重新燃起了希望。同时我也认为,计算文档相似度,不仅能够为去重提供重要依据,稍后也可以在文本分类/聚类上有所作为,于是,我打算抽一点点时间,去尝试一下。
算法模型
算法的模型,可以简单描述为:
1、加载与将要分析的文档无关的TFIDF词库、停用词库;
2、假设我们得到的是两篇正常的文档,首先切词,去除停用词;
3、抽取两篇文档中的公共词汇,计算它们的TFIDF权重和;
4、分别计算两篇文档的TFIDF权重,即每篇文档中所有词汇的TFIDF和;
5、使用公共词汇的权重分别对两篇文档的权重求模,并计算它们的乘积;
6、乘积即为两篇文档的相似度;
算法的理论依据是,TFIDF权重越高的词,其在文章中代表意义就越大,由此,假设我们拥有了一个标准的TFIDF词库,那么我们就可以在将文章分词后,将其向量化,并加权后虚拟成一个面积,两篇文章公共的部分,也可以虚拟成一个面积值,根据概率论的概率分布理论,公共部分在两个面积中出现的概率的乘积,即为二者的相似程度。
算法代码
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package cn.ysh.studio.text.cluster.main; import cn.ysh.studio.text.cluster.TFIDFHelper; import cn.ysh.studio.text.cluster.core.Dictionary; import cn.ysh.studio.text.cluster.core.Document; import cn.ysh.studio.text.cluster.utils.FileHelper; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; /** * 计算两篇文档的相似度 * * @author 杨胜寒 */ public class SimpleComputeSimilarity { public static float repeatValue(Document doc1, Document doc2) { float keywordTFIDF = 0.0f; float doc1TFIDF = 0.0f; float doc2TFIDF = 0.0f; for (String word : doc1.getContentTerms().keySet()) { if (doc2.getContentTerms().containsKey(word)) { keywordTFIDF += doc1.getContentTerms().get(word); } doc1TFIDF += doc1.getContentTerms().get(word); } for (String word : doc2.getContentTerms().keySet()) { doc2TFIDF += doc2.getContentTerms().get(word); } return (keywordTFIDF / doc1TFIDF) * (keywordTFIDF / doc2TFIDF); } public static void main(String[] s) throws FileNotFoundException, IOException { // String docPath1 = "F:\\Workspaces\\NetBeansTest\\TextCluster\\txt\\洛阳空气质量差环保部门被批 环保局向市民道歉.txt"; // String docPath2 = "F:\\Workspaces\\NetBeansTest\\TextCluster\\txt\\洛阳空气质量差环保局公开道歉 细说原因对策.txt"; String docPath1 = "F:\\Workspaces\\NetBeansTest\\TextCluster\\txt\\英美媒体:美国暂时对南海争端避而远之.txt"; String docPath2 = "F:\\Workspaces\\NetBeansTest\\TextCluster\\txt\\美媒:黄岩岛争端结束中国获胜 美只求自由通航.txt"; Document doc1 = FileHelper.loadDocument(new File(docPath1)); Document doc2 = FileHelper.loadDocument(new File(docPath2)); Dictionary.getInstance().loadDictionary("F:\\Workspaces\\NetBeansTest\\TextCluster\\自由自在词典.dic"); Dictionary.getInstance().loadStopDictionary("F:\\Workspaces\\NetBeansTest\\TextCluster\\txt\\stopwords.txt"); long start = System.currentTimeMillis(); TFIDFHelper.tfidf(new Document[]{doc1, doc2}); float repeatValue = SimpleComputeSimilarity.repeatValue(doc1, doc2); long end = System.currentTimeMillis(); System.out.println("相似值:" + repeatValue + ",用时[" + (end - start) + "]毫秒!"); } }
测试结果截图:
测试中使用到两篇文档来自百度新闻,在附件中有,感兴趣的同学可以看一下内容,然后评判上述结果是否准确。
使用上述算法,对数据库中的18609篇新闻资讯进行相似度计算,输出相似度大于0.5的资讯的信息。截图如下:
算法优劣
相似度计算的算法极为简单,但是对依赖的词典要求很高,算法中使用的"自由自在词典.dic"是作者的另外一个工具根据爬虫收集的海量资讯信息抽取好统计出来的,包含了词汇及其TF、IDF权重值,旨在为分析器提供一个中立的、与被分析文档无关的TF/IDF权重词库。附件中顺便提供了一份小的词典样例,随着分析工具分析资讯信息的数量的不断增加,词库也将不断扩大。
个人总结
虽然目前来看,效果还可以,但是我认为还有以下几个方面应该改进:
1、扩大停用词库,增加噪音词库,降低无用词汇的干扰;
2、扩大TFIDF词库,同时标注词性,我认为特殊词性的词汇在不同场合应该特殊处理,如名词、动词和专用词汇在相似性计算中应该被加权;
3、增加近义词库和转换词库(比如美方=美国,华盛顿=美国,北京=中国,叙=叙利亚等等),据我预测,在多数场合中,合并近义词、转换词可以提高计算结果的精确度;
好吧,就先总结这么多吧,希望能够抛砖引玉,为大家提供一点思路。
原创文章,转载请注明出处:http://www.yshjava.cn/post/332.html
相关推荐
文本去重涉及自然语言处理(NLP)技术,目的是从大量文本数据中删除重复内容,以提高数据的有效性和质量。本文档介绍了基于语义指纹和最长公共子串(Longest Common Substring, LCS)算法的中文文本去重方法,详细...
8. **用户体验**:一个良好的文本去重工具还应具备用户友好的界面,方便上传、预览和导出结果。 9. **错误处理与日志记录**:在软件开发中,错误处理和日志记录至关重要,它们可以帮助开发者追踪和修复问题。 在...
### 百度长文本去重方法详解 #### 一、背景与挑战 在当前互联网环境中,原创内容面临着严重的抄袭问题。这种现象不仅损害了原创作者的权益,也给搜索引擎带来了挑战,尤其是对于像百度这样的大型搜索引擎来说,...
根据提供的文件内容,本篇论文主要研究了互联网新闻中焦点新闻文本去重的问题,着重于使用最长公共子序列(LCS)算法结合新闻发布的时间点来提高去重的效率和准确性。下面是对该论文中涉及知识点的详细说明。 1. ...
大批量文本去重脚本,效率恐怖,秒对数百万条数据去重
JAVA文本去重查重判断文件重复工具程序源代码 查重是指对文本、论文、作业等进行重复率检测,以防止学术不端和抄袭。查重主要是通过计算机程序对文本进行比对,发现文本中相似或完全相同的部分,生成重复率报告。 ...
【高效的文本去重源码VC】是一个基于Visual C++(VC)开发的程序,用于解决大量文本数据中的重复内容问题。在处理大量文本数据时,去重是一个关键步骤,尤其在搜索引擎索引、数据清洗、日志分析等领域,能够有效地...
### 基于全信息的网络文本信息去重算法研究 #### 一、研究背景与意义 ...通过以上改进措施,可以使得基于全信息的网络文本信息去重算法更具实用性和普适性,为Web信息采集系统的优化提供有力的技术支撑。
例如,可能有需求将特定的字符串替换为其他内容,或者按照特定规则对文本行进行排序,这些都可以在同一个软件中实现,进一步增强其实用性。 至于本文提到的“TXT文本行去重工具1.01.exe”,这很可能是该工具的可...
狼军文本去重小工具是一款完全绿色免费的txt文本去重复软件。通常我们下载的txt文件里都存在大量的重复文本,这些重复的资料浪费我们的时间和内存,狼军文本去重小工具就能帮你解决这些问题。软件操作简单,只要导入...
为了优化这个问题,本文深入研究了基于Simhash算法的文档相似性计算技术,并提出了一种改进方案。 Simhash算法是一种局部敏感哈希算法,它能够将文本数据转换为哈希指纹(fingerprint),通过比较这些指纹来评估...
Python库,可以计算两个文本之间的四种相似性指标:Cosine相似性、Jaccard相似性、最小编辑距离和微软Word中的track changes。该库可以用于中文和英文文本的相似性分析。 主要功能点 计算两个文本之间的Cosine相似性...
对于文本数据,去重通常基于特定的字段,比如文章标题、作者名或全文内容的哈希值。 结合提供的压缩包文件名,我们可以推断这可能是一个用于文本处理的小型应用程序,可能包含以下功能: - "文本的分割,去重复.exe...
工作中常常需要处理大量的客户手机号、客户QQ号、邮箱还有一些大量的文本数据。 如果只是几下kb的数据量去重,处理起来是很容易也很快...注意:思途高效文本去重,是基于内存运算,处理超过百兆数据时,需要内存大些。
- **TF-IDF和余弦相似性**:在大规模文档集合中,通过计算文档的TF-IDF值并计算两两之间的余弦相似度,可以找出相似度较高的文本,进而判断重复。 2. **数据结构与算法**: - **布隆过滤器**:一种空间效率极高的...
Simhash算法是一种局部敏感哈希算法,广泛应用于文本去重领域。随着大数据时代的到来,信息量爆炸式增长,数据存储空间和时间成本受到重视,因此,如何在有限的资源中存储更多有效精炼的信息成为了研究的热点。文本...