我试图按一个人的名字连接两个数据表。有时,一个人多次出现在数据中,但姓名却有所不同。例如,约翰·史密斯也可以是史密斯或约翰·詹姆斯·史密斯。有没有人对如何匹配这些名称有任何建议,而不会不小心将它们与其他名称匹配?
我已尽可能地标准化了名称。我也将名字分为名字,中间名和姓氏,以查看是否有帮助(到目前为止)。我尝试在Fuzzywuzzy软件包中使用Levenshtein距离。它通常可以正常工作,但似乎经常匹配错误的人。程序包中的函数返回一个比率,接近100则更接近匹配,但是我似乎找不到适合用作确定两个名称是否匹配的条件的比率。
我还在下面发布了一些代码。该代码只是我对某些字符串所做的测试,这些字符串是使用Fuzzywuzzy从数据中获取的名称。我几乎总能得到一个人的名字与比率为abour 83的匹配,我的主要问题是,有时当我比较另一个人的名字时,也会得到83的比率。
from fuzzywuzzy import fuzz
from pyjarowinkler import distance
# first person
s1 = "c mark smith"
s2 = "c smith"
s3 = "c m smith"
s3 = "c mark smith iii"
s4 = "mark smith"
s5 = "c mark iii smith"
# second person
s6 = "steve marie smith"
s7 = "s m smith"
s8 = "steve smith"
s9 = "s smith"
# fuzzy ratio (lenenshtein distance)
## same person
print(fuzz.ratio(s2, s5))
print(fuzz.ratio(s2, s3))
print(fuzz.ratio(s1, s3))
## different person
print(fuzz.ratio(s1, s6))
print(fuzz.ratio(s7, s3))
print(fuzz.ratio(s2, s9))
# partial ratio
## same person
print(fuzz.partial_ratio(s1, s2))
print(fuzz.partial_ratio(s2, s3))
print(fuzz.partial_ratio(s1, s3))
## different people
print(fuzz.partial_ratio(s1, s6))
print(fuzz.partial_ratio(s7, s3))
print(fuzz.partial_ratio(s2, s9))
# token set ratio
## same person
print(fuzz.token_set_ratio(s1, s2))
print(fuzz.token_set_ratio(s2, s3))
print(fuzz.token_set_ratio(s1, s3))
## different people
print(fuzz.token_set_ratio(s1, s6))
print(fuzz.token_set_ratio(s7, s3))
print(fuzz.token_set_ratio(s2, s9))
# possibly jaro winkler distance (adds weight to length)
print(distance.get_jaro_distance(s1,s2, winkler=False))