NSSpellChecker检查/自动更正大文档

时间:2011-11-17 17:42:42

标签: cocoa osx-snow-leopard osx-lion

第一个问题是,我发现了correctionForWordRange:总会返回一个零。这是狮子的一个错误吗?我甚至没有通过谷歌搜索找到任何示例代码,但这个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个小时才能运行50MB的文本文件。有关提高性能的想法吗?我已经让程序尽可能少地访问applespell checker服务以消除系统调用。

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

0 个答案:

没有答案