2012-04-14 32 views
1

什麼是一個好辦法,組名稱的列表:算法分組名稱

Doctor Watson. 
Dr. John Watson. 
Dr. J Watson. 
Watson. 
J Watson. 
Sherlock. 
Mr. Holmes. 
S Holmes. 
Holmes. 
Sherlock Holmes. 

成獨特而完整的名稱的分組列表:

Dr. John Watson. 
Mr. Sherlock Holmes. 

也很有趣:

Mr Watson 
Watson 
Mrs Watson 
Watson 
John Watson 

由於該算法不需要推論第一個沃森是否是Mr(可能)或是Mrs,而只是第組唯一的問題是,John Watson顯然屬於Mr,而不是Watson夫人。沒有每個性別的名字的字典,這是無法推斷的。

到目前爲止,我已經想過遍歷列表並檢查每個項目與剩餘的項目。在每場比賽中,你再次分組並從頭開始,並且在沒有進行分組的第一輪中停止。

下面是一些粗糙的(還沒有經過測試的)Python。你會用名稱列表來調用它。

def groupedNames(ns): 
    if len(ns) > 1: 
     # First item is query, rest are target names to try matching 
     q = ns[0] 
     # For storing unmatched names, passed on later 
     unmatched = [] 
     for i in range(1,len(ns)): 
      t = ts[i] 
      if areMatchingNames(q,t): 
       # groupNames() groups two names into one, retaining all info 
       return groupedNames([groupNames(q,t)] + unmatched + ns[i+1:]) 
      else: 
       unmatched.append(t) 
    # When matching is finished 
    return ns 
+0

這功課嗎?如果是這樣,它應該被標記爲這樣。 – 2012-04-14 17:39:40

回答

2

如果你的名字是永遠的形式[honorific][first name or initial]LastName的,那麼你可以通過提取和姓氏排序開始。如果某些名稱的格式爲LastName[,[honorific][first name or initial]],則可以解析它們並將其轉換爲第一種形式。或者,您可能需要將所有內容轉換爲其他形式。

在任何情況下,您將名稱放入一些規範形式,然後按姓氏排序。你的問題大大減少了。然後,您可以按姓氏在姓氏組中進行排序,然後依次通過它們從片段中提取完整名稱。

正如您所指出的,您需要解決一些含糊之處。例如,你可能有:

John Watson 
Jane Watson 
Dr. J. Watson 

有沒有足夠的信息說,其中兩個(如果任!)是醫生。而且,正如您所指出的,如果沒有關於名稱性別的信息,則無法解析Mr. J. WatsonMrs. J. Watson

+0

不錯的建議,你也可以得到像約翰這樣的名字,他們不會告訴你他們是否給出姓名,所以我可能需要以不同的方式比較他們。我正在考慮將首字母縮寫成部分,並且還部分匹配一組給定的名字 – 2012-04-15 00:34:51

0

我建議在這裏使用哈希。 定義一個散列函數作爲將名稱解釋爲基數26的數字,其中a = 0和z = 25 現在只需散列單個單詞。所以

h(sherlock holmes)= h(sherlock)+ h(holmes)= h(holmes)+ h(sherlock)。

使用這個,你可以很容易地識別名稱類似:

約翰·沃森和沃森約翰

對於像約翰·沃森博士先生和約翰·沃森你歧義可以定義先生和博士的哈希值是相同。

要解決像J. Watson和John Watson這樣的衝突,您可以只對第一個字母和最後一個名字進行散列。您可以擴展類似衝突的想法。