产品名称的模糊匹配

20 fuzzy-search string-matching levenshtein-distance

我需要自动将来自不同来源的产品名称(相机,笔记本电脑,电视等)与数据库中的规范名称相匹配.

例如"Canon PowerShot a20IS","来自佳能的NEW powershot A20 IS""数码相机佳能PS A20IS" 都应该与"佳能PowerShot A20 IS"相匹配.我已经使用了levenshtein距离和一些额外的启发式方法(删除了明显的常用词,为数字更改分配了更高的成本等),这在某种程度上起作用,但遗憾的是不够好.

主要问题是即使相关关键字中的单字母更改也会产生巨大差异,但要检测哪些是相关关键字并不容易.例如,考虑三个产品名称:
联想T400
联想R400
新联想T-400,酷睿2双核
任何标准前两个是可笑的类似字符串(好吧,soundex可能有助于在这种情况下消除T和R,但名称可能同样是400T和400R),第一个和第三个是相互远离的字符串,但是是相同的产品.

显然,匹配算法不能100%精确,我的目标是自动匹配大约80%的名字,具有很高的信心.

非常感谢任何想法或参考

MSa*_*ers 6

这里的关键理解是你确实有一个适当的距离度量。事实上这根本不是你的问题。你的问题在于分类。

让我举一个例子。假设您有 20 个 Foo X1 条目和 20 个 Foo Y1 条目。您可以放心地假设他们是两组。另一方面,如果您有 39 个条形 X1 条目和 1 个条形 Y1 条目,您应该将它们视为一个组。

现在,两个例子中的距离 X1 <-> Y1 是相同的,那么为什么分类会有差异呢?这是因为 Bar Y1 是异常值,而 Foo Y1 不是。

有趣的是,您实际上不需要做大量工作来预先确定这些组。您只需进行递归分类即可。您从每个组的节点开始,然后为两个最近的节点添加一个超级节点。在超级节点中,存储最佳假设、其子树的大小及其变化。由于许多字符串都是相同的,因此您很快就会得到具有相同条目的大型子树。递归以包含树根的超级节点结束。

现在根据这棵树映射规范名称。您很快就会看到每个都与整个子树匹配。现在,使用这些树之间的距离来选择该条目的距离截止值。如果数据库中同时有 Foo X1 和 Foo Y1 产品,则截止距离需要更低才能反映这一点。


Ed *_*ess 5

我认为,这可以归结为区分联想等关键词和New等谷歌关键词。

我将对名称数据库进行一些分析以识别关键字。您可以使用类似于生成词云的代码。

然后,我将手动编辑列表以删除任何明显的谷壳,例如,New实际上是常见的,但不是关键。

然后,您将获得可用于帮助识别相似性的关键字列表。您可以将“原始”名称与其关键字相关联,并在比较两个或多个原始名称的相似性(字面意思是共享关键字的百分比)时使用这些关键字。

无论如何,这都不是一个完美的解决方案,但是我不认为您期望得到一个解决方案?


Jer*_*y L 0

您可能想要创建忽略型号的字母/数字组合的逻辑(因为它们总是非常相似)。