我是一位有用的助手,可以为您翻译文本。
我有一个包含姓名和地址的数据框需要去重。但问题在于,这些字段中可能存在拼写错误,尽管它们仍然是重复的。例如,假设我有以下数据框:
这些错别字可能出现在姓名或邮政编码中,但是针对这个问题,我们只需要担心姓名。显然,0和2是重复的,1和3也是如此。但是,最有效的计算方法是什么呢?
我一直在使用Levenshtein距离来计算两个字符串之间的距离,从fuzzywuzzy包中计算,当数据框很小且可以通过迭代进行时,这种方法非常有效:
显然,这不是一种可扩展的方法,不幸的是我需要去重一个大约有700万行的数据框。如果我还需要去重邮政编码中的潜在错误,那么情况会更糟。是的,我可以使用
有更有效的方法可以处理这些嘈杂的数据吗?我已经研究了dedupe package,但那需要有标记的数据进行监督学习,而我既没有也没有印象这个软件包可以处理无监督学习。我可以制作自己的无监督文本聚类算法,但如果已经有现成的更好的方法,我宁愿不去那么远。
我有一个包含姓名和地址的数据框需要去重。但问题在于,这些字段中可能存在拼写错误,尽管它们仍然是重复的。例如,假设我有以下数据框:
index name zipcode
------- ---------- ---------
0 john doe 12345
1 jane smith 54321
2 john dooe 12345
3 jane smtih 54321
这些错别字可能出现在姓名或邮政编码中,但是针对这个问题,我们只需要担心姓名。显然,0和2是重复的,1和3也是如此。但是,最有效的计算方法是什么呢?
我一直在使用Levenshtein距离来计算两个字符串之间的距离,从fuzzywuzzy包中计算,当数据框很小且可以通过迭代进行时,这种方法非常有效:
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
显然,这不是一种可扩展的方法,不幸的是我需要去重一个大约有700万行的数据框。如果我还需要去重邮政编码中的潜在错误,那么情况会更糟。是的,我可以使用
.itertuples()
来执行此操作,这将使我获得约100倍的速度提升,但除了这种笨拙的O(n^2)
解决方案之外,我是否错过了更明显的东西?有更有效的方法可以处理这些嘈杂的数据吗?我已经研究了dedupe package,但那需要有标记的数据进行监督学习,而我既没有也没有印象这个软件包可以处理无监督学习。我可以制作自己的无监督文本聚类算法,但如果已经有现成的更好的方法,我宁愿不去那么远。