使用Java匹配复杂名称变体的有效算法

时间:2012-07-18 04:46:37

标签: java algorithm

我必须匹配一些商店名称,我很难让Levenshtein和SoundEx根据我的数据获得可接受的结果。

以下是我正在处理的一些例子:

The Home Depot 
Office Depot
Apple store 
Apple 
Walgreens 
Walgreens Denver 
Quiznos 
Quiznos Sandwich Restaurants

例如,给“Quiznos Sandwich Restaurants”,我想把它与“Quiznos”......“Walgreens Denver”匹配为“Walgreens”。我有这些商店名称的完整列表。

任何帮助都会很棒。

2 个答案:

答案 0 :(得分:1)

也许尝试通过“规范化”来缩小搜索范围? 从查询中删除像“the”和“store”这样的绒毛,通过字典运行它来修复明显的错误和拼写错误?识别和删除明显的位置引用(如上面的“denver”)也可以帮助。

编辑:扩展一下(并命名 - 删除一些其他CS主题;-)) - 如果你真的想要解决“最好”(最复杂)的方式,你需要输入你的输入字符串,通过一些词性标注器运行它(请参阅此处Java Stanford NLP: Part of Speech labels?),然后使用标记数据删除连接词(例如 - “mcdonalnds around manhatten” - around can被识别和删除)。 也许它甚至可以帮助识别复数形式(不知道,从未尝试过),所以像“华盛顿的家庭仓库”这样的东西可以被规范化为“家庭仓库”

答案 1 :(得分:0)

对于这个问题,你知道Levenshtein Complexity是O(mn),对于大数据来说非常高。

通过检查对角线而不是行,并使用lazy evaluation,我们可以在O(m(1 + d))时间内找到Levenshtein距离(其中d是Levenshtein距离),这比如果距离很小,则采用常规动态规划算法。

链接到懒惰评估:http://en.wikipedia.org/wiki/Lazy_evaluation

或者我们也可以用0初始化矩阵的第一行,该算法可以用于文本中字符串的fuzzy string search。此修改提供匹配文本的子字符串的结束位置。要确定匹配子字符串的起始位置,可以单独存储插入和删除的数量,并用于计算从结束位置开始的位置。