2014-02-13 137 views
0

我正在根據名稱和位置字段實現從公司標準化數據庫提取的JSON對象與來自Twitter的非結構化數據之間的聯接。爲了澄清,這個連接是通過MapReduce完成的,所以除了手動實現連接條件之外別無它法。 顯而易見的實現是將這些字段與Java String.equals方法連接並進行比較。考慮這兩個JSONs,首先從標準化的數據提取和第二從Twitter:字符串確切匹配和潛在匹配

{"location":"Rio de Janeiro - Brasil","name":"Joao Paulo Forny "} 
{"location":"RiodeJaneiro;Brasil","name":"JoaoPaulo-Forny!"} 

下面的連接條件可以找到相同的名稱和包含在同一順序相同的字母位置之間的匹配由於使用的正則表達式來消除所有空格和其他字符而不是字母。

obj1.getJoinKey().toLowerCase().replaceAll("[^A-Za-z]", "") 
.equals(ob2.getJoinKey().toLowerCase().replaceAll("[^A-Za-z]", "")) 

由於Twitter的數據不被標準化,該字段可以包含任何信息或資料,甚至是不相關的特定字段信息僅供件,所以有這是不可能計算傷害的案件。但是,有些情況可能會發現潛在的匹配,例如,該地點可能只包含城市,該名稱可能不具有所有中間名或姓,也可能是相同的,但是不符合順序。

{"location":"Rio de Janeiro - Brasil","name":"Joao Paulo Forny de Melo"} 
{"location":"Rio de Janeiro","name":"Joao Paulo Forny de Melo"} 

{"location":"Rio de Janeiro - Brasil","name":"Joao Paulo Forny de Melo"} 
{"location":"Rio de Janeiro - Brasil","name":"Joao Forny"} 

{"location":"Rio de Janeiro - Brasil","name":"Joao Paulo Forny de Melo"} 
{"location":"Brasil - Rio de Janeiro","name":"Joao Paulo Forny de Melo"} 

問題是,什麼解決方案可以用來找到潛在的匹配基於上述三個條件?

+1

你可能想看看像這樣的lucene的東西。 – Taylor

+1

你總是可以計算出它們[Levenshtein距離](http://en.wikipedia.org/wiki/Levenshtein_distance),它是衡量兩個字符串之間「距離」的標準。 – Sinkingpoint

回答

1

有了,你已經給了三個具體的例子:

  1. 一個位置只包含城市;另一個包含城市和州/國家。在這種情況下,可以將字符串分成兩部分,用任何非字母數字,非空白字符分隔,並規格化間距(可能通過刪除它)。例如,「Brasil; Rio de Janiero」將成爲「巴西」和「RiodeJaniero」。然後,您可以測試一個位置是否至少有一個子字符串與其他位置之一的子字符串匹配。爲了防止與國家匹配,您可以設想創建一個所有國家的列表並排除這些匹配。只有幾百個國家,但我確定有很多替代拼寫取決於語言。但如果你不這樣做,你最終會匹配,比如說「聖保羅 - 巴西」和「里約熱內盧 - 巴西」。

  2. 一個名稱可能沒有中間名或姓氏。我傾向於認爲你必須至少有一個名字和姓氏才能匹配。想象一下,巴西或葡萄牙有多少Joaos。因此,在這種情況下,將字符串拆分爲子字符串,並確保至少有兩個部分相互匹配。不過,您需要另一個排除列表,其中包含諸如「von」,「de」和「O」等內容。

  3. 狀態和國家順序顛倒。這只是上面#1的一個特例。你將有兩個子串匹配而不僅僅是一個。

希望有幫助。我不確定這是一個完整的解決方案,但希望至少它可以引導您走向完整解決方案。