从字符串列表中搜索模糊子字符串

时间:2013-04-30 05:20:14

标签: string comparison fuzzy-search string-search

好的,我已经看过很多关于模糊字符串匹配,Levenstein距离,最长公共子字符串等的帖子。它们似乎都不适合我想做的事情。我从各种Web服务中提取产品结果,从那些我可以为产品建立一个大的名称列表。这些名称可能包含一堆变量垃圾。以下是一些来自SearchUPC的例子:

Apple 60W magsafe adapter L-shape with extension cord
Original Apple 60W Power Adapter (L-shaped Connector) for MacBook MC461LL/A with AC Extension Wall Cord (Bulk Packaging)
Current Apple MagSafe 60W Power Adapter for MacBook MC461LL/A with AC Extension Wall Cord (Bulk Packaging)
Apple 60W MagSafe Power Adapter - Apple Mac Accessories
Apple - MagSafe 60W Power Adapter for MacBook and 13\" MacBook Pro
MagSafe - power adapter - 60 Watt

等。我想要做的就是拉出共同的产品名称(这对我的启发式人眼来说显然是 Apple 60W MagSafe Power Adapter ),但上述方法似乎都没有用。我的主要问题是我不知道要搜索字符串列表的内容...起初,我正在考虑尝试最长的常见子字符串,但似乎会失败因为一堆字符串有东西乱序,可能会产生电源适配器的产品名称,这对用户来说并不是非常有用。

注意:从SearchUPC API返回的浩大大部分记录(这里大部分省略)都包含文字字符串" Apply 60W MagSafe Power Adapter"。

我在Objective-C中为iOS实现了这一点,但我对算法的兴趣超过了实现,所以任何语言都是可以接受的。

2 个答案:

答案 0 :(得分:1)

如果你想比较字符串但需要比最长公共子字符串更强大的东西来改变子字符串的顺序,你可能会研究一种名为 string tiling 的技术。简化,原理如下:

  1. 在两个字符串中找到最大的公共子字符串(大于最小长度)
  2. 从两个字符串中删除该子字符串
  3. 重复,直到没有更多的子串大于最小长度
  4. 实际上,剩余(不匹配的)字符串部分与初始长度之间的比率是字符串匹配程度的极佳指标。并且该技术对于子串的重新排序非常稳健。你可以找到M. Wise描述这种技术的科学论文here。我过去自己实现了算法(这并不难),但是可以随意使用(例如here)。虽然我已经在各种模糊匹配场景中使用了算法,但我无法保证我从未使用过的实现。

    字符串平铺本身并没有解决找到最大公共产品名称的问题,但在我看来,通过稍微修改算法,您可以这样做。你对计算匹配百分比的兴趣可能不如保留类似的部分吗?

    正如之前的海报所说,这种模糊匹配几乎总是需要一些类型的手动验证,因为误报和漏报都是不可避免的。

答案 1 :(得分:0)

听起来你的方法需要两倍。一个应该是彼此匹配的记录。另一部分是从那些匹配记录中提取“规范名称”。在你的情况下,它是一个产品,但相同的概念。我不确定如何将匹配记录组与标准化产品名称相关联,但我建议尝试从记录中提取重要信息,并尝试将其与Internet上的某些资源相匹配。例如,对于您的示例,您可能将数据与苹果产品列表进行比较。或者你可以尝试拥有一个抓取谷歌的机器人并拉出最高结果来尝试和关联。最重要的是,在一天结束时,如果你的文字非常脏,你需要加入一些人为干预。我的意思是你可以设置匹配的门槛,不匹配,需要审查。祝好运。