我有一个公司数据库。我的应用程序接收按名称引用公司的数据,但名称可能与数据库中的值不完全匹配。我需要将传入的数据与它所引用的公司进行匹配。
例如,我的数据库可能包含名称为“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 :(得分:3)
您可以在数据库/地图中尽可能标准化格式。输入(即转换为大写/小写),然后使用动态编程中的Levenshtein (edit) distance metric来根据所有已知名称对输入进行评分。
然后,您可以让用户确认匹配&如果他们不喜欢它,给他们选择将这个值输入你的已知名字列表(第二个想法 - 这可能是给用户太多的力量......)
答案 1 :(得分:3)
虽然这个帖子有点旧,但我最近对名字匹配的字符串距离指标的效率进行了调查,并且遇到了这个库:
https://code.google.com/p/java-similarities/
如果你不想花费多少时间来实现字符串距离算法,我建议尝试第一步,已经实现了大约20种不同的算法(包括Levenshtein,Jaro-Winkler,Monge-Elkan)算法等)和它的代码结构很好,你不必深入理解整个逻辑,但你可以在几分钟内开始使用它。
(顺便说一句,我不是图书馆的作者,所以对其创作者来说是赞誉。)
答案 2 :(得分:2)
您可以使用LCS算法对其进行评分。
我在photo album中执行此操作,以便在照片中发送电子邮件,并使其适当地落入安全类别。
答案 3 :(得分:2)
我会忽略“co”,“llc”,“ltd”之类的空格,标点符号,大小写和变体,等等。
答案 4 :(得分:1)
看看Lucene。它是一个开源的全文搜索Java库,具有“近匹配”功能。
答案 5 :(得分: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 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
答案 6 :(得分:0)
您可以使用Lucene索引数据库,然后查询Lucene索引。在Lucene之上构建了许多搜索引擎,包括Solr。
答案 7 :(得分:0)
投票1票下来
您可以使用LCS算法对其进行评分。
我在相册中执行此操作,以便在照片中轻松发送电子邮件,并使其适当地落入安全类别。
* LCS code
* Example usage (guessing a category based on what people entered)
更精确,优于最小公共子序列,最小公共子串应更精确,因为字符的顺序很重要。