【问题标题】:Matching inexact company names in Java在 Java 中匹配不准确的公司名称
【发布时间】:2010-09-24 06:36:23
【问题描述】:

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

例如,我的数据库可能包含一家名为“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 中做到这一点?

【问题讨论】:

    标签: java matching


    【解决方案1】:

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

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

    【讨论】:

    • 我是在大约 6 个月前才发现这个算法的,但从那以后它对我的帮助非常好!当我说“哦,只使用 Levenshtein 距离”时,它也让我看起来很聪明。:-)
    【解决方案2】:

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

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

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

    (顺便说一句,我不是这个库的作者,所以感谢它的创建者。)

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            您的数据库可能支持使用正则表达式 (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

            【讨论】:

              【解决方案7】:

              投赞成票 1 票反对

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

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

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

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

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                • 这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
                • 感谢您的反馈,我的回答更像是一个答案。
                猜你喜欢
                • 2019-01-26
                • 2013-12-04
                • 1970-01-01
                • 2021-09-26
                • 2021-06-10
                • 1970-01-01
                • 2020-11-11
                • 2013-11-13
                • 2020-11-01
                相关资源
                最近更新 更多