如何获得两个NSStrings的%差异

时间:2014-01-30 00:21:11

标签: ios objective-c nsstring foundation

我认为这可能是不可能合理地做的,但我想我会拍它。所以我要说我有两个NSStrings。一个是@"Singin' In The Rain",另一个是@"Singing In The Rain"。这些字符串非常相似,但差别很小。我正试图找到一种方法,我可以编写如下内容:

NSString *stringOne = @"Singin' In The Rain";
NSString *stringTwo = @"Singing In The Rain";

float dif = [stringOne differenceFrom:stringTwo];
//dif = .9634 or something like that

我发现的一个与此类似的项目取自之前关于Stack Overflow的类似问题:Check if two NSStrings are similar。但是,这只会返回一个BOOL,它不像我需要的那样准确。我也尝试查看compare:的{​​{1}}文档,但这看起来太基本了。我发现的另一个类似的事情是https://gist.github.com/iloveitaly/1515464。然而,这给出了不同的结果,甚至说两个相同的字符串偶尔也不同。任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:1)

问题有点模糊,但我认为最令人满意的结果将来自使用NSLinguisticTagger。如果您使用NSLinguisticTagSchemeLexicalClass方案解析每个标签,那么您的字符串将被分解为动词,名词,形容词等。在您的示例中,即使您没有发现唱歌和唱歌是相同的,你发现其他三个单词是相同的,最后的东西是一个名词,所以他们都是在做同样的事情。

使用像BK-Tree之类的东西来比较你怀疑可能存在匹配的单个单词可能是明智的(名词显然与副词不匹配,但即使拼写不同,两个名词也可能匹配)。

答案 1 :(得分:0)

我建议进行这种比较的动态时间扭曲:

http://en.wikipedia.org/wiki/Dynamic_time_warping

然而,这将返回两个字符串之间的距离(因此相同时你会得到0),但这是我能想到的最佳起点。

答案 2 :(得分:0)

另一个离墙建议:

diff和类似程序的源代码和算法很容易获得。它们逐行比较输入并检测插入,删除和更改。

比较文本字符串的“亲密度”时,插入,删除或更改单词似乎与任何单词一样好。

所以:

  1. 将每个字符串分成“单词”(分隔的空格应该足够)。
  2. 使用diff算法比较两个列表,将每个“单词”视为“行”,使用重新同步长度为1(需要相同的“行”数量来处理这两个输入同步回来了)
  3. 将“接近度”计算为与总字数相比的插入/删除/更改次数。
  4. 对于两个示例字符串,这将提供1:4更改或75%相似。

    如果您希望每次更改都有更大的粒度,请将这两个单词拆分为字符并重复算法,为您提供相似的单词(与整个单词相对)。

    对于两个示例字符串,这将给出4个中的3个6/7个单词,或96%相似。