2008-11-27 84 views
7

我有一個公司的數據庫。我的應用程序接收按名稱引用公司的數據,但名稱可能與數據庫中的值不完全匹配。我需要將傳入的數據與其引用的公司進行匹配。在Java中匹配不精確的公司名稱

例如,我的數據庫可能包含名稱爲「A. B. Widgets & Co Ltd.」的公司。而我的傳入數據可能會引用「AB Widgets Limited」,「A.B. Widgets and Co」或「A B Widgets」。

公司名稱(A B Widgets)中的一些單詞對於匹配比其他單詞(Co,Ltd,Inc等)更重要。避免錯誤匹配很重要。

公司數量足夠小,我可以在內存中維護他們的名字的地圖,即。我可以選擇使用Java而不是SQL來查找正確的名稱。

你會如何在Java中做到這一點?

回答

0

你的數據庫可能詢問服務的使用正則表達式(正則表達式) - 見下面的一些Java教程 - 這裏的鏈接MySQL文檔(作爲一個例子):

http://dev.mysql.com/doc/refman/5.0/en/regexp.html#operator_regexp

你可能會想要在數據庫中存儲每個公司的相當複雜的正則表達式語句,其中包含您可能會預期的拼寫變化 - 或者您希望重視的重要公司名稱的子元素。

您還可以使用正則表達式庫中的Java

JDK 1.4.2
http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html

JDK 1.5.0
http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Matcher.html

在Java中
http://www.regular-expressions.info/java.html

使用正則表達式

Java正則表達式API解釋
http://www.sitepoint.com/article/java-regex-api-explained/

你也可能想看看如果你的數據庫支持探測法的能力(例如,請參閱以下鏈接到MySQL)
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex

2

您可以使用LCS算法得分它們。

我在我的photo album中這樣做,以便輕鬆地在照片中發送電子郵件並使其適當地落入安全類別。

0

你可以使用Lucene來索引數據庫,然後查詢Lucene索引。在Lucene之上建立了許多搜索引擎,包括Solr。

+0

這並不提供答案的問題。要批評或要求作者澄清,請在其帖子下方留言。 – 2012-08-31 02:15:09

+0

感謝您的反饋,我的答案更像是一個答案。 – 2012-08-31 04:49:11

1

看看Lucene。它是一個開放源碼的全文搜索Java庫,具有「近似匹配」功能。

3

您可以在您的數據庫/地圖&輸入(即轉換爲大寫/小寫)中儘可能標準化格式,然後使用動態編程中的Levenshtein (edit) distance metric針對所有已知名稱對輸入進行評分。

然後,您可以讓用戶確認比賽&,如果他們不喜歡它,給他們輸入值即可知名單(第二個想法的選擇 - 這可能是過多的權力給一個用戶......)

2

我會做LCS忽略「co」,「llc」,「ltd」等空格,標點符號,大小寫和變體。

0

投了1票下跌

您可以使用LCS算法得分它們。

我在我的相冊中這樣做,可以很容易地在照片中發送電子郵件,並使其妥善落入安全類別。

* LCS code 
* Example usage (guessing a category based on what people entered) 

更精確,優於最少公共子序列,最少公共子串應該更精確,因爲字符的順序是重要的。

3

雖然這個線程是有點老了,我最近做了字符串距離度量的名稱匹配的效率進行調查,並跨越這個庫傳來:

https://code.google.com/p/java-similarities/

如果你不想花在實現字符串距離算法時,我建議先試一試,已經實現了大約20種不同的算法(包括Levenshtein,Jaro-Winkler,Monge-Elkan算法等),並且它的代碼結構足夠好你不必深入理解整個邏輯,但你可以在幾分鐘內開始使用它。

(順便說一句,我不是庫的作者,這樣的榮譽對於它的創造者。)