假设西方命名惯例为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'
......还有无数其他的排列。
答案 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