我必须匹配一些商店名称,我很难让Levenshtein和SoundEx根据我的数据获得可接受的结果。
以下是我正在处理的一些例子:
The Home Depot
Office Depot
Apple store
Apple
Walgreens
Walgreens Denver
Quiznos
Quiznos Sandwich Restaurants
例如,给“Quiznos Sandwich Restaurants”,我想把它与“Quiznos”......“Walgreens Denver”匹配为“Walgreens”。我有这些商店名称的完整列表。
任何帮助都会很棒。
答案 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
。此修改提供匹配文本的子字符串的结束位置。要确定匹配子字符串的起始位置,可以单独存储插入和删除的数量,并用于计算从结束位置开始的位置。