如何智能解析最后一个nam

2024-09-27 21:32:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

…以及其他无数的排列。在


Tags: firstnamejohnvan命名lasmithdel姓氏
3条回答

在上遇到了一个名为“nameparser”的库 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    

也许最好的答案是不要尝试。名字是个人的和我一样的,甚至局限于西方的传统,你永远不能确定你会想到所有的边缘情况。我的一个朋友合法地把他的名字改成了一个单字,他和各种机构打交道,这些机构的程序不能处理这个问题。你处于一个独特的位置,是一个创建实现一个过程的软件的人,所以你有机会设计一些不会让那些用非常规名字的人感到厌烦的东西。想一想为什么你需要先解析出姓氏,看看是否还有其他方法可以做。在

也就是说,作为一个纯技术性的问题,最好的方法可能是从包含名称的字符串结尾处具体地删除字符串“Jr”、“、Jr”、“、Jr.”、“III”、“、III”等,然后从字符串中的最后一个空格到(除去Jr等之后的新空格)的所有内容。比如说,这不会从你的例子中得到“Del La Hoya”,但你甚至不能指望一个人能得到这个答案——我在做一个有根据的猜测,约翰·马克·德尔拉霍亚的姓是“Del La Hoya”,而不是“Mark Del La Hoya”,因为我是英语母语,我对西班牙语姓氏的样子有一些直觉——如果名字是,说“Gauthip Yeidze Ka Illunyepsi”我完全不知道是否将Ka作为姓氏的一部分,因为我不知道这是从哪种语言来的。在

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

相关问题 更多 >

    热门问题