文本相似度判定

简介

针对文本相似判定,本文提供余弦相似度和SimHash两种算法,并根据实际项目遇到的一些问题,给出相应的解决方法。经过实际测试表明:余弦相似度算法适合于短文本,而SimHash算法适合于长文本,并且能应用于大数据环境中。

余弦相似度

原理

余弦定理:

                  

图-1 余弦定理图示

性质:

余弦值的范围在[-1,1]之间,值越趋近于1,代表两个向量的方向越趋近于0°,他们的方向更加一致,相应的相似度也越高。需要指出的是,在文本相似度判定中,因为文本特征向量定义的特殊性,其余弦值范围为[0,1],即向量夹角越趋向于90°,则两向量越不相似。

向量空间模型

VSM(Vector Space Model)把对文本内容的处理简化为向量空间中的向量运算。

概念:

1)文档(D):泛指文档或文档片段,一般表征一篇文档。

2)词汇(T):文本内容特征的基本语言单位,包含字、词、词组或短语。

3)权重(W):表征词汇T的权重,在文档D中的重要程度。

权重:

目前表征一个字词在一个文本集或者语料库中某篇文本中的重要程度的统计方法为TF-IDF(term frequency–inverse
document
frequency),词汇的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降,详细内容在此不赘述。但是本文在实际项目中面临的问题是,文本集是变动的,而且变化速率比较快,因此并不适用于采用TF-IDF方法。本文采用非常简单直观的方法,即以词频来表征该词汇在文本中的重要程度(即权重)。

向量对齐:

由于在实际应用中,表征文本特征的两个向量的长度是不同的,因此必然需要对上述向量进行处理。目前存在两种方法:1)剔除掉向量中不重要的词汇,从而使得两个向量长度保持一致,目前主要依靠经验设定一些关键词来处理,但是其准确率不可保证;2)归并向量,并根据原向量是否在新向量(归并后的向量)存在,若存在则以该词汇的词频来表征,若不存在则该节点置为0,示例如下:

Text1: 我/是/中国人/

Text2: 我们/是/中国人/

Vector: 我/是/中国人/我们/

Vector1 = (1, 1, 1, 0)

Vector2 = (0, 1, 1, 1)

上述“/”为采用IK分词,智能切分后的间隔符,则归并后的向量如Vector所示,对齐后的向量分别为Vector1 和Vector2。之后则根据两向量的余弦值确定相似度。

文本特例

由于在实际项目中,本文发现了2个特例,并相应给出了解决方案。

1)长句包含短句(无需完全包含):

Text1:“贯彻强军目标出实招用实劲 努力开创部队建设新局面”

Text2:“在接见驻浙部队领导干部时强调 贯彻强军目标出实招用实劲 努力开创部队建设新局面”

上述两个文本为网络上实际的网页标题,若简单以余弦相似度来判定,其误判率是比较高的。本文解决方案为:若长句长度(中文切分后以词汇为单位表征,并非以字符为单位)为短句的1.5倍,则针对长句选定短句长度的文本内容逐个与短句进行相似度判定,直至长句结束,若中间达到预设的阈值,则跳出该循环,否则判定文本不相似。

2)文本中存在同义表述

Text1:“台湾居民明日起持台胞证可通关 无需办理签注”

Text2:“明起台胞来京无需办理签注 电子台胞证年内实施”

上述两个文本中“台胞”和“台湾居民”,“明日起”和“明起”为同义表述,可以理解为近义词,但不完全为近义词范畴。本文解决方案为引入同义词词典,鉴于中文词汇的丰富性,其能在一定程度上缓解,仍然不是根本解决之法。

应用场景及优缺点

本文目前将该算法应用于网页标题合并和标题聚类中,目前仍在尝试应用于其它场景中。

优点:计算结果准确,适合对短文本进行处理。

缺点:需要逐个进行向量化,并进行余弦计算,比较消耗CPU处理时间,因此不适合长文本,如网页正文、文档等。

余弦相似度算法源程序:

 Class Element

 Class TextCosine

备注:同义词词典“synonyms.dict”文件较大,完全可以自己构建,在此就不赘述了。

SimHash

SimHash为Google处理海量网页的采用的文本相似判定方法。该方法的主要目的是降维,即将高维的特征向量映射成f-bit的指纹,通过比较两篇文档指纹的汉明距离来表征文档重复或相似性。

过程

该算法设计十分精巧,主要过程如下:

1.  文档特征量化为向量;

2.  计算特征词汇哈希值,并辅以权重进行量化;

3.  针对f-bit指纹,按位进行叠加运算;

4.  针对叠加后的指纹,若对应位为正,则标记为1,否则标记为0。

备注:此处f-bit指纹,可以根据应用需求,定制为16位、32位、64位或者其它位数等。

   
 如图-2所示,为SimHash作者Charikar在论文中的图示,本文结合实际项目解释如下:Doc表征一篇文本,feature为该文本经过中文分词后的词汇组合,按列向量组织,weight为对应词汇在文本中的词频,之后经过某种哈希计算得出哈希值,见图中1和0的组合,剩余部分不再赘述。需要指出,Charikar在论文中并未指定需要采用哪种哈希函数,本文作者认为,只要哈希计算值能够均衡化、分散化,哈希函数可以根据实际应用场景进行设计,本文在实际的项目中自行设计哈希函数,虽未经过完全验证,但是测试结果表明,该函数当前能够满足需求。

图-2 SimHash处理过程

汉明距离

汉明距离应用于数据传输差错控制编码,它表示两个(相同长度)字对应位不同的数量。鉴于SimHash最后计算出的指纹采用0和1进行组织,故而用其来衡量文档相似性或者重复性,该部分详细内容在此不再赘述。

应用场景与优缺点

本文目前将该算法应用于话题发现和内容聚合等场景中,同时也在尝试其它应用场景。

优点:文本处理速率快,计算后的指纹能够存储于数据库,因此对海量文本相似判定非常适合。

缺点:由于短文本的用于哈希计算的数据源较少,因此短文本相似度识别率低。

SimHash算法源程序:

 Class TermDict

 Class SimHash

备注:源程序中“131313”只是作者挑选的一个较大的素数而已,不代表特别含义,该数字可以根据需求进行设定。

作者:刘 勇

来源:51CTO

时间: 2025-01-31 10:18:17

文本相似度判定的相关文章

文本相似度计算基本方法小结

在计算文本相似项发现方面,有以下一些可参考的方法.这些概念和方法会帮助我们开拓思路. 相似度计算方面 Jaccard相似度:集合之间的Jaccard相似度等于交集大小与并集大小的比例.适合的应用包括文档文本相似度以及顾客购物习惯的相似度计算等. Shingling:k-shingle是指文档中连续出现的任意k个字符.如果将文档表示成其k-shingle集合,那么就可以基于集合之间的Jaccard相似度来计算文档之间的文本相似度.有时,将shingle哈希成更短的位串非常有用,可以基于这些哈希值的

文本相似度结合PageRank算法

目标 尝试了一下把PageRank算法结合了文本相似度计算.直觉上是想把一个list里,和大家都比较靠拢的文本可能最后的PageRank值会比较大.因为如果最后计算的PageRank值大,说明有比较多的文本和他的相似度值比较高,或者有更多的文本向他靠拢.这样是不是就可以得到一些相对核心的文本,或者相对代表性的文本?如果是要在整堆文本里切分一些关键的词做token,那么每个token在每份文本里的权重就可以不一样,那么是否就可以得到比较核心的token,来给这些文本打标签?当然,分词切词的时候都是

文本相似度的最后的精准率和召回率怎么实现啊?

问题描述 文本相似度的最后的精准率和召回率怎么实现啊? 利用tf-idf算法和余弦相似度算法计算了文本之间的余弦相似系数,可是结果出来了,不知道结果的好坏啊,请问大神们有没有知道怎么评测结果的好坏啊?上网查到可以计算精准率与召回率,这个用Python怎么实现啊? 解决方案 Python没有相应的例子,建议你根据以下内容自己写吧 http://blog.sina.com.cn/s/blog_4b59de070100ehl7.html

性能测试-文本相似度分析的性能检测?

问题描述 文本相似度分析的性能检测? 利用tf-idf算法和余弦相似度算法计算了文本之间的相似度,可是结果出来了,不知道结果的好坏啊,请问大神们有没有知道怎么评测结果的好坏啊? 解决方案 分析算法复杂度.如果算法太复杂,分析起来有困难,评价算法的好坏就是给数据量大小不等的测试样本,运行得到耗费的时间. 对数据量和运行时间的曲线拟合. 糟糕的算法就是随着数据量的增加,时间或者存储的开销呈现几何级数地发散出去. 好的算法是,时间随着数据的增加,呈现常数.收敛在某个值或者是线性增加的. 解决方案二:

【BABY夜谈大数据】计算文本相似度

简单讲解 上一章有提到过[基于关键词的空间向量模型]的算法,将用户的喜好以文档描述并转换成向量模型,对商品也是这么处理,然后再通过计算商品文档和用户偏好文档的余弦相似度. 文本相似度计算在信息检索.数据挖掘.机器翻译.文档复制检测等领域有着广泛的应用. 比如舆论控制,我们假设你开发了一个微博网站,并且已经把世界上骂人的句子都已经收录进了数据库,那么当一个用户发微博时会先跟骂人句子的数据库进行比较,如果符合里面的句子就不让用户发出. 通常情况下,很多工程师就会想到用like或者where的sql语

PostgreSQL 文本数据分析实践之 - 相似度分析

背景 在日常的生活中,我们可能会经常需要一些像相近.相仿.距离接近.性格接近等等类似这样的需求,对数据进行筛选. 这些需求PostgreSQL居然都支持,是不是很变态. 变态的例子 这些场景都支持索引排序和检索,否则怎么叫变态呢. 按长相相似度排序 比如最近的王宝强和马蓉的事件,估计很多人会拿宋喆的照片进行相似度的搜索,八卦八卦. 说起图像搜索,我前几天才写了一篇这样的文章,是关于在PG数据库中使用图像搜索插件的文章. <弱水三千,只取一瓢,当图像搜索遇见PostgreSQL(Haar wave

[python] Kmeans文本聚类算法+PAC降维+Matplotlib显示聚类图像

0 前言 本文主要讲述以下几点:        1.通过scikit-learn计算文本内容的tfidf并构造N*M矩阵(N个文档 M个特征词):        2.调用scikit-learn中的K-means进行文本聚类:        3.使用PAC进行降维处理,每行文本表示成两维数据:        4.最后调用Matplotlib显示聚类效果图. 文章更详细的内容参考:http://blog.csdn.net/eastmount/article/details/50473675由于涉及

LSF-SCNN:一种基于CNN的短文本表达模型及相似度计算的全新优化模型

本篇文章是我在读期间,对自然语言处理中的文本相似度问题研究取得的一点小成果.如果你对自然语言处理 (natural language processing, NLP) 和卷积神经网络(convolutional neural network, CNN)有一定的了解,可以直接看摘要和LSF-SCNN创新与技术实现部分.如果能启发灵感,应用于更多的现实场景中带来效果提升,那才是这篇文章闪光的时刻.如果你没有接触过NLP和CNN,也不在担心,可以从头到尾听我娓娓道来.有任何问题,欢迎交流. 1. 摘要

语料库-Python怎么删除文本中的所有标点符号?

问题描述 Python怎么删除文本中的所有标点符号? 想要把一大段中文文本中所有的标点符号删除掉,然后分词制作语料库使用,大神们有没有办法呢?或者哪位大神有中文语料库给个链接好不好?我想做新闻的文本相似度分析,提取关键词的时候需要语料库.谢谢大神们~~~~~ 解决方案 既然你要语料库,程序就不是必须的了,用ultraedit之类的工具,内置批量替换功能,运行下即可. 解决方案二: http://www.mathackers.com/2015/01/nlpy-corpora/ 解决方案三: 英文的