iPhone Objective-C:检测“真实”单词

9
我需要一个(快速且简单)的解决方案,基本上是检测特定的NSString是否是一个“真正”的单词,也就是说它是否在字典中。因此,基本上是一个非常简单的拼写检查器。 有人知道如何做到这一点吗?基本上,我需要包含英语词典中所有单词的文件(我已经搜索过了,但没有结果),或者一种与iPhone拼写检查服务进行交互的方式。当然,我想以类似于OSX上的NSSpellChecker的方式与iPhone的拼写检查服务交互,以使我的应用程序能够与其他语言一起使用,但目前我只能接受任何可行的解决方案。
最后,以下是一些伪代码,更好地说明我的需求:
-(BOOL)isDictionaryWord:(NSString*)word;  //returns TRUE when word=@"greetings". returns FALSE when word=@"slkfjsdkl";

为什么不直接使用 NSSpellChecker? - Goz
@Wolfgang:像 NSObject、NSString 这样的东西。 - brain
@Wolfgang:NS前缀的类在iOS上可用,例如NSObject、NSNumber、NSString、NSPredicate、NSFetchedController等。 - rckoenes
啊,我猜我在工作了一整天后有点累了 :) - Wolfgang Schreurs
似乎NSSpellChecker在iOS上不可用,无法在苹果的文档(开发者网站)中找到它。 - Wolfgang Schreurs
NSSpellChecker在iOS上不可用,因为它使用UITextChecker代替,正如@brain的答案中所示。 - matthias
2个回答

21

请使用UITextChecker代替。以下代码可能不完美,但应该可以给你一个好的想法。

-(BOOL)isDictionaryWord:(NSString*)word {
    UITextChecker *checker = [[UITextChecker alloc] init];
    NSLocale *currentLocale = [NSLocale currentLocale];
    NSString *currentLanguage = [currentLocale objectForKey:NSLocaleLanguageCode];
    NSRange searchRange = NSMakeRange(0, [word length]);

    NSRange misspelledRange = [checker rangeOfMisspelledWordInString:word range:searchRange startingAt:0 wrap:NO language:currentLanguage];
    return misspelledRange.location == NSNotFound;
}

3
您可以使UITextChecker准确无误地工作,而不需要添加新的字典。
我使用了一个两步骤的处理过程,因为需要第一步骤快速(但不准确)。您可能只需要第二步骤,即准确检查。请注意,这利用了UITextChecker的completionsForPartialWordRange函数,这就是为什么它比MisspelledWord函数更准确的原因。
// 第一步:我快速检查组合字母是否通过拼写检查。虽然不太准确,但非常快速,因此我可以快速排除很多字母组合(蛮力方法)。
UITextChecker *checker;
NSString *wordToCheck = @"whatever"; // The combination of letters you wish to check

// Set the range to the length of the word
NSRange range = NSMakeRange(0, wordToCheck.length - 1);

NSRange misspelledRange = [checker rangeOfMisspelledWordInString:wordToCheck range: range startingAt:0 wrap:NO language: @"en_US"];
BOOL isRealWord = misspelledRange.location == NSNotFound;

// Call step two, to confirm that this is a real word
if (isRealWord) {
    isRealWord = [self isRealWordOK:wordToCheck];
}
return isRealWord; // if true then we found a real word, if not move to next combination of letters

// 第二步:额外检查以确保这个单词是真实存在的。如果我们有一个真实存在的单词,则返回true。

-(BOOL)isRealWordOK:(NSString *)wordToCheck {

    // we dont want to use any words that the lexicon has learned.
    if ([UITextChecker hasLearnedWord:wordToCheck]) {
        return NO;
    }

    // now we are going to use the word completion function to see if this word really exists, by removing the final letter and then asking auto complete to complete the word, then look through all the results and if its not found then its not a real word. Note the auto complete is very acurate unlike the spell checker.
    NSRange range = NSMakeRange(0, wordToCheck.length - 1);
    NSArray *guesses = [checker completionsForPartialWordRange:range inString:wordToCheck language:@"en_US"];

    // confirm that the word is found in the auto-complete list
    for (NSString *guess in guesses) {

        if ([guess isEqualToString:wordToCheck]) {
            // we found the word in the auto complete list so it's real :-)
            return YES;
        }
    }

    // if we get to here then it's not a real word :-(
    NSLog(@"Word not found in second dictionary check:%@",wordToCheck);
    return NO;

}

我已经按照你的代码片段进行了操作,但是像“thy,arouse,white,evil,lover”这些单词虽然是真实存在的单词,但UITextchecker却显示为无效单词。 - Selvam M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接