假设西方命名约定为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'...and数不清的其他排列。
发布于 2011-08-28 08:44:03
也许这里最好的答案就是不去尝试。名字是独立的和独特的,即使将你自己限制在西方传统中,你也永远不能确定你会想到所有的边缘情况。我的一个朋友合法地将他的名字改成了一个单词,他经历了一段地狱般的时间,与各种机构打交道,这些机构的程序无法处理这个问题。你处于一个独特的位置,你是一个创建实现过程的软件的人,所以你有机会设计一些不会惹恼那些使用非传统名字的人的东西。想一想为什么你一开始就需要解析出姓氏,看看你还能做些什么。
这就是说,作为纯粹的技术问题,最好的方法可能是从包含名称的字符串的末尾删除字符串“Jr”、“Jr.”、"III“、”III“等,然后从字符串中的最后一个空格到(new,在删除Jr之后,等等)结束。这不会从你的例子中得到,比如说,"Del La Hoya“,但你甚至不能指望一个人来理解--我做出了一个有根据的猜测,约翰·马克·Del La Hoya的姓是"Del La Hoya”,而不是"Mark Del La Hoya“,因为我是以英语为母语的人,我对西班牙语的姓氏有一些直觉-如果名字是,说"Gauthip Yeidze Ka Illunyepsi”,我完全不知道这个Ka是否应该算作姓氏的一部分,因为我不知道它来自什么语言。
发布于 2017-07-14 05:38:20
在https://pypi.python.org/pypi/nameparser上遇到了一个名为"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 发布于 2011-08-28 23:30:32
我在这里支持Tnekutippa,但你应该去named entity recognition看看。它可能有助于自动化一些过程。然而,正如前面提到的,这是相当困难的。我不太确定斯坦福大学的人是否能从盒子里提取出名字和姓氏,但机器学习方法可能会对这项任务非常有用。斯坦福大学的NER可能是一个很好的起点,或者你可以尝试制作自己的分类器和训练语料库。
https://stackoverflow.com/questions/7218310
复制相似问题