2014-01-24 29 views
2

這是一個有趣的問題,我一直在玩,但無法找到答案。紅寶石 - 從電子郵件地址中查找名字和姓氏的文本

我有一個包含電子郵件以及全名的非結構化數據的文本文件。我已經提取了電子郵件,但我想將首字母和姓氏映射到每封電子郵件。

所以假設電子郵件是[email protected],並在頁面上的某個地方是'凱文史密斯'。

我想使用'@'前的任何內容來映射文本中某處的全名。但顯然搜索'ksmith'將不會返回匹配。那麼,從左側開始,我會搜索一個較少的字符,即'smith',這將匹配。

但是當我找到'史密斯'的時候,我也想找到第一個名字。所以也許假設這將永遠是最後一個名字(因爲大多數電子郵件都有最後一個名字),並從'Smith'左邊搜索,直到到達下一個空間(在'Kevin'的前面),並確定'史密斯'之前和'凱文'之前的空間是第一個名字。

但是,如果全名是「Kevin Michael Smith」或「Kevin P. Smith」呢?在這種情況下,我不想要「邁克爾」或「P.」,但凱文是第一個名字。

或者,如果電子郵件結構[email protected],在這種情況下,從左邊收縮子將永遠是一個比賽,我就需要從其他方面嘗試爲好。

基本上我需要一個足夠聰明的方法來識別這些全名在很多情況下。

任何幫助,將不勝感激!

我試圖做到這一點在Ruby中,如果這能幫助

+1

「M.凱文·史密斯」是另一種變體來考慮 - 誰的人通過他們的中間名去,或「JP史密斯」,或者是「 J. Michael Smith III先生「。我們不能忘記「雪兒」。我猜這種類型的問題經常遇到。 –

+0

因此,您基本上希望我們修復您的模糊啓發式失敗的情況,併爲您編寫代碼?謝謝,也許是其他時間。寫實際的代碼,也許再問一次。 – tripleee

+1

不要指望任何人爲我編碼,我只是想了解如何最好地解決這個問題。從Cary的評論中,我看到我沒有考慮過所有相關問題,並希望獲得有關如何解決此類問題的反饋,以及是否可以使用代碼進行可靠的工作。對不起,如果這個問題冒犯了你... – Zephyr4434

回答

1

當你發現姓氏,您將回到第一個名稱,這樣,而不是向左移動「史密斯」的,直到達到下一個空格 ,你應該看看下一個名字的第一個字母表是否有空格,例如「Kevin P. Smith」的算法會找到「P.」。但如果您檢查「P」後面是否有空格,請找到名稱的下一部分。所以對於「凱文邁克爾約翰史密斯」,你會得到凱文,因爲首先你到達「約翰」,然後你看到「J」後面有空間,所以你再次回到「邁克爾」有空間綁定「M」,所以你移動到「凱文」。由於凱文沒有空間,所以你有名。

最簡單的辦法是使用拆分功能,例如

string_=string_.split(" "); 
firstName=string_[0]; 
0

我的建議是寫一個算法,這使得全名的數組。例如:

a = ["kevin smit", "andrew john", "thom devid", "M. K. Add","k smith"] 
b= "[email protected]" 
c = b.split('@')[0] 
=> "ksmith" 
first = c[0] 
=> "k" 
last = c[1..c.length] 
=> "smith" 

a.each do |i| 
    if i.gsub(" ").count == 1 
    if (i.split(" ")[0][0] == first && i.split(" ")[1] == last) || (i.split(" ")[0][0] == last && i.split(" ")[1] == first) 
     p i 
    end 
    elsif i.gsub(" ").count == 2 
    if (i.split(" ")[0][0] == first && i.split(" ")[2] == last) || (i.split(" ")[0][0] == last && i.split(" ")[2] == first) 
     p i.split(" ")[0] + i.split(" ")[2] 
    end 
    end 
end 

這將適用於你。您還可以使用的switch-case insted的中的if-else如果有多個場景

相關問題