名称分组算法

标签 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 是 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

最佳答案

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

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

如您所述,您必须解决一些歧义。例如,您可能有:

John Watson
Jane Watson
Dr. J. Watson

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

关于名称分组算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10155345/

相关文章:

mysql - 快速组 rank() 函数

python 根据前后单词进行单词分组

crystal-reports - 在 Crystal Reports 中按两个字段分组

java - 使用具有单个输入字符串/模式的算法生成多个唯一 ID

algorithm - 动态范围搜索

像人类一样模拟鼠标移动的算法?

R子集数据框,其中没有观察到某些变量

algorithm - 在条形图中加水

python - 有效检查相邻准确性(组成员资格?)

javascript - 将数组(元素组合)划分为自定义分区的所有方法