将这个名单分组的好方法是什么:
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是先生(可能)还是夫人,而只是将它们组合在一起,这里唯一的问题是John Watson显然属于Mr而不是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
答案 0 :(得分:2)
如果您的名字始终是[honorific][first name or initial]LastName
形式,那么您可以从姓氏中提取和排序开始。如果某些名称的格式为LastName[,[honorific][first name or initial]]
,则可以解析它们并转换为第一个表单。或者,您可能希望将所有内容转换为其他形式。
在任何情况下,您都将名称放入某个规范形式,然后按姓氏排序。你的问题大大减少了。然后,您可以在姓氏组中按名字和敬语进行排序,然后依次通过它们从片段中提取完整的名称。
正如您所指出的,您必须解决一些含糊之处。例如,您可能有:
John Watson
Jane Watson
Dr. J. Watson
没有足够的信息说两者中的哪一个(如果有的话)是医生。而且,正如您所指出的,如果没有关于姓名性别的信息,您将无法解决Mr. J. Watson
或Mrs. J. Watson
。
答案 1 :(得分:0)
我建议在这里使用哈希。 将哈希函数定义为将名称解释为基数为26的数字,其中a = 0且z = 25 现在只是散列单个单词。所以
h(sherlock holmes)= h(sherlock)+ h(holmes)= h(holmes)+ h(sherlock)。
使用此功能,您可以轻松识别以下名称:
John Watson和Watson John
对于John Watson博士和John Watson先生这样的模棱两可,您可以将Mr和Dr的哈希值定义为相同。
要解决像J. Watson和John Watson这样的冲突,你可以只使用第一个字母和姓氏进行哈希处理。您可以扩展类似冲突的想法。