Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.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
Python 如何智能解析姓氏_Python_Regex_Parsing_Nlp - Fatal编程技术网

Python 如何智能解析姓氏

Python 如何智能解析姓氏,python,regex,parsing,nlp,Python,Regex,Parsing,Nlp,假设西方的命名惯例为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 --

假设西方的命名惯例为
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'

…以及由此产生的无数其他排列。

这里最好的答案可能是不要尝试。名字是个人的,是我自己的,即使把自己局限于西方传统,你也永远不能确定你会想到所有的边缘案例。我的一个朋友在法律上把他的名字改成了一个单词,他和各种各样的机构打过交道,这些机构的程序无法处理这个问题。你正处于一个独特的位置,你可以创建一个软件来实现一个过程,因此你有机会设计一个不会让那些名字不合常规的人感到厌烦的东西。想一想为什么你需要先解析出姓氏,然后看看你还能做些什么


也就是说,作为一个纯粹的技术问题,最好的方法可能是从包含名称的字符串的末尾特别删去字符串“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”,我绝对不知道是否要把这个姓算作姓氏的一部分,因为我不知道它来自哪种语言。

我在这里附议Tnekutippa,但是你应该退房。这可能有助于实现某些过程的自动化。然而,如上所述,这是相当困难的。我不确定斯坦福大学的NER是否能从盒子里提取出名字和姓氏,但机器学习方法可能对这项任务非常有用。斯坦福NER可以是一个很好的起点,或者你可以尝试制作自己的分类器和训练语料库。

在 它处理上述六种情况中的四种:

#!/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    
#/usr/bin/env python
从nameparser导入人名
def get_lname(somename):
name=人名(somename)
返回name.last
人名=[
(‘约翰·史密斯’、‘史密斯’),
(‘约翰·麦克斯韦·史密斯’、‘史密斯’),
#(‘小约翰·史密斯’、‘小史密斯’),
(‘约翰·范达姆’、‘范达姆’),
#('John Smith,IV','Smith,IV'),
(‘约翰·马克·德拉霍亚’、‘德拉霍亚’)
]
对于名称,以人名为目标:

打印({}-->{}让一个人来做。这就是目前正在做的。这看起来是一个很好的机器学习问题——关键是你必须准备好犯错误,但希望成功率提高。你说“西方”,但你并不是真的这么想。西班牙语名字后面有父系字母,后面跟着母系字母等等,即使是你所谓的西方名字也是如此。这根本不起作用。我不同意你不能这么做的说法。你可以,但这并不完美。唯一的一点是,根据你的域名,你会得到更高或更低的精度/rec所有你的认可。在技术层面上:有很多可能性。例如,你可以使用机器学习,根据数据集中的示例来学习名称的外观。