Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 名称分组算法_Algorithm_Grouping - Fatal编程技术网

Algorithm 名称分组算法

Algorithm 名称分组算法,algorithm,grouping,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 由于该

将此姓名列表分组的好方法是:

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

如果您的姓名始终是
[尊称][名字或首字母]姓氏
,那么您可以从按姓氏提取和排序开始。如果某些名称的格式为
LastName[,[尊称][名字或首字母]]
,则可以对其进行解析并转换为第一种格式。或者,您可能希望将所有内容转换为其他形式

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

正如您所指出的,您必须解决一些含糊不清的问题。例如,您可能有:

John Watson
Jane Watson
Dr. J. Watson

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

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

h(福尔摩斯)=h(福尔摩斯)+h(福尔摩斯)=h(福尔摩斯)+h(福尔摩斯)

使用此选项,您可以轻松识别以下名称:

约翰·沃森和沃森·约翰

对于像John Watson博士和John Watson先生这样的歧义,可以将Mr和Dr的哈希值定义为相同


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

这是家庭作业吗?如果是这样的话,它应该被标记为这样。很好的建议,你也可以得到像约翰这样的名字,但这些名字不会告诉你它们是名字还是姓氏,所以我可能需要用不同的方式来比较它们。我正在考虑将首字母扩展成几个部分,并部分匹配一组给定的名称