假设我有这张表:
ID | description
-------------------
5 | The bird flew over the tree.
2 | The birds, flew over the tree
这两行有“相似”的内容。我如何删除#2?
谢谢!
答案 0 :(得分:5)
您可以尝试通过stemmer(例如Porter Stemmer)剥离必要的标点符号并运行每个句子。
一旦你有句子的词干版本,你可以将其存储在另一列中进行比较。但是,如果句子很长(例如平均超过40个字符),你可能会发现散列句子的空间效率更高。
任何共享相同词干或散列的行都很可能是等效的 - 您可以自动删除它们,或者创建一个UI以使人们能够快速批准每个行。
答案 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