检测NSString的语言

And*_*ang 41 cocoa objective-c ios

有人告诉我有关Cocoa语言识别的课程.有谁知道它是哪一个?

不是工作:

NSSpellChecker *spellChecker = [NSSpellChecker sharedSpellChecker];
[spellChecker setAutomaticallyIdentifiesLanguages:YES];
NSString *spellCheckText = @"Guten Tag Herr Mustermann. Dies ist ein deutscher Text. Bitte löschen Sie diesen nicht.";
[spellChecker checkSpellingOfString:spellCheckText startingAt:0];
NSLog(@"%@", [spellChecker language]);
Run Code Online (Sandbox Code Playgroud)

结果是'en'但应该是'de'.

小智 43

可可用API来检查字符串的语言,并且最好尽可能使用Foundation over CoreFoundation.

NSArray *tagschemes = [NSArray arrayWithObjects:NSLinguisticTagSchemeLanguage, nil];
NSLinguisticTagger *tagger = [[NSLinguisticTagger alloc] initWithTagSchemes:tagschemes options:0];
[tagger setString:@"Das ist ein bisschen deutscher Text. Bitte löschen Sie diesen nicht."];
NSString *language = [tagger tagAtIndex:0 scheme:NSLinguisticTagSchemeLanguage tokenRange:NULL sentenceRange:NULL];
Run Code Online (Sandbox Code Playgroud)

或者,如果您碰巧有混合语言文本,则可以使用enumerateLinguisticTagsInRange API来获取文本中每个单词的语言.


And*_*ang 13

结果如下:

- (NSString *)languageForString:(NSString *) text{

     if (text.length < 100) {
         return (NSString *) CFStringTokenizerCopyBestStringLanguage((CFStringRef)text, CFRangeMake(0, text.length));
     } else {
         return (NSString *)CFStringTokenizerCopyBestStringLanguage((CFStringRef)text, CFRangeMake(0, 100));
     }
}
Run Code Online (Sandbox Code Playgroud)

  • return(NSString*)CFStringTokenizerCopyBestStringLanguage((CFStringRef)text,CFRangeMake(0,MIN(text.length,100))); 如果稍后修改对CFStringTokenizerCopyBestStringLanguage的调用,应该更清晰,更不容易出错 (4认同)

小智 8

你可以-requestCheckingOfString:…改用.NSTextCheckingTypeOrthography尝试识别字符串中使用的语言,并且完成处理程序接收一个NSOrthography参数,该参数可用于获取有关字符串中拼写法的信息,包括其主要语言.

以下示例输出dominant language = de:

NSSpellChecker *spellChecker = [NSSpellChecker sharedSpellChecker];
[spellChecker setAutomaticallyIdentifiesLanguages:YES];
NSString *spellCheckText = @"Guten Herr Mustermann. Dies ist ein deutscher Text. Bitte löschen Sie diesen nicht.";

[spellChecker requestCheckingOfString:spellCheckText
    range:(NSRange){0, [spellCheckText length]}
    types:NSTextCheckingTypeOrthography
    options:nil
    inSpellDocumentWithTag:0
    completionHandler:^(NSInteger sequenceNumber, NSArray *results, NSOrthography *orthography, NSInteger wordCount) {
        NSLog(@"dominant language = %@", orthography.dominantLanguage);
}];
Run Code Online (Sandbox Code Playgroud)


Sim*_*mon 6

Jennifer回答的快速String扩展:

extension String {
    func language() -> String? {
        let tagger = NSLinguisticTagger(tagSchemes: [NSLinguisticTagSchemeLanguage], options: 0)
        tagger.string = self
        return tagger.tagAtIndex(0, scheme: NSLinguisticTagSchemeLanguage, tokenRange: nil, sentenceRange: nil)
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

let language = "What language is this?".language()
Run Code Online (Sandbox Code Playgroud)