【问题标题】:Algorithm for grouping names名称分组算法
【发布时间】:2012-04-26 16:11:07
【问题描述】:

有什么好方法可以对这个名字列表进行分组:

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 显然属于 Mr 而不是 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

【问题讨论】:

  • 这是作业吗?如果是这样,它应该被标记为这样。

标签: algorithm grouping


【解决方案1】:

如果您的姓名始终采用[honorific][first name or initial]LastName 的形式,那么您可以先提取并按姓氏排序。如果某些名称具有LastName[,[honorific][first name or initial]] 的形式,您可以解析它们并转换为第一种形式。或者,您可能希望将所有内容转换为其他形式。

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

正如您所指出的,您必须解决一些模棱两可的问题。例如,您可能有:

John Watson
Jane Watson
Dr. J. Watson

没有足够的信息来说明这两者中的哪一个(如果有的话!)是医生。而且,正如您所指出的,如果没有有关姓名性别的信息,您将无法解析 Mr. J. WatsonMrs. J. Watson

【讨论】:

  • 很好的建议,你也可以得到像约翰这样的名字,它不会告诉你他们是否有名字或姓氏,所以我可能需要以不同的方式比较它们。我正在考虑将首字母扩展到部分并部分匹配一组给定名称
【解决方案2】:

我建议在这里使用散列。 将哈希函数定义为将名称解释为基数为 26 的数字,其中 a = 0 且 z = 25 现在只需散列单个单词。所以

h(sherlock holmes) = h(sherlock) + h(holmes) = h(holmes) + h(sherlock)。

使用它,您可以轻松识别以下名称:

约翰·沃森和沃森·约翰

对于像 Dr. John Watson 和 Mr John Watson 这样的歧义,您可以将 Mr 和 Dr 的哈希值定义为相同。

要解决像 J. Watson 和 John Watson 这样的冲突,您可以只对第一个字母和姓氏进行哈希处理。您可以扩展类似冲突的想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    相关资源
    最近更新 更多