2009-05-19 102 views
12

我正在写一个核心数据应用程序的小问题。我有两个不同的模型,上下文和永久性商店。一个是我的应用数据,另一个是与我相关的信息的网站。匹配核心数据存储中的近似字符串

大多数情况下,我只将一条记录从我的应用匹配到另一条记录。但有时候,我必须回退到模糊字符串匹配来链接两条记录。 我试图匹配歌曲标题。我的地方标题就可以了(由)"The French Idealist is in your pensée"和远程歌名可能是"01 - 10 - French idealist in in you're pensee, The (dub remix, feat. DJ Objective-C)"

我搜索栈溢出,谷歌,可可的文档,我不能找到如何做一个模糊匹配任何明确的答案在这些情况下。我的字符串可以从任何东西开始,有一堆特殊字符,通常以随机或被忽略的字符结尾。

正则表达式不会做,也不NSPredicates,探测法不能很好地与外国地名的工作,也许莱文斯坦是不够的(或会吗?)。

我正在寻找在一组大约有十几个潜在的比赛冠军,但我哈瓦做这个手术了不少。 100%的准确性不是目标。

我正在考虑删除被忽略的单词,提取关键字(在本例中为“法语,理想主义,pensée”),连接它们,然后使用Levenshtein距离(歌名中的单词应该是相同的顺序)。

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

非常感谢。

回答

3

您希望您的搜索是区分符号不敏感匹配pensee在pensée的“e”和“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];
将上述谓词组合起来的语法可以离开,离开记忆。

+0

嗯,我第一次尝试过这种变化,当我解析真实世界的数据时,它并不完美。大多数情况下,问题不在于音调或情况,而在于细微的拼写差异(如“后街女孩”与“后街女孩”)。这个解决方案也很大程度上取决于上一步的标记化,这对于域名“可能出现在歌曲标题中的单词” – damdamdam 2009-05-21 05:46:38

2

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

每个轨道将是在这种情况下文档,你需要想出了一个好办法指数他们可以用来找到他们的标识符。然后,您可以使用元数据加载它们并搜索它们。也许把标题放在文档中会有助于使用相似性搜索(kSKSearchOptionFindSimilar)。这可能会或可能不会很好地工作。

你问的问题是一个很好的,但肯定是有它没有行业标准,因为任何人谁解决好这个问题(即每一个主要的搜索引擎)保持他们的算法很隐秘。这是一个难题;没有人愿意放弃他们的答案。

+0

SearchKit非常困难。我完全忘了这个API。我在文档中看起来非常努力,我在应用程序中看到了它的直接用法,但我认为它只是为了适应字符串和其他字符串之间的匹配。 – damdamdam 2009-05-21 05:49:34

1

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

对于两个字符串s1和s2,您可以为s1的每个q-gram确定s2中对应的编辑距离最小的q-gram。然后添加所有这些距离,并最终得到一个度量,该度量对于单词和多余字符的排列非常健壮。

一般情况下,q应该适应您的问题域(用q = 3,4,5 ...进行实验)。