8

我有一个公司数据库。我的应用程序接收到按名称引用公司的数据,但名称可能与数据库中的值不完全匹配。我需要将传入的数据与它所指的公司相匹配。

例如,我的数据库可能包含一家名为“AB Widgets & Co Ltd”的公司。而我的传入数据可能引用“AB Widgets Limited”、“AB Widgets and Co”或“AB Widgets”。

公司名称中的某些词(AB Widgets)比其他词(Co、Ltd、Inc 等)更重要。避免错误匹配很重要。

公司的数量足够少,我可以在内存中维护他们的名称地图,即。我可以选择使用 Java 而不是 SQL 来找到正确的名称。

你会如何在 Java 中做到这一点?

4

8 回答 8

3

您可以在 DB/map 和输入中尽可能地标准化格式(即转换为大写/小写),然后使用来自动态编程的Levenshtein(编辑)距离度量对所有已知名称的输入进行评分。

然后,您可以让用户确认匹配,如果他们不喜欢它,让他们选择将该值输入到您的已知名称列表中(再想一想——这可能会给用户太大的权力.. .)

于 2008-11-27T01:40:43.093 回答
3

虽然这个线程有点老了,但我最近对名称匹配的字符串距离度量的效率进行了调查,并遇到了这个库:

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

如果您不想花时间实现字符串距离算法,我建议您先尝试一下,已经实现了大约 20 种不同的算法(包括 Levenshtein、Jaro-Winkler、Monge-Elkan 算法等。 ) 并且它的代码结构足够好,您不必深入了解整个逻辑,但您可以在几分钟内开始使用它。

(顺便说一句,我不是图书馆的作者,所以要感谢它的创造者。)

于 2015-03-02T13:54:31.003 回答
2

我会在 LCS 中忽略空格、标点符号、大小写以及“co”、“llc”、“ltd”等的变体。

于 2008-11-27T02:02:52.800 回答
2

您可以使用LCS算法对它们进行评分。

我在我的相册中这样做是为了方便通过电子邮件发送照片并让它们正确归入安全类别。

于 2008-11-27T01:35:26.320 回答
1

看看Lucene。它是一个具有“近似匹配”功能的开源全文搜索 Java 库。

于 2008-11-27T01:36:42.243 回答
0

您的数据库可能支持正则表达式 (regex) 的使用 - 请参阅下面的 Java 教程 - 这是 MySQL 文档的链接(作为示例):

http ://dev.mysql.com/doc/refman/5.0/ zh/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 Regex API 解释
http://www.sitepoint.com/article/java-regex-api-explained/

您可能还想查看您的数据库是否支持 Soundex 功能(例如,请参阅以下 MySQL 链接)
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex

于 2008-11-27T01:32:13.737 回答
0

您可以使用 Lucene 来索引您的数据库,然后查询 Lucene 索引。有许多基于 Lucene 构建的搜索引擎,包括 Solr。

于 2008-11-27T01:35:53.913 回答
0

投赞成票 1 票反对

您可以使用 LCS 算法对它们进行评分。

我在我的相册中这样做是为了方便通过电子邮件发送照片并让它们正确归入安全类别。

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

为了更精确,比 Least Common Subsequence 更好,Least Common Substring 应该更精确,因为字符的顺序很重要。

于 2010-04-19T20:56:29.387 回答