文本相似算法

公司有很多场景需求,都需要用到了文本相似比对的算法。文本相似度算法比较常用的有余弦相似度,simHash算法,对文本特征处理的过程中,也有很多骚操作可以有效提升某些场景下的比对准确率。


余弦相似度算法

基本的文本相似比对过程:

  1. 文本预处理,包含分词,停用词过滤, 特征工程,文本特征提取。
  2. 词向量转换,建立词典。
  3. 如果只是两两文本比对,那直接用余弦相似算法计算两个向量的余弦夹角即可。如果需要在海量文本中做相似查询,那还需要建立一个相似矩阵(Similarity Matrix), 这样对于新增文本,可以用过Similarity Matrix快速计算相似度。

在文本预处理的过程中,文本分词准确率是后期所有工作的基础,如果用了一个性能较差的分词器,后期处理过程中就会非常麻烦,不管怎么做算法调优,准确性都上不去。 比较简单的常见方法是,导入一些场景专用词库,结合需求过滤掉一些无意义的词和符号。这些操作,都可以一定程度上提高最终模型的精度。

是否要做特征工程,文本特征提取,是结合场景需求来决定的。在文本两两比对的情况下,可以直接将分词的结果作为特征进行计算。但在文本量比较大的情况下,不做特征提取,一个词向量的长度可能会达到几十万,这就大大增加了硬件设备的要求。对于这种情况LSI的主题模型是很好的解决方法,这个模型可以将特征维度降低到几千,几百,大大降低硬件需求,提升最终模型的响应速度。但这个模型的缺陷在于,LSI降维导致的维度损失,会使得极少量的文本,即便内容相近,相似度结果也很低。
LDA模型也可以完成类似功能,但最终准确率不如LSI.
还有一个降低高频词对最终结果的影响方法是tf-idf,这个方法是很多词向量构建过程的标配。

以上是余弦相似的计算算法,个人觉得更加适合短文本判断,当然长文本也可以分解为短文本再处理。

SimHash算法

SimHash算法是Google出的一种算法, 中文有种翻译叫 局部敏感哈希。这个算法设计非常优雅,它将文本转换为64位的局部敏感hash值(当然也可以是128位,但一般用64位), 通过比较hash值的海明距离,来判断文本是否相似。

因为是位计算,它的处理速度,处理能力都非常快。在某一个项目中,项目现场的设备非常烂,但客户要求又非常高。几十万条文本的相似查询,还有业务相关查询整合,要做到3s内响应完成。于是我重写了相关算法和业务查询,通过simhash去做相似文本比对。30w条文本的相似查询, 还有复杂的业务逻辑判断,在普通i5笔记本上2s就完成了。

Simhash在判断相似文本时,需要设置海明距离,Google在搜索引擎中的网页去重中,默认设为3就能去除重复页面。 但对于短文本的处理,海明距离要设置的稍微高一些,才能把近似但不完全相同的文本给查询出来。

Simhash还有一个非常适用的场景,就是在高级爬虫中,用于判断某个网页内容是否爬过。

你可能感兴趣的:(文本相似算法)