分享:如何实现一个高效率的查重系统?顺带问问各位 V 友大牛有没有更好的实现方式

2021-02-16 23:42:55 +08:00
 kwklover
因为最近做了个小项目,是一个站内查重系统(就是提交一个文档,判断这个文档与已有文档的重复率),因为预算不多,所以我想了个简单的实现方式:
1,把待查重的文档的前 N 字(比如前 300 字),拆解为 10 个句子,分别去站内搜索,得出一个疑似重复度高的集合。
2,把疑似集合的前 N 字与待分析文档,分别建立字表做准确分析,得出重复率百分比。

这个项目,开发周期一周,检测效果还行,但就是效率有点慢,百来万的数据量,每一个文档的检测需要几秒,而且还不是全文比对,做个了折中,检测前 N 字的做法。

各位 V 友大牛有没有更好的实现方式?
3103 次点击
所在节点    程序员
28 条回复
dongxiao
2021-02-17 21:57:25 +08:00
试试 Embedding+FAISS
igeeky
2021-02-17 22:25:21 +08:00
可以试试 postgresql. psql 支持文本相似度查询排序. 可以看看这个网页: https://developer.aliyun.com/article/59212
kwklover
2021-02-17 22:28:12 +08:00
@dongxiao
@igeeky
感谢,先保留,后续逐一研究学习。
yucongo
2021-02-17 23:47:58 +08:00
bert (或其他 embedding )+ faiss 或许可以一试。其实好像也可以利用 elasticsearch
BiteTheDust
2021-02-18 00:14:45 +08:00
从传统的字符串算法角度想了想
对每个已有的文档建后缀自动机 然后用于查询的文档去对后缀自动机进行匹配 失配后回到原点重新继续匹配
这样如果得到一些比较长的匹配结果就可以认为重复度比较高
得到很多零碎的短匹配或者跟本匹配不上则可以认为重复度比较低
时间复杂度的话与查询文档的大小 len 和已有文档的个数 n 相关 O(len*n)
FrankAdler
2021-02-18 04:24:21 +08:00
布隆过滤器和 SimHash 以及完整 hash 是可以嵌套过滤的
ddup
2021-02-18 12:24:15 +08:00
Lucene.NET 耗性能从大到小集中在几个地方:

1.分词
2.建立倒排索引
3.搜索

对于文档查重,可以在分词上做调整,是否有必要做细粒度的分词,比如是不是按句分词就够了(但是这样如果别人没有整句抄袭就无法检索到),那如果自定义一个粗粒度的分词器呢?


加上由于分词粒度粗了,同样大小内容的检索时间也会降低,可以检索更多句子。
Lemeng
2021-02-18 19:10:52 +08:00
我记得之前有个教程的,说是非常高效

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/753617

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX