产品名称的模糊匹配

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (120)

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

例如,“佳能PowerShot a20IS”“佳能新款powershot A20 IS”“佳能PS A20IS数码相机” 均应匹配“佳能PowerShot A20 IS”。我已经使用levenshtein距离和一些额外的启发式算法(删除了明显的常见词汇,为数字变化分配更高的成本等),这在某种程度上起作用,但遗憾的是还不够好。

主要的问题是,即使相关关键字的单字母变化也会产生巨大差异,但要检测哪些是相关关键字并不容易。考虑三个产品名称: 联想T400 联想R400 新联想T-400,Core 2 Duo 前两个是任何标准可笑的类似字符串(好吧,soundex可能有助于扰乱T和R在这种情况下,但名称可能也就是400T和400R),第一个和第三个相距很远,但都是同一个产品。

显然,匹配算法不可能100%精确,我的目标是自动匹配大约80%的名字,并且信心十足。

提问于
用户回答回答于

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

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

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

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

现在将这些规范名称映射到这棵树上。你会很快看到每个匹配整个子树。现在,使用这些树之间的距离来选择该条目的距离截止点。如果您在数据库中同时具有Foo X1和Foo Y1产品,那么为了反映这一点,截止距离将需要较低。

用户回答回答于

我认为这将归结为将联想等关键词从New如Chaff等区分开来。

我会对名称数据库进行一些分析以确定关键词。您可以使用与用于生成词云的代码类似的代码。

然后,我会手工编辑列表以清除任何明显的瑕疵,例如New可能很常见,但不是关键。

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

不是一个完美的解决方案,但我不认为你会期待一个?

扫码关注云+社区

领取腾讯云代金券