2013-07-03 61 views
6

我有一堆人的名字。他們都是「西方」的名字,我只需要美國的公約/縮寫(例如先生,而不是老先生)。不幸的是,我送的東西沒有輸入自己的名字,所以我不能問他們想要叫什麼。我知道每個人的性別和他們的全名,但沒有更具體地解析事情。人名稱解析

一些例子:

  1. 約翰·史密斯
  2. 約翰·史密斯,小
  3. 約翰·史密斯小
  4. 約翰·史密斯十四
  5. 約翰·史密斯博士,博士

我希望能夠分析出每個名字的部分:

name = Name.new("John Smith Jr.") 
name.first_name # <= John 
name.greeting # <= Mr. Smith 

如果我在尋找「問候語」(可能不是最好的術語),我想在這裏是,1-4,「史密斯先生」。 5,我想史密斯博士,但我會爲史密斯先生解決。

Ruby的創業板,這將是理想的。我受到啓發,想要什麼東西這個奇怪的慢性,即處理時間的顯着人類的方式,讓我正確地告訴它「上週二」和具有紅寶石寶石它拿出一些明智的。」一些算法就足夠了命中最角落的情況。

我想處理一些在falsehoods programmers believe about names

回答

6

既然你僅限於西式的名字,我認爲一些規則將讓你最那裏的方式:

  1. 如果出現一個逗號,刪除最後一個以及之後的所有內容。
  2. 繼續從頭開始刪除單詞,同時在轉換爲小寫字母並刪除任何完整句號後,它們屬於集{ mr mrs miss ms rev dr prof }以及任何您可以想到的內容。使用的標題是「分數」表格(例如[mr=1, mrs=1, rev=2, dr=3, prof=4] - 他們不過你想要的順序),記錄被刪除的最高得分王的頭銜。
  3. 繼續從最後刪除單詞,而他們屬於集{ jr phd }或羅馬數字值大約50或更少(/[XVI]+/可能是一個足夠好的正則表達式)。
  4. 如果具有非零分數的一個或多個標題在步驟2中被刪除,使用得分最高的一個。否則,請使用「Mr.」或「夫人」根據所提供的性別。
  5. 爲姓,使用的最後一個字。

永遠不可能保證像「John Baxter Smith」這樣的名字被正確解析,因爲並非所有雙管姓氏都使用連字符。 「巴克斯特史密斯」是姓氏嗎?或者是「Baxter」的中間名?我認爲可以肯定的是,中間名比雙重但未聯繫的姓更常見,這意味着最好默認報告最後一個詞作爲姓。然而,你也可能想編譯一個普通的雙管姓氏列表,然後檢查這個。

+0

這給了我一個將自己的圖書館寫入DWIW的非常好的起點。接受答案。 – Hut8

2

看待lufthansa頁面所呈現的問題,他們會問,他們他們想要使用哪一種「標題」的。我從來沒有見過更好這樣的想法

我不建議在這種情況下使用寶石或任何東西,因爲英語/西班牙語/法語/ ......在性別上存在差異,那麼,如果您嘗試迪斯科舞廳ver自己,你不可能成功。

我希望幫你

+1

這絕對是正確的答案,如果你可以重新開始改變這一點,但它可能是該系統已經存在了一段時間。 –

+0

是的,如果我可以問這些人什麼都會很棒。不幸的是,我必須做出最好的猜測。請注意,我的問題還提到要區分John Smith XIV => Smith先生,而不是XIV先生。就像我在問題中所說的,我已經分開了解性別。 – Hut8

1

humanparser

解析人類名字符串轉換成稱呼,名字,中間名,姓,後綴。

安裝

npm install humanparser 

使用

var human = require('humanparser'); 

var fullName = 'Mr. William R. Jenkins, III' 
    , attrs = human.parseName(fullName); 

console.log(attrs); 

//produces the following output 

{ saluation: 'Mr.', 
    firstName: 'William', 
    suffix: 'III', 
    lastName: 'Jenkins', 
    middleName: 'R.', 
    fullName: 'Mr. William R. Jenkins, III' } 
1

你有沒有嘗試過的紅寶石寶石Namae

它應該處理大多數西方國家的名字,並帶有一些棘手場景的配置選項(多個姓氏,逗號用於分隔列表中的姓名和名稱部分)。話雖如此,這是一個確定性的解析器(使用這個grammar),有些情況下它不會覆蓋。

這裏就是你們的榜樣:

require('namae') 

Namae.parse 'John Smith and John Smith, Jr. and John Smith Jr and John Smith XIV' 
#=> [ 
    #<Name family="Smith" given="John">, 
    #<Name family="Smith" given="John" suffix="Jr.">, 
    #<Name family="Smith" given="John" suffix="Jr">, 
    #<Name family="Smith" given="John" suffix="XIV"> 
] 

它的鬥爭,配合醫生的頭銜,但是這是我們也許能夠解決。

2

有可用的基於Perl的解析器做這類提取http://search.cpan.org/~kimryan/Lingua-EN-NameParse/

我跑它通過你的例子得到以下results.It只可處理多達12(十二)序號後綴,也無法識別的。在博士,所以我不得不在輸入數據

JOHN SMITH        John        Smith      
JOHN SMITH, JR.       John        Smith    Jr  
JOHN SMITH JR.       John        Smith    Jr  
JOHN SMITH XII       John        Smith    XII  
DR. JOHN SMITH, PHD    Dr.  John        Smith    Phd