用于分组名称的算法

时间:2012-04-14 16:38:16

标签: algorithm grouping

将这个名单分组的好方法是什么:

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

2 个答案:

答案 0 :(得分:2)

如果您的名字始终是[honorific][first name or initial]LastName形式,那么您可以从姓氏中提取和排序开始。如果某些名称的格式为LastName[,[honorific][first name or initial]],则可以解析它们并转换为第一个表单。或者,您可能希望将所有内容转换为其他形式。

在任何情况下,您都将名称放入某个规范形式,然后按姓氏排序。你的问题大大减少了。然后,您可以在姓氏组中按名字和敬语进行排序,然后依次通过它们从片段中提取完整的名称。

正如您所指出的,您必须解决一些含糊之处。例如,您可能有:

John Watson
Jane Watson
Dr. J. Watson

没有足够的信息说两者中的哪一个(如果有的话)是医生。而且,正如您所指出的,如果没有关于姓名性别的信息,您将无法解决Mr. J. WatsonMrs. 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这样的冲突,你可以只使用第一个字母和姓氏进行哈希处理。您可以扩展类似冲突的想法。