NSSpellChecker для проверки / автозамены большого документа - PullRequest
1 голос
/ 17 ноября 2011

Первый вопрос: я нашел на нем коррекцию ForWordRange: всегда будет возвращать ноль. Это ошибка в Lion? Я даже не нашел пример кода через поиск в Google, но этот API-интерфейс задокументирован в официальной ссылке nsspellchecker ...

NSSpellChecker * checker = [NSSpellChecker sharedSpellChecker]; 
NSString * string = @"helllo"; 
NSRange range = NSMakeRange(0, [string length]); 
NSString *corrected = [checker correctionForWordRange:range inString:string language:@"en" inSpellDocumentWithTag:0];

Второй вопрос, следующий код занимает 2 часа для работы с текстовым файлом размером 50 МБ. Есть идеи по улучшению производительности? Я уже использую программу для доступа к сервису проверки яблок, чтобы как можно меньше исключать системные вызовы.

NSError *error;
NSSpellChecker * checker = [NSSpellChecker sharedSpellChecker];
NSMutableString * line =[NSMutableString stringWithContentsOfFile:@"input.txt" encoding:NSUTF8StringEncoding error:&error];
// this is fast, only one or two minutes to run
NSArray *checkingResult = [checker checkString:line 
                                         range:NSMakeRange(0, [line length]) 
                                         types:NSTextCheckingTypeSpelling  
                                       options:nil
                        inSpellDocumentWithTag:0
                                   orthography:nil
                                     wordCount:nil];
int offset = 0;
printf("Total mistakes: %lu\n", [checkingResult count]);
//this iteration is very slow
for (int i = 0 ; i < [checkingResult count]; i++ ) {
    NSTextCheckingResult * c = [checkingResult objectAtIndex:i];
    NSRange r = [c range];
    r.location += offset;
    NSArray *guess = [checker guessesForWord:[line substringWithRange:r]];
    if ([guess count]== 0) continue;
    NSString * word = [guess objectAtIndex:0];
    [line replaceCharactersInRange:r withString:word];
    offset += [word length] - r.length;
}                             
[line writeToFile:@"output.txt" atomically:YES encoding:NSUTF8StringEncoding error:&error];
...