对这个名称列表进行分组的好方法是什么:
Doctor Watson.
Dr. John Watson.
Dr. J Watson.
Watson.
J Watson.
Sherlock.
Mr. Holmes.
S Holmes.
Holmes.
Sherlock Holmes.
进入唯一和完整名称的分组列表:
Dr. John Watson.
Mr. Sherlock Holmes.
也很有趣:
Mr Watson
Watson
Mrs Watson
Watson
John Watson
由于该算法不需要推断第一个 Watson 是 Mr(可能)还是 Mrs,而只需要对它们进行唯一分组,因此这里唯一的问题是 John Watson 显然属于 Mrs 而不是 Mrs Watson。如果没有每个性别的名字字典,就无法推断出这一点。
到目前为止,我已经考虑过遍历列表并检查每个项目与剩余项目。在每场比赛中,您分组并从头开始,并在没有分组发生的第一次通过时停止。
这是一些粗略的(仍然未经测试的)Python。你会用一个名字列表来调用它。
def groupedNames(ns):
if len(ns) > 1:
# First item is query, rest are target names to try matching
q = ns[0]
# For storing unmatched names, passed on later
unmatched = []
for i in range(1,len(ns)):
t = ts[i]
if areMatchingNames(q,t):
# groupNames() groups two names into one, retaining all info
return groupedNames( [groupNames(q,t)] + unmatched + ns[i+1:] )
else:
unmatched.append(t)
# When matching is finished
return ns