当前位置: 首页 > 科技观察

文本相似度判断介绍

时间:2023-03-16 17:19:48 科技观察

对于文本相似度判断,本文提供了余弦相似度和SimHash两种算法,并根据实际项目中遇到的一些问题给出了相应的解决方案。实际测试表明,余弦相似度算法适用于短文本,而SimHash算法适用于长文本,可以应用于大数据环境。余弦相似原理余弦定理:图-1余弦定理图形性质:余弦值的取值范围在[-1,1]之间,值越接近1,两个向量的方向越接近0°,它们的方向越一致,相应的相似度就越高。需要指出的是,在文本相似度的判断中,由于文本特征向量定义的特殊性,余弦取值范围为[0,1],即向量之间的夹角越接近90°,两个向量越不相似。向量空间模型VSM(VectorSpaceModel)简化了将文本内容处理成向量空间中的向量操作。概念:1)文档(D):泛指文档或文档片段,一般表示一个文档。2)词汇(T):文本内容特征的基本语言单位,包括词、词、词组或词组。3)权重(W):表示词汇T及其在文档D中重要性的权重。权重:目前表征一个词在文本集中或文本在语料库中重要性的统计方法是TF-IDF(termfrequency-inversedocumentfrequency),而一个词的重要性取决于它在文件中出现的次数,它成正比增加,但同时会与其在语料库中出现的频率成反比地降低,而此处不再详述。但是本文在实际项目中面临的问题是文本集是变化的,变化的速度比较快,所以不适合使用TF-IDF的方法。本文采用了一种非常简单直观的方法,即用词频来表征词在文本中的重要性(即权重)。向量对齐:由于在实际应用中,表示文本特征的两个向量的长度不同,因此需要对上述向量进行处理。目前有两种方法:1)剔除向量中不重要的词,使两个向量的长度一致。目前主要是靠经验设置一些关键字来处理,但不能保证其准确性;2)合并向量,并根据原向量是否存在于新向量(合并后的向量)中,如果存在则以词表的词频为特征,如果不存在则设置节点为0,例子如下:Text1:I/Yes/Chinese/Text2:We/are/Chinese/Vector:I/are/Chinese/we/Vector1=(1,1,1,0)Vector2=(0,1,1,1)上面的“/”是带IK的分词,智能分割后的spacer,合并后的向量显示为Vector,对齐后的向量分别为Vector1和Vector2。然后根据两个向量的余弦值来判断相似度。文特例因为在实际项目中,本文发现了两个特例,并给出了相应的解决方案。1)长句含短句(不必全部包括):Text1:“践行强军目标,扎扎实实开创军队建设新局面”Text2:“在会见全军领导干部时驻浙江部队,着重落实强军目标实招实干开创军队建设新局面”以上两段文字为网络实际网页标题。如果单纯以余弦相似度来判断,误判率比较高。本文的解决方案是:如果长句的长度(以中文分词后的词汇为单位表征,不以字符为单位)是短句的1.5倍,则选取的短句长度的文本内容为长句与短句一一比较。判断相似度直到长句结束。如果中间达到预设阈值,则跳出循环,否则判断文本不相似。2)正文中有同义词正文1:“台湾居民明天起可凭台胞通行证通关,无需签注”正文2:“台胞明日起进京无需办理签注。电子台胞证”将在今年内实施。”以上两段文字中,“台湾同胞”与“台湾居民”、“从明天”与“从明天”为同义词,可以理解为近义词,但不完全属于近义词的范畴。本题的解决办法paper是介绍同义词词典,鉴于中文词汇丰富,可以一定程度上缓解,但仍然不是根本解决方案应用场景及优缺点本文目前将该算法应用于网页titlemergingandtitleclustering,还在尝试应用到其他场景中。优点:计算结果准确,适合处理短文本。缺点:需要一个一个向量化和余弦计算,比较消耗CPU处理时间,所以不适合长文本,比如网页,文档等。  余弦相似度算法源程序:类ElementClassTextCosine  备注:同义词词典“synonyms.dict”文件比较大,可以自己建,这里就不赘述了。SimHashSimHash是Google为处理海量网页而采用的文本相似度判断方法。该方法的主要目的是降维,即将高维特征向量映射为f位指纹,通过比较两个文档指纹的汉明距离来表征文档重复或相似性。过程算法设计的很精巧,主要过程如下:1.将文档特征量化为向量;2、计算特征词汇的哈希值,并用权重进行量化;3、对于f位指纹,进行逐位叠加运算;4.对于叠加指纹,如果对应的位为正,则标记为1,否则标记为0。  备注:这里的f位指纹可以自定义为16位,32位,64位-位或其他数字根据应用要求。如图-2所示,是论文中SimHash的作者Charikar的图。本文结合实际项目解释如下:Doc代表一段文本,feature是文本经过中文分词后的词汇组合,按列向量组织,weight是对应文本中词汇的词频,hash值是经过某种hash计算得到的,见图中1和0的组合,其余不再赘述。需要指出的是,Charikar并没有在论文中具体说明使用哪个哈希函数。本文作者认为,只要哈希计算值能够做到均衡、去中心化,就可以根据实际应用场景来设计哈希函数。哈希函数是我们自己设计的。虽然还没有完全验证,但是测试结果表明该功能目前可以满足需求。图2SimHash处理过程汉明距离汉明距离应用于数据传输差错控制编码,表示两个(相同长度)字对应的不同比特数。由于SimHash***计算出的指纹是按0和1组织的,所以用来衡量文档的相似度或重复度,这部分的细节这里不再赘述。应用场景及优缺点本文目前将该算法应用于主题发现、内容聚合等场景,同时也在尝试其他应用场景。优点:文本处理速度快,计算出的指纹可以存入数据库,非常适合海量文本的相似度判断。缺点:由于短文本哈希计算的数据源较少,短文本相似度识别率较低。  SimHash算法源程序:ClassTermDictClassSimHash  备注:源程序中的“131313”只是作者选取的一个大素数,不代表特殊含义。这个数量可以根据需要设置。