iPhone objective-c: определение «настоящего» слова

Мне нужно (быстрое и грязное) решение, чтобы в основном определить, является ли определенный NSString «настоящим» словом, то есть есть ли оно в словаре. В общем, очень упрощенная проверка орфографии. Кто-нибудь знает, как это сделать? По сути, мне нужен либо файл, содержащий все слова в английском словаре (который я искал, но безрезультатно), либо способ взаимодействия со службой проверки орфографии iPhone. Конечно, я хотел бы взаимодействовать со службой проверки орфографии iPhone аналогично NSSpellChecker в OSX, чтобы мое приложение работало с другими языками, но на этом этапе я возьму то, что могу.

Наконец, вот несколько псевдокодов, чтобы лучше проиллюстрировать мои потребности:

-(BOOL)isDictionaryWord:(NSString*)word;  //returns TRUE when word=@"greetings". returns FALSE when word=@"slkfjsdkl";

person Chris    schedule 28.07.2011    source источник
comment
Почему бы просто не использовать NSSpellChecker?   -  person Goz    schedule 28.07.2011
comment
@Wolfgang: вроде NSObject NSString ....   -  person brain    schedule 28.07.2011
comment
@Wolfgang: классы с префиксом NS доступны в iOS, например NSObject, NSNumber, NSString, NSPredicate, NSFetchedController, ...   -  person rckoenes    schedule 28.07.2011
comment
Ага, наверное, я немного устал после тяжелого рабочего дня :)   -  person Wolfgang Schreurs    schedule 28.07.2011
comment
Кажется, что NSSpellChecker недоступен на iOS, но не может найти его в документации Apple (сайт разработчика).   -  person Wolfgang Schreurs    schedule 28.07.2011
comment
NSSpellChecker недоступен в iOS, потому что вместо этого он использует UITextChecker, как видно из ответа @brain.   -  person matthias    schedule 28.07.2011


Ответы (2)


Вместо этого используйте 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;
}
person brain    schedule 28.07.2011

Вы можете заставить UITextChecker работать точно, не добавляя новый словарь.

Я использую двухэтапный процесс, потому что мне нужно, чтобы первый шаг был быстрым (но не точным). Вам может понадобиться только второй шаг - точная проверка. Обратите внимание, что здесь используется функция CompletionsForPartialWordRange UITextChecker, поэтому она более точна, чем функция 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

// Шаг второй: дополнительная проверка, чтобы убедиться, что это действительно настоящее слово. возвращает истину, если у нас есть настоящее слово.

-(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;

}
person Mikeee    schedule 27.02.2013
comment
Я следил за вашими кодовыми спинетами, но некоторые слова, такие как «твой», «пробуждение», «белый», «зло», «любовник», являются реальными, но UITextchecker отображается как недопустимые слова. - person Selvam M; 23.08.2013