【问题标题】:Matching an approximate string in a Core Data store匹配核心数据存储中的近似字符串
【发布时间】:2009-05-19 10:18:50
【问题描述】:

我目前正在编写的核心数据应用程序有一个小问题。我有两个不同的模型,上下文和永久存储。一个用于我的应用数据,另一个用于包含与我相关的信息的网站。

大多数时候,我将应用程序中的一条记录与其他来源的另一条记录完全匹配。然而,有时我不得不回退到模糊字符串匹配来链接两条记录。 我正在尝试匹配歌曲标题。我的本地标题可能是(编造的)"The French Idealist is in your pensée",而远程歌曲标题可能是"01 - 10 - French idealist in in you're pensee, The (dub remix, feat. DJ Objective-C)"

我搜索堆栈溢出、谷歌、可可文档,但在这些情况下我找不到任何关于如何进行模糊匹配的明确答案。我的字符串可以以任何开头,有一堆特殊字符,通常以随机或被忽略的字符结尾。

Regexp 不行,NSPredicates 也不行,Soundex 不能很好地处理外国名称,也许 Levenshtein 还不够(或者会吗?)。

我正在一组大约十几个潜在匹配项中寻找一个标题,但我必须经常执行此操作。 100% 的准确率不是目标。

我正在考虑删除被忽略的单词,提取关键字(在本例中为“french, Idealist, pensée”),将它们连接起来,然后使用 Levenshtein 距离(歌曲标题中的单词应该是相同的顺序) .

在我的特殊情况下,它会起作用吗?关于这个问题的行业标准是什么(我不可能是世界上唯一一个想要匹配略有不同的歌曲名称的人)Core Data、Cocoa 或 Objective-C 可以帮助我吗?

非常感谢。

【问题讨论】:

    标签: cocoa string core-data levenshtein-distance


    【解决方案1】:

    您希望搜索不区分变音符号以匹配 pensée 中的“é”和 pensee 中的“e”。您可以通过在属性后添加 [d] 来获得此信息。像这样:

        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(songTitle like[cd] %@)", yourSongSubstring];
    [cd] 中的“c”是为了不区分大小写。

    由于您的字符串可以在您正在搜索的字符串中以任何顺序出现,您可以标记您的搜索字符串 ([... componentsByString:@" "]) 然后创建一个谓词,如

        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(songTitle like[cd] %@) and (songTitle like[cd] %@)", songToken1, songToken2];
    上面组合谓词的语法可能是关闭的,来自内存。

    【讨论】:

    • 好吧,我第一次尝试了这个的变体,当我解析现实世界的数据时,它并不完全有效。大多数时候,问题不在于变音符号或大小写,而在于细微的拼写差异(如“后街女孩”与“后街女孩”)。这个解决方案也很大程度上依赖于上一步,tokenization,这对于领域“可能出现在歌曲标题中的单词”来说真的很难
    【解决方案2】:

    我相信你想在这里使用的工具是SearchKit。我这么说好像我只是让你的工作变得轻松......我没有,但它应该有你在这里取得成功所需的工具。 LNC 仍然免费提供他们的SearchKit Podcast(非常好)。

    在这种情况下,每条轨道都是一个文档,您需要想出一个好方法来使用可用于查找它们的标识符来索引它们。然后,您可以使用元数据加载它们并搜索它们。也许将标题“放入”文档将有助于此处使用相似性搜索 (kSKSearchOptionFindSimilar)。这可能会也可能不会很好。

    您提出的问题是一个很好的问题,但它肯定没有行业标准,因为任何能很好地解决这个问题的人(即每个主要搜索引擎)都将他们的算法保密。这是一个难题;没有人准备好给出他们的答案。

    【讨论】:

    • SearchKit。我完全忘记了这个 API。我非常努力地查看了文档,我在我的应用程序中看到了它的直接用途,但我认为仅仅在字符串和另一个字符串之间进行近似匹配就太复杂了。
    【解决方案3】:

    考虑 q-grams,它们是长度为 q (Gravano et al., 2001) 的子字符串。

    对于两个字符串 s1 和 s2,您可以为 s1 的每个 q-gram 确定具有最小编辑距离的 s2 的相应 q-gram。然后将所有这些距离相加,最终得到一个对单词和额外字符的排列非常稳健的度量。

    通常,q 应该适应您的问题域(实验 q = 3, 4, 5...)。

    【讨论】:

      猜你喜欢
      • 2011-05-11
      • 2013-07-10
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 2016-03-28
      • 2020-07-30
      相关资源
      最近更新 更多