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



好吧,我看过很多关于模糊字符串匹配、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电源适配器),但上述方法似乎都不太可能奏效。我的主要问题是,我不知道什么搜索列表的字符串…起初,我想尝试最长公共子字符串,但似乎会失败,因为一堆字符串有无序的东西,这可能会产生一个产品名称电源适配器,这对用户来说不是很有用。

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

我在iOS的Objective-C中实现这个,但我更感兴趣的是算法而不是实现,所以任何语言都可以

如果您想比较字符串,但需要比最长公共子字符串更健壮的东西来改变子字符串的顺序,您可以研究一种称为字符串平躺的技术。简单来说,原理如下:

  1. 查找两个字符串中最大的公共子字符串(大于最小长度)
  2. 从两个字符串中删除该子字符串
  3. 重复,直到没有子字符串大于最小长度

在实践中,剩余(未匹配的)字符串部分与初始长度之间的比率是字符串匹配程度的极好指标。这种技术对于子字符串的重新排序是非常健壮的。你可以在这里找到mr . Wise描述这种技术的科学论文。我过去曾自己实现过这个算法(这并不难),但显然免费的实现很容易获得(例如这里)。虽然我已经在各种模糊匹配场景中使用了该算法,但我不能保证我自己从未使用过的实现。

字符串平躺本身并不能解决找到最大的共同产品名称的问题,但在我看来,通过稍微修改算法,您可以做到这一点。比起计算匹配率,您更感兴趣的可能是保持相似的部分?

正如前面的海报所说,这种模糊匹配几乎总是需要一些类型的人工验证,因为假阳性和假阴性都是不可避免的。

听起来你的方法需要两个方面。我们应该把记录相互匹配。另一部分是从这些匹配记录中提取"规范名称"。在你的情况下,它是一个产品,但同样的概念。我不确定您将如何将匹配记录组与标准化产品名称关联起来,但我建议尝试从记录中提取重要信息并尝试将其与Internet上的一些资源进行匹配。例如,在您的示例中,也许您将数据与苹果产品列表进行比较。或者你可以尝试让一个机器人在谷歌上搜索并提取最上面的结果来尝试关联。归根结底,如果你的文本真的很脏,你就需要一些人为的干预。我的意思是,您可以为匹配、不匹配和需要审查设置一个阈值。祝你好运。

最新更新