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

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

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

各位 V 友大牛有没有更好的实现方式?
3089 次点击
所在节点    程序员
28 条回复
siyemiaokube
2021-02-17 03:42:17 +08:00
随便 yy 了一下:
词袋记录常见词,给站内文章打 tag,分别建索引

然后把 input 随便剪一剪,分别词袋,根据 tag 对应的索引列表比对?
sampeng
2021-02-17 08:40:49 +08:00
简单的向量相似性即可…
sampeng
2021-02-17 08:42:46 +08:00
每个文档提交的时候酸一个向量值。查重就是比一下得事。应该飞快。比你查前 300 字,拆句,搜索快 n 倍。算法不超过 100 行代码
xuanbg
2021-02-17 09:04:37 +08:00
根据关键词的权重计算向量
jeeyong
2021-02-17 09:20:05 +08:00
jieba 分词, 把所有得词标号, 如果没有, 给一个新的.
之后整篇文章获得一个类似[0, 25, 37, 178, 3578]得数组, 就是 2 楼说的向量了..
后面不会了..谁来给我补补课..
neoblackcap
2021-02-17 09:46:09 +08:00
snap 很多 bug,又不修。安装完系统第一件事就是卸装它
DoctorCat
2021-02-17 09:58:26 +08:00
simhash
laminux29
2021-02-17 11:19:35 +08:00
查重就没办法高效率,高效率的查重准确度不高。连谷歌处理这事都是砸钱去用空间换时间,没钱就只能消耗时间。
noqwerty
2021-02-17 12:16:42 +08:00
比较简单的办法是每个文档算 TF-IDF,然后用文档间的 cosine similarity 判断相似程度
taowen
2021-02-17 15:08:29 +08:00
https://twitter.com/slimsag/status/1360136379301199872 How do you check for existence of a key in a set with 100M keys, in only 125ns? Using Xor Filters
kwklover
2021-02-17 16:00:14 +08:00
@sampeng
向量的比较真的有那么高效?一百万多数据,先得建立一百多万的向量,然后每个文档与一百多万的向量做比较,效率真的能飞快?

刚开始的时候,也从网上看过一些文章,比如谷歌工程师写的按余弦夹角理论。但感觉实现起来比较复杂啊。


@jeeyong
分词的方式,依赖词库的分词方式,往往不太准确,结果就差别很大了,效果未必准确,小样本下测试偏差较大,大样本下没做测试,最后改为不分词,直接比较字。
kwklover
2021-02-17 16:04:56 +08:00
@jeeyong
我也不是专业 NLP,如果建立向量速度快,比较速度快,倒是可以研究一下。
通过搜索的方式+字表比较的方式也能解决问题,就是建立 Lucene 索引的过程也是很吃资源,很耗费时间的,不过就是搜索快。
ntest
2021-02-17 16:08:31 +08:00
用 SimHash 比较吧,每个文档生成一次就行了
kwklover
2021-02-17 16:34:00 +08:00
@ntest
网上搜索了一下 SimHash 的资料,大概就是给每个文档建立一个 Hash,然后比较,所以比较的实现方式决定了最终的效率,不过 SimHash 可以计算出相似,但是具体相似多少,没法得出。
dream4ever
2021-02-17 19:04:28 +08:00
吴军当年在谷歌黑板报上就写了相关的文章,印象中是用矩阵运算之类的方法解决的,感兴趣可以搜搜。
sampeng
2021-02-17 20:33:35 +08:00
@kwklover 又不是没次都是建 100 万次…每次入的时候计算一次这个新文档而已,就是第一次慢
sampeng
2021-02-17 20:36:18 +08:00
另外 ps…要测试速度很简单…做一百万次除法就是每次查重需要的时间和 cpu 消耗
jeeyong
2021-02-17 20:39:19 +08:00
@kwklover 哈? 我一直默认你得需求属于小打小闹那种...哈哈哈...打扰了, 惹不起惹不起
AX5N
2021-02-17 21:10:11 +08:00
这玩意是有算法的,建议去搜一下,不要自己想。
kwklover
2021-02-17 21:13:15 +08:00
@jeeyong 不是默认,本来就是小打小闹的,欢迎大牛提供好的思路,目前的解决方案,解决百来万级的数据查重,勉强够用,再上一个量级,比如千万级数据量,那肯定慢死了,就是想征集一下不同的思路和方案。

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

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

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

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

© 2021 V2EX