【问题标题】:How to remove "similar" but not identical content in a MySQL database如何在 MySQL 数据库中删除“相似”但不相同的内容
【发布时间】:2009-10-04 12:16:49
【问题描述】:

假设我有这张桌子:

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

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

  1. 我应该对“相似”文本使用什么算法?
  2. 我将如何使用 Python 做到这一点?

谢谢!

【问题讨论】:

  • Alex,需要对多少行进行重复数据删除?数百、数千、数百万等等...?

标签: python mysql algorithm string


【解决方案1】:

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

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

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

这是Python implementation of the Porter stemmer

【讨论】:

  • 只是为词干句子提供一个简短的“代码”,以避免过多的开销。将修改答案以澄清,感谢提出它。
【解决方案2】:

通常,对于每个值,您会创建一个“简化”值(删除不重要的部分……在您的示例中,标点符号和复数形式),然后比较简化值是否相等。

【讨论】:

    【解决方案3】:

    您可以使用LIKE operator

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

    【讨论】:

      【解决方案4】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 2019-03-24
        • 2021-06-15
        • 2021-10-10
        • 1970-01-01
        • 1970-01-01
        • 2020-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多