如何智能解析姓氏
假设我们使用西方的名字规则,格式是 名字 中间名(s) 姓氏
,
那么,从一个完整的名字中,最好的方法是什么来正确提取出姓氏呢?
比如说:
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 个回答
我赞同Tnekutippa的观点,你可以看看命名实体识别。这个技术可能会帮助你自动化一些流程。不过,正如之前提到的,这个过程其实挺复杂的。我不太确定斯坦福的NER工具能不能直接提取出名字和姓氏,但使用机器学习的方法可能会对这个任务非常有帮助。斯坦福的NER可以作为一个不错的起点,或者你也可以尝试自己制作分类器和训练数据集。
我发现了一个叫“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" 等等。然后再从名字中最后一个空格开始,提取到去掉这些后面的新结尾。这样做可能无法处理像“Del La Hoya”这样的名字,但其实就算是人也不一定能搞清楚。我猜测约翰·马克·德拉霍亚的姓是“Del La Hoya”,而不是“Mark Del La Hoya”,这是因为我说英语长大,对西班牙名字有一些直觉。如果名字是“Gauthip Yeidze Ka Illunyepsi”,我就完全不知道“Ka”是不是姓的一部分,因为我根本不知道这是什么语言。