2008-11-27 79 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算法等),并且它的代码结构足够好你不必深入理解整个逻辑,但你可以在几分钟内开始使用它。

(顺便说一句,我不是库的作者,这样的荣誉对于它的创造者。)