如何智能地解析姓氏

时间:2011-08-28 00:39:22

标签: 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 --> 'Del La Hoya'

......还有无数其他的排列。

3 个答案:

答案 0 :(得分: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”,我绝对不知道把Ka算作姓氏的一部分,因为我不知道是什么语言。

答案 1 :(得分:0)

我在这里支持Tnekutippa,但你应该看看named entity recognition。它可能有助于自动化某些过程。然而,如上所述,这非常困难。我不太确定Stanford NER是否可以开箱即用提取名字和姓氏,但机器学习方法对于这项任务非常有用。斯坦福NER可能是一个不错的起点,或者您可以尝试制作自己的分类器和训练语料库。

答案 2 :(得分:0)

遇到名为" 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