我需要自动将来自不同来源的产品名称(相机,笔记本电脑,电视等)与数据库中的规范名称相匹配。
例如“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%左右的名字。
非常感谢任何想法或参考
答案 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)
背景很重要。举个例子,在查看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)
虽然我找不到一个好的示例实现,但我相信你可以修改一个基本的拼写检查算法来得到满意的结果。即以文字为单位而不是字符。
记忆中留下的点点滴滴:
它可能不直接解决你的问题......但是你说你在寻找想法,对吗?
: - )
答案 6 :(得分:0)
对此类问题没有任何经验,但我认为一个非常天真的实现方法是将搜索词标记化,并搜索恰好包含任何标记的匹配项。
例如,“Canon PowerShot A20 IS”标记为:将匹配您希望在结果中显示的其他每个项目。当然,这种策略也可能会产生大量的错误匹配。
另一种策略是在每个项目中存储“关键字”,例如“相机”,“佳能”,“数码相机”,以及基于具有匹配关键字的项目进行搜索。此外,如果您存储了Maker,Brand等其他属性,则可以搜索其中的每个属性。
答案 7 :(得分:0)
这正是我在业余时间工作的问题。我想出的是: 基于关键字缩小搜索范围:
在这种情况下,你可以有一些层次结构:
type - >公司 - >模型
这样你才能匹配 “数码相机”的类型
“佳能”对于公司来说,你的搜索范围要窄得多。
您可以通过引入产品线等进一步降低这一点。 但重点是,这可能必须迭代完成。
答案 8 :(得分:0)
这是record linkage的问题。 dedupe python library提供了完整的实现,但即使您不使用python,文档也有good overview of how to approach this problem。
简而言之,在标准范例内,此任务分为三个阶段
答案 9 :(得分:0)
过去我从事完全相同的工作。我所做的是使用NLP方法。 TF-IDF Vectorizer为每个单词分配权重。例如,在您的情况下:
佳能PowerShot a20IS
这将告诉您的模型哪些单词需要关注,哪些单词不需要。多亏了TF-IDF,我的比赛非常出色。 但请注意:不能将a20IS识别为a20 IS,您可以考虑使用某种正则表达式来过滤此类情况。
之后,您可以使用数值计算,例如余弦相似度。
答案 10 :(得分:-1)
我们可以使用Datadecision service来匹配产品。
它允许您使用统计算法自动匹配您的产品数据。在定义置信度的阈值分数后完成此操作。
无法自动匹配的所有数据都必须通过专用用户界面进行人工审核。
在线服务使用查找表来存储同义词以及手动匹配历史记录。这使您可以在下次导入新数据时改进数据匹配自动化。