如何删除MySQL数据库中的“相似”但不相同的内容

时间:2009-10-04 12:16:50

标签: python mysql algorithm string

假设我有这张表:

ID | description
-------------------
5  | The bird flew over the tree.
2  | The birds, flew over the tree

这两行有“相似”的内容。我如何删除#2?

  1. 我应该为“类似”文字使用什么算法?
  2. 如何使用Python执行此操作?
  3. 谢谢!

4 个答案:

答案 0 :(得分:5)

您可以尝试通过stemmer(例如Porter Stemmer)剥离必要的标点符号并运行每个句子。

一旦你有句子的词干版本,你可以将其存储在另一列中进行比较。但是,如果句子很长(例如平均超过40个字符),你可能会发现散列句子的空间效率更高。

任何共享相同词干或散列的行都很可能是等效的 - 您可以自动删除它们,或者创建一个UI以使人们能够快速批准每个行。

这是Python implementation of the Porter stemmer

答案 1 :(得分:3)

通常,对于每个值,您将创建一个“简化”值(删除任何不必要的...在您的示例中,标点符号和复数化),然后比较简化值是否相等。

答案 2 :(得分:0)

您可以使用LIKE operator

DELETE FROM myTable WHERE description LIKE 'The bird%flew over the tree%';

答案 3 :(得分:0)

您可以将两个字符串之间的差异定义为编辑距离,即将一个字符串更改为另一个字符串所需的操作数。操作集可以是您想要的任何操作,但如果两个字符串在比较中具有不同的大小,则必须具有插入和删除操作。

http://en.wikipedia.org/wiki/Edit_distance

我会推荐

http://en.wikipedia.org/wiki/Levenshtein_distance

http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance

然后,您将设置编辑距离的阈值,表示两个字符串相似,例如2次编辑或3次编辑。

但是,如果数据库很大,这可能不是一个好主意。

在伪代码中,你基本上会说

if editDist(stringA, stringB) > editThreshold
    remove stringA %or stringB
end