匹配Core Data存储中的近似字符串

时间:2009-05-19 10:18:51

标签: cocoa string core-data levenshtein-distance

我目前正在撰写的核心数据应用程序存在一个小问题。我有两个不同的模型,上下文和持久的商店。一个用于我的应用数据,另一个用于具有相关信息的网站。

大多数情况下,我只将我的应用中的一条记录与另一条来源的另一条记录匹配。然而,有时候,我必须回退到模糊字符串匹配以链接两个记录。 我正在尝试匹配歌曲标题。我的本地标题可以是(编组)"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可以帮助我吗?

非常感谢。

3 个答案:

答案 0 :(得分:3)

你希望你的搜索是变音符号不敏感的,以匹配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];
组合上述谓词的语法可能是关闭的,从内存开始。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

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

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