产品名称的模糊匹配

时间:2009-02-27 15:37:19

标签: string-matching levenshtein-distance fuzzy-search

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

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

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

显然,匹配算法不能100%精确,我的目标是自动匹配80%左右的名字。

非常感谢任何想法或参考

11 个答案:

答案 0 :(得分:4)

我认为这可以归结为将联想等关键词与等箔条区分开来。

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

然后我会手动编辑列表以删除任何明显的箔条,就像New可能是常见但不是键。

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

在任何方面都不是一个完美的解决方案,但我不认为你期待它?

答案 1 :(得分:4)

这里的关键理解是你有一个合适的距离指标。事实上,这根本不是你的问题。你的问题在于分类。

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

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

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

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

答案 2 :(得分:3)

我认为,edg的答案是正确的方向 - 你需要区分关键词和绒毛。

背景很重要。举个例子,在查看T400的两个实例时,Core 2 Duo会出现问题,但在查看CPU OEM软件包时则不然。

如果您可以在数据库中标记产品名称的规范形式的哪些部分更重要,并且必须以一种或另一种形式出现以识别产品,那么您应该这样做。也许通过使用某种语义标记?你能负担得起人类标记数据库吗?

您可以尝试为“T-400”,“T400”,“T 400”等内容定义等价类。也许一组规则说“数字绑定比附加到这些数字的字母更强烈”。

根据制造商,型号等分解为案例可能是一种很好的方法。我建议您查看术语定位技术,以尝试实现这一目标:http://www.worldcat.org/isbn/9780262100854

在一个主要由规则驱动的灵活框架中设计所有内容,可以根据您的需求和新出现的错误模式(读取:破坏算法的内容)修改规则,这也是一个好主意。这样,您就可以根据实际数据改善系统的性能。

答案 3 :(得分:2)

您可以为此使用trigram search。我必须承认,我从来没有见过实现索引的算法,但已经看到它在制药应用中起作用,它确实很好地应对了错误的拼写错误的药物名称。您可以将相同类型的逻辑应用于此问题。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

想到

Spell checking算法。

虽然我找不到一个好的示例实现,但我相信你可以修改一个基本的拼写检查算法来得到满意的结果。即以文字为单位而不是字符。

记忆中留下的点点滴滴:

  1. 删除所有常用词(a,an,the,new)。什么是“共同”取决于背景。
  2. 取每个单词的第一个字母及其长度,并将其作为单词键。
  3. 当出现可疑单词时,查找具有相同或相似单词键的单词。
  4. 它可能直接解决你的问题......但是你说你在寻找想法,对吗?

    : - )

答案 6 :(得分:0)

对此类问题没有任何经验,但我认为一个非常天真的实现方法是将搜索词标记化,并搜索恰好包含任何标记的匹配项。

例如,“Canon PowerShot A20 IS”标记为:

  • 佳能
  • 的Powershot
  • A20
  • IS

将匹配您希望在结果中显示的其他每个项目。当然,这种策略也可能会产生大量的错误匹配。

另一种策略是在每个项目中存储“关键字”,例如“相机”,“佳能”,“数码相机”,以及基于具有匹配关键字的项目进行搜索。此外,如果您存储了Maker,Brand等其他属性,则可以搜索其中的每个属性。

答案 7 :(得分:0)

这正是我在业余时间工作的问题。我想出的是: 基于关键字缩小搜索范围:

在这种情况下,你可以有一些层次结构:

type - >公司 - >模型

这样你才能匹配 “数码相机”的类型

“佳能”对于公司来说,你的搜索范围要窄得多。

您可以通过引入产品线等进一步降低这一点。 但重点是,这可能必须迭代完成。

答案 8 :(得分:0)

这是record linkage的问题。 dedupe python library提供了完整的实现,但即使您不使用python,文档也有good overview of how to approach this problem

简而言之,在标准范例内,此任务分为三个阶段

  1. 比较字段,在这种情况下只是名称。您可以使用一个或多个比较器,例如Levenshtein距离之类的编辑距离或比较常用词数的余弦距离。
  2. 将距离分数数组转换为一对记录真正属于同一事物的概率
  3. 将这些成对概率分数聚类成可能都引用相同内容的记录组。

答案 9 :(得分:0)

过去我从事完全相同的工作。我所做的是使用NLP方法。 TF-IDF Vectorizer为每个单词分配权重。例如,在您的情况下:

佳能PowerShot a20IS

  • 佳能->重量= 0.05(不是一个非常明显的词)
  • PowerShot->重量= 0.37(可以区分)
  • a20IS->重量= 0.96(非常有区别)

这将告诉您的模型哪些单词需要关注,哪些单词不需要。多亏了TF-IDF,我的比赛非常出色。 但请注意:不能将a20IS识别为a20 IS,您可以考虑使用某种正则表达式来过滤此类情况。

之后,您可以使用数值计算,例如余弦相似度。

答案 10 :(得分:-1)

我们可以使用Datadecision service来匹配产品。

它允许您使用统计算法自动匹配您的产品数据。在定义置信度的阈值分数后完成此操作。

无法自动匹配的所有数据都必须通过专用用户界面进行人工审核。

在线服务使用查找表来存储同义词以及手动匹配历史记录。这使您可以在下次导入新数据时改进数据匹配自动化。

相关问题