在Java中匹配不精确的公司名称

9
我有一个公司数据库。我的应用程序接收引用公司名称的数据,但名称可能与数据库中的值不完全匹配。我需要将传入的数据与它所指的公司进行匹配。
例如,我的数据库可能包含一个名为“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中实现这个功能?
8个回答

3
你可以尽可能地在数据库/映射和输入中标准化格式(例如,转换为大写/小写),然后使用动态规划的Levenshtein(编辑)距离度量对输入与所有已知名称进行评分。
然后,您可以让用户确认匹配,如果他们不喜欢,则给他们选项将该值输入到您已知名称列表中(再考虑一下 - 这可能是给用户太多权力了...)。

1
我大约6个月前才了解这个算法,但自那以后它为我提供了极大的帮助!而且当我说“噢,只需使用Levenshtein距离”时,它让我看起来很聪明。 :-) - Aidos

3
虽然这个帖子有点老,但我最近对字符串距离度量在姓名匹配中的效率进行了调研,并发现了这个库:https://code.google.com/p/java-similarities/。如果您不想花费大量时间来实现字符串距离算法,我建议尝试一下这个库作为第一步,因为它已经实现了约20种不同的算法(包括Levenshtein、Jaro-Winkler、Monge-Elkan算法等),其代码结构足够良好,您不必深入理解整个逻辑,即可在几分钟内开始使用它。(顺便说一句,我不是这个库的作者,所以要感谢它的创作者。)

2
您可以使用 LCS 算法对它们进行评分。
我在我的 相册 中这样做,以便轻松地通过电子邮件发送照片并将它们正确地归入安全类别中。

2

我会执行LCS算法,忽略空格、标点符号、大小写以及"co"、"llc"、"ltd"等变体。


1

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


0
投票上升 1 票,投票下降
您可以使用最长公共子序列算法对它们进行评分。
我在我的照片相册中这样做,以便轻松地通过电子邮件发送照片,并将其正确分类到安全类别。
* LCS code
* Example usage (guessing a category based on what people entered)

更准确地说,比最长公共子序列更好的是最长公共子串,因为字符的顺序很重要。


0

你的数据库可能支持使用正则表达式(regex)- 以下是一些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 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


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

这并没有提供问题的答案。如果您想对作者进行批评或请求澄清,请在他们的帖子下留言。 - antony.trupe
谢谢您的反馈,我已经将我的回答更改得更像一个答案了。 - Andrew Swan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接