【发布时间】:2018-01-01 23:04:29
【问题描述】:
我有一个需要重复数据删除的姓名和地址数据框。问题是其中一些字段可能有拼写错误,即使它们仍然是重复的。例如,假设我有这个数据框:
index name zipcode
------- ---------- ---------
0 john doe 12345
1 jane smith 54321
2 john dooe 12345
3 jane smtih 54321
拼写错误可能出现在姓名或邮政编码中,但让我们担心这个问题的姓名 one。显然 0 和 2 和 1 和 3 一样是重复的。但是计算上最有效的方法是什么?
我一直在使用 Levenshtein 距离来计算来自 fuzzywuzzy package 的两个字符串之间的距离,这在数据框很小的情况下效果很好,我可以通过以下方式遍历它:
from fuzzywuzzy import fuzz
for index, row in df.iterrows():
for index2, row2 in df.iterrows():
ratio = fuzz.partial_ratio(row['name'], row2['name'])
if ratio > 90: # A good threshold for single character typos on names
# Do something to declare a match and throw out the duplicate
显然,这不是一种可以很好扩展的方法,不幸的是,我需要对大约 7M 行长的数据帧进行重复数据删除。显然,如果我还需要对邮政编码中的潜在拼写错误进行重复数据删除,情况会变得更糟。是的,我可以使用 .itertuples() 来做到这一点,这将使我的速度提高约 100 倍,但我是否错过了比这个笨重的 O(n^2) 解决方案更明显的东西?
有没有更有效的方法可以对这些嘈杂的数据进行重复数据删除?我已经查看了dedupe package,但这需要标记数据用于监督学习,我没有也没有印象,这个包将处理无监督学习。我可以推出自己的无监督文本聚类算法,但如果有现有的更好的方法,我宁愿不必走那么远。
【问题讨论】:
-
dedupe包会帮你做一些带标签的数据(我是这个包的作者)
标签: python pandas nlp python-dedupe