海量数据相似度匹配问题

现有数据7千万行, 想通过一个短语进行海量数据的相似度匹配。有没有相应的解决思路呢?

之前应用都是几千行数据,并且根据业务数据量不会大幅度增长,所以每次都是遍历所有数据进行相似度计算,取相似度高的几十行。 如果有海量数据,有没有相应的解决方案呢?

1 Like

可以先走搜索引擎,快速召回100条数据,然后在这100条数据中庸相似度计算方法找前几十条,这样可以一定程度上保证速度.
缺陷就是如果搜索结果的100条中不包含最相识的那部分数据,那么结果可能不会很好,这个可以通过优化搜索方式来缓解

2 Likes

我目前采用的就是这个方案,效果非常差。一个可以参考的思路是,计算出目标库的词向量存储到db,然后实时match的时候,用同一个模型算出target sequence的词向量,对词向量进行空间距离计算。

1 Like

这个问题我在使用的时候也有这个情况出现,当时考虑的方法是先通过es获取相似度高的,取出再进行自己需要的相似度计算

可以了解一下faiss,facebook开源的向量搜索引擎,可以毫秒级返回结果。

1 Like

顺着你的线索,还发现了一个 https://github.com/milvus-io/milvus
号称比 faiss 还厉害
https://milvus.io/cn/docs/v0.9.0/about_milvus/overview.md

3 Likes

你好,欢迎关注Milvus项目。

Milvus向量搜索引擎就是为了加速海量向量数据的管理与搜索。
最初Milvus从单纯集成使用faiss算法库开始,目前已经做了不少优化,重写。另外Milvus也集成了annoy和hnswlib。

相关的ANN benchmark测试数据可以在这里找到:https://milvus.io/cn/docs/benchmarks_aws

如果觉得Milvus有帮到你,请在github上给我们点个星。

:blush:

3 Likes

我是这样做的,先以 bert 算出句向量,再以 faiss 来进行分桶索引,因为数据量还算大,所以我使用多部 ubuntu 主机进行faiss子索引的建立,最后再将这些子索引进行合并,至于相似比对后的索引号对应到原文句的部分你要自己处理,建议你以某个笔数为一个 chunk 来建立 mapping,句子的id直接mapping到chunk id,再直接换算 sub index,最多两次运算就可以找到原文。我的句子大约有 3 亿句,响应时间约在 0.03 ~ 0.05 秒,其实还可以更快(0.005秒左右),但 faiss 的部分因为某些原因,所以封闭了 gpu 的运算。至于句向量的质量如何,你可以自己评估,如果不满意 bert,可另选其它工具。

4 Likes

试试Milvus吧,你可以不用这么累的:blush:

针对这个具体的需求,能不能放个例子到你们的项目上面啊?

谢谢你,我看了一下介绍,有时间我会实作看看。

你好,可以参考一下这篇技术文章:

https://blog.csdn.net/weixin_44839084/article/details/105492068

2 Likes

:ok_hand::+1: