这是一个实体解析,也就是记录链接,也就是数据匹配问题。
我将通过删除所有非字母字符(包括数字)、转换为全部大写然后使用分层匹配来解决这个问题。首先匹配确切的案例,然后在字段之间进行 Levenshtein 评分。在您宣布某事不匹配之前,请先决定您将允许 Levenshtein 或标准化 Levenshtein 分数获得多大。
为每一行分配一个 id,当你有一个匹配时,将较低的 ID 重新分配给匹配的两个成员。
Levenshtein 距离算法简单但出色(取自此处):
def levenshtein(a,b):
"Calculates the Levenshtein distance between a and b."
n, m = len(a), len(b)
if n > m:
# Make sure n <= m, to use O(min(n,m)) space
a,b = b,a
n,m = m,n
current = range(n+1)
for i in range(1,m+1):
previous, current = current, [i]+[0]*n
for j in range(1,n+1):
add, delete = previous[j]+1, current[j-1]+1
change = previous[j-1]
if a[j-1] != b[i-1]:
change = change + 1
current[j] = min(add, delete, change)
return current[n]
这本数据匹配书是一个很好的资源,在亚马逊上免费提供 7 天。
名义上,这是一个 n2 算法没有利用一些排序效率,所以我希望必须使用多个核心 2 ×107行。但这应该在 8 核AWS 实例上运行良好。它最终会在一个核心上完成,但可能需要几个小时。
希望这可以帮助!