2011-08-28 76 views
4

假設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' 

...從這個無數其他排列。

+10

找一個人做。 – Hammerite

+0

這就是目前正在做的事情。 – David542

+1

這看起來像一個很好的機器學習問題 - 關鍵是你必須準備好犯錯誤,但希望獲得更高的成功率。 –

回答

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「,我完全不知道是否以計算該卡作爲姓或名的一部分,因爲我不知道這是從哪個語言。

0

我在這裏借調Tnekutippa,但你應該檢查出named entity recognition。它可能有助於自動化一些過程。然而,正如所指出的那樣,相當困難,我不確定斯坦福大學NER是否可以提供開箱即用的名字和姓氏,但是機器學習方法可能證明這項任務非常有用。好的起點,或者你可以嘗試製作你自己的分類器和訓練語料庫。

0

跨越了一個名爲「nameparser」 LIB來得 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