2011-08-28 75 views
4

假设FirstName MiddleName(s) LastName西部命名约定,如何智能地解析姓氏

什么是从一个完整的名称是否正确解析出姓氏的最佳方式?

例如:

John Smith --> 'Smith' 
John Maxwell Smith --> 'Smith' 
John Smith Jr --> 'Smith Jr' 
John van Damme --> 'van Damme' 
John Smith, IV --> 'Smith, IV' 
John Mark Del La Hoya --> 'Del La Hoya' 

...从这个无数其他排列。

+10

找一个人做。 – Hammerite

+0

这就是目前正在做的事情。 – David542

+1

这看起来像一个很好的机器学习问题 - 关键是你必须准备好犯错误,但希望获得更高的成功率。 –

回答

17

这里最好的答案可能不是试试。名字是个人和独特的,甚至限制自己的西方传统,你永远不能确定你会想到所有的边缘情况。我的一位朋友合法地将他的名字改为一个单词,而且他与处理程序无法处理这些问题的各种机构打交道。您处于创建实施程序的软件的独特位置,因此您有机会设计一些不会让非常规名称的人烦恼的东西。想一想为什么你需要先分析姓,然后看看你能做些什么。

这就是说,作为一个纯粹的技术问题,最好的方法可能是修剪字符串“Jr”,“Jr”,“Jr.”,“III”,“III”等从包含名称的字符串的末尾开始,然后从字符串的最后一个空格到(新的,删除Jr等之后)的所有内容结束。从你的例子来看,这不会得到,比如说,“Del La Hoya”,但你甚至不能真正指望一个人得到那个 - 我做出一个有根据的猜测,即John Mark Del La Hoya的姓氏是“Del La Hoya“而不是”Mark Del La Hoya“,因为我是母语为英语的人,而且我对西班牙语的姓氏是什么样子有一些直觉 - 如果名字是”Gauthip Yeidze Ka Illunyepsi“,我完全不知道是否以计算该卡作为姓或名的一部分,因为我不知道这是从哪个语言。

0

我在这里借调Tnekutippa,但你应该检查出named entity recognition。它可能有助于自动化一些过程。然而,正如所指出的那样,相当困难,我不确定斯坦福大学NER是否可以提供开箱即用的名字和姓氏,但是机器学习方法可能证明这项任务非常有用。好的起点,或者你可以尝试制作你自己的分类器和训练语料库。

0

跨越了一个名为“nameparser” LIB来得 https://pypi.python.org/pypi/nameparser 它处理四出于上述六种情况:

#!/usr/bin/env python 
from nameparser import HumanName 

def get_lname(somename): 
    name = HumanName(somename) 
    return name.last 

people_names = [ 
    ('John Smith', 'Smith'), 
    ('John Maxwell Smith', 'Smith'), 
    # ('John Smith Jr', 'Smith Jr'), 
    ('John van Damme', 'van Damme'), 
    # ('John Smith, IV', 'Smith, IV'), 
    ('John Mark Del La Hoya', 'Del La Hoya') 
] 

for name, target in people_names: 
    print('{} --> {} <-- {}'.format(name, get_lname(name), target)) 
    assert get_lname(name) == target