产品标题的模糊字符串匹配算法

时间:2016-08-18 10:04:30

标签: string-matching fuzzy

我需要自动匹配产品名称(食物)。问题类似于 Fuzzy matching of product names

主要问题是即使相关关键字中的单字母更改也会产生巨大差异,但检测哪些相关关键字并不容易。例如,考虑三个产品名称Lenovo T400Lenovo R400New Lenovo T-400, Core 2 Duo

前两个是任何标准的可笑类似的字符串(好吧,soundex可能有助于在这种情况下区分T和R,但名称也可能是400T400R),第一个和第三个作为字符串彼此相距很远,但它们是相同的产品。

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

但是有一个复杂因素:我的字符串有错误,因为我想搜索的文件是图像识别的结果。产品标题中没有空格。

例如,我想找到产品名称cookiesoreovarianta,我有字符串

cookiesoreovariant b (真正的其他产品)
cookiesoreovariamt q (真正的其他产品,""和" q"在某些字体中是类似的符号)
cookiesoreovaria m ta(只是一个错误)

没有规范名称的完整数据库。

我将如何处理这个问题。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

理想情况下,您可以将字符串拆分为单独的标记,然后确定品牌是什么标记,标记名称是什么标记,标记号是什么标记等等。

这样做的好方法是使用条件随机字段来训练词性分类器。我们做了一个toolkit called parserator来帮助你做到这一点。

但是,您的问题比正常情况更难,因为您还必须执行名为word segmentation的操作。

此stackoverflow问题对分词How to split text without spaces into list of words?

进行了很好的介绍

一旦您对标题进行了细分和标记,当您比较两个产品标题时,您将需要以不同方式比较标题的不同部分。例如,您可以找到品牌名称之间的Levenshtein距离,然后是模型名称之间的距离,以及模型编号之间的距离。

要有效地进行这些多重比较,请使用一个包进行记录链接,例如dedupe

答案 1 :(得分:0)

对于产品数据我发现我需要使用模糊匹配算法的组合才能有效,因为每种技术都有缺点。

  1. 我开始使用截断的语音Metaphone(因为它可以预先计算) 找到最初的候选人比赛值得仔细研究。
  2. 然后我比较候选人 匹配使用相似度量的组合 Damerau-Levenshtein,全长拼音,角色NGrams,具有Jaccard相似性,相似长度,以及word1是否开始/结束word2,反之亦然。
  3. 然后我将各个算法乘以适合我需要的任意权重因子。
  4. 然后我排除了最低相似度结果,并将其余部分平均为整体相似度。
  5. 对于处理模型编号的特定情况,您可以调整最终相似性度量,以便在两个单词都是非字典单词或两个单词都包含数字的情况下更加宽容,因为模型编号比正常英文更精确词语的

    如果您的数据看起来像" cookiesoreovariantb",那么您最大的问题实际上是令牌化。一旦将单词正确划分为" cookies oreo variant b",您就可以做更多的工作来控制必要的相似程度,从而得出匹配结果。

    我写了一篇文章,详细说明了我发现的弱点,试图在产品数据上单独使用每个单独的相似性指标。 https://saas.findwatt.com/blog/post/confused-people-dont-buy-how-fuzzy-matching-helps