背景
最近工作中遇到了一个问题:如何对大规模题库去重?公司经过多年的积累,有着近亿道题目的题库,但是由于题目来源不一导致题库中有很多重复的题目,这些重复的题目在检索时,除了增加搜索引擎的计算量外,并不会提高准确率。
此外由于题目过多,搜索引擎往往采取了截断策略,只对一部分题目进行计算,这导致了某些正确的题目反而得不到计算,拍搜准确率甚至不增反降。所以对于一个搜索引擎来说,虽然初期增加题目数量往往可以大幅提高拍搜准确率,但是当题目量大到一定程度时,反而会由于计算量跟不上导致准确率下降。如何尽可能的去除重复题目显得尤为重要。
一些尝试方案
比较MD5值
对每道题目计算其MD5值作为签名,这样在新增题目时,只要判断题库中是否有相同的MD5值即可。
这种方案只适用于两道题目一模一样的情况,而现实中题目往往不只是这样。
-
“A比B大10"与"B比A小10”
-
“小红买10本书”与“小明买10本书”
-
“今天空气温度为10度”与“今天的空气温度为10度”
这些应该是重复题,但是MD5值不同,没法去重。
利用最长公共子序列和最小编辑距离算法
利用最长公共子序列算法与最小编辑距离算法计算两个题目的相似度,如果相似度大于一定比例,例如大于90%,就认为是重复的题目。
这个方法理论上可行,但是计算量太大。假如文档数为N,平均文档长度为M,那么计算量大致为:O(N2∗M2) 。
假设N=1000万,M=200,则计算量约为 4∗1018 ,笔者线下