【问题标题】:Fuzzy substring search from a list of strings从字符串列表中进行模糊子字符串搜索
【发布时间】:2013-04-23 22:43:40
【问题描述】:

好的,我看过很多关于模糊字符串匹配、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”。

我在 Objective-C 中为 iOS 实现这个,但我对算法的兴趣比实现更重要,所以任何语言都是可以接受的。

【问题讨论】:

    标签: string comparison fuzzy-search string-search


    【解决方案1】:

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

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

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

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

    正如上一张海报所说,这种模糊匹配几乎总是需要某种手动验证,因为误报和误报都是不可避免的。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-13
        • 2014-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多