我认为这可能是不可能合理地做的,但我想我会拍它。所以我要说我有两个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。然而,这给出了不同的结果,甚至说两个相同的字符串偶尔也不同。任何建议都将不胜感激。
答案 0 :(得分:1)
问题有点模糊,但我认为最令人满意的结果将来自使用NSLinguisticTagger
。如果您使用NSLinguisticTagSchemeLexicalClass
方案解析每个标签,那么您的字符串将被分解为动词,名词,形容词等。在您的示例中,即使您没有发现唱歌和唱歌是相同的,你发现其他三个单词是相同的,最后的东西是一个名词,所以他们都是在做同样的事情。
使用像BK-Tree之类的东西来比较你怀疑可能存在匹配的单个单词可能是明智的(名词显然与副词不匹配,但即使拼写不同,两个名词也可能匹配)。
答案 1 :(得分:0)
我建议进行这种比较的动态时间扭曲:
http://en.wikipedia.org/wiki/Dynamic_time_warping
然而,这将返回两个字符串之间的距离(因此相同时你会得到0),但这是我能想到的最佳起点。
答案 2 :(得分:0)
另一个离墙建议:
diff
和类似程序的源代码和算法很容易获得。它们逐行比较输入并检测插入,删除和更改。
比较文本字符串的“亲密度”时,插入,删除或更改单词似乎与任何单词一样好。
所以:
diff
算法比较两个列表,将每个“单词”视为“行”,使用重新同步长度为1(需要相同的“行”数量来处理这两个输入同步回来了)对于两个示例字符串,这将提供1:4更改或75%相似。
如果您希望每次更改都有更大的粒度,请将这两个单词拆分为字符并重复算法,为您提供相似的单词(与整个单词相对)。
对于两个示例字符串,这将给出4个中的3个6/7个单词,或96%相似。