比较许多字符串的文本

时间:2014-01-07 19:58:05

标签: php sql ruby algorithm

假设我们在db中有很多行需要搜索重复项。

重复项被认为具有超过95%的文本匹配。

项目数量可以超过50000或更多,而项目不仅仅是1个单词,最多可以包含5000个字符。

找到这种重复文本的策略是什么?

我认为逐行选择行并将其与其他49999行进行比较是有效的,这只是简单的废话。

还有其他可能的解决方案吗?

3 个答案:

答案 0 :(得分:2)

您需要做的第一件事是定义“95%文本匹配”的含义。例如,请考虑以下事项:

The quick red fox jumped over the lazy brown dog.
The qZick rZd fox jumped over the lazy brown dog.

这两个句子每个长49个字符。它们的区别仅在于两个“Z”字符。因此47个字符是相同的,这意味着文本有95.92%的相似性。如果你按性格去做。

如果你逐字逐句,那么文本只有80%相似。

订单是否重要。假设您有一个长度为4,800个字符的文本。我们将该文字称为fixed。现在你被要求将它与前面两个单词的东西进行比较。那就是:

some stuff <fixed>

通过多种措施,这与fixed相似,超过95%。或者如何:

<fixed> some stuff

这与之前的fixed更相似吗?那个反转fixed的文字怎么样?包含所有fixed的文本怎么样,但还有一些额外的单词。遗失的话?

我不是说这些问题是迂腐的。如何定义相似性会对解决问题的方式产生重大影响。

顺便说一句,你将每一个文本与其他文本进行比较是不对的。您最终会进行(n^2 - n)/2文档比较。当n == 50,000时,大约为1.25 十亿

答案 1 :(得分:1)

一种可能的方法(请将其视为方案而不是解决方案):

  • 通过计算单词{"be": 12, "cow": 3, "show": 4, ...}的出现次数来预处理每个项目。
  • 定义这些词典之间的度量。
  • 比较对。

最后一步可能不一定是O(n^2),因为相似性度量是可传递的。这取决于你有多少相似的文字。

在找到相似类别之后,您可以进一步调查它们以详细检查95%的条件。

答案 2 :(得分:0)

真正的要求是什么?以近乎100%的置信度识别唯一身份?高可信度地识别可能的重复项?为人类评论做出低信心的决定?提供匹配概率?

可能这不是一次通过的解决方案,而是一个必须存储进度的迭代过程。你可以从一个50,000行的方形矩阵开始(是的,这很大)来存储初始化为0%/ 100%的匹配概率最小值/最大值。您应该选择一个有效的标准,如何对行进行排序以及如何遍历矩阵以避免内存交换。然后你冷开始用廉价算法改进匹配概率区间。例如如果大小相差5%(或任何不提供漏报的值),您可以使用文本长度将最大匹配概率降低到0%。在剩余的组合上,您可以进行更昂贵的比较。例如对于精确的字符串匹配,您可以将最小概率设置为100%。如果单词数量不同,则可以降低概率。每次迭代都会增加已经确定的组合的数量。您可以在每个步骤中验证算法。文本大小,字数,确切文本是您可以建立索引的关键,使比较便宜。你也可以在每一步中删除被证明是独一无二的行。

我不确定我是否正确解释了你的问题但是找到一个95%标准的黄金算法可能是不够的,因为除了比较一个之外别无他法。你至少有3个问题,一个有效的流程,良好的决策标准和有效的实施。