海量文本相似度

最近在做海量文本相似度的比较,我看书里面只有简单的两个文本相似度的比较;我希望可以用自己的数据来训练一个模型出来,hanlp有没有这方面的资料呢?

  1. 你可以训练词向量或RNN语言模型等,计算两两之间的相似度。这样的相似度计算必然是 O(n^2) 的。
  2. 受限玻尔兹曼机是 O(n) 的,为每个文档计算一个二进制语义哈希值。可能更适合海量文档。

您的意思是,在统一词库的基础上,对每个文档计算哈希值,并将哈希值存储起来,后期通过比较哈希值是否相近来判断文档是否相似,是这样理解吗?

https://www.hankcs.com/ml/hinton-modeling-hierarchical-structure-with-neural-nets.html/2

simhash ,Google 用来做网页去重的算法,本质上是一个局部敏感哈希算法加倒排索引。

1 Like

我现在用的simhash算法做的数据排重,效果上还可以,准确率上70%左右吧,因为内容上长度不一

我现在是这么处理的:对所有的文档进行simhash计算;并将待比较文档的simhash值与所有文档的simhash进行余玄相似度比较,得到相似度;并计算simhash的汉明距离。

请问你们是怎么处理的?

海量数据情况下,其实有一个情况是,相似矩阵是稀疏的,也就是说任给一个文档,它和绝大多数文档都是不相似的,没有必要浪费时间去计算。

基于这个前提,simhash 算法不光是将文本表示成哈希值这一步,还有哈希值的分段索引,常见的做法是将一个 64 位的哈希值切成四段,每段作为 key,映射到包含这 16 位的所有哈希值上。当然这样是会带来问题的,有可能一些相似文档的哈希值有一两位不一样会没法召回,想要精确一点的话可以减小粒度,比如 4 位一段,不过这个会带来更多的存储消耗。

这个思路其实就是搜索引擎里的倒排索引思想:先建索引,然后检索,然后计算相似。

基于这个思路,你也可以不用 simhash,基于字或词建立倒排索引,检索出来后再用任意一种方法去计算相似。

按照您的思路,就是直接用搜索引擎来替换查找相似文档的功能;排在最前面的文档,相似度较高。是这样吧。

不完全是。

核心的思想是相似矩阵是稀疏的,把那些不相关的去掉。利用信息检索方法是一种思路,但信息检索所使用的相似计算方法不一定很合适,可以只用它来找候选,找到候选集后相当于缩小了范围,这个时候再去用适合你的场景的方法计算相似。

当然如果你对结果质量要求不高,直接用 Elasticsearch、Lucence 之类的现成的搜索引擎,也可以,取决于你的需求。

好的,你这个思路好像也不错。我会试试

相似度计算是知识处理的关键课题,涉及中文信息处理,文本分类,机器翻译等许多方面。应当引起所有群友的重视。
海量文本需要分级处理,以缩小计算规模。
建议用文本数量的对数分级
一级:几十篇文本
二级:几百篇文本
三级:几千篇
四级:几万篇
五级:几十万篇
一万篇文献乘以承一万就是一亿个相似度数据,需要大型计算机支持。建议取文本标题,或者取文本关键词联合并进行分级计算。
另一个思路是先分类后计算。

1 Like

转化成向量后用faiss,annoy 求各种向量的匹配
或者国内的milvus(就是封装了faiss,annoy)

使用各种ANN框架吧,https://github.com/erikbern/ann-benchmarks