检测NSString的语言

时间:2011-06-12 22:19:10

标签: ios objective-c cocoa

有人告诉我有关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]);

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

6 个答案:

答案 0 :(得分: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];

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

答案 1 :(得分: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));
     }
}

答案 2 :(得分: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);
}];

答案 3 :(得分:6)

Jennifer回答的快速字符串扩展名:

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)
    }
}

用法:

let language = "What language is this?".language()

答案 4 :(得分:2)

使用Swift 4.2,您可以选择以下方法之一来检测给定字符串的语言。


#1。使用NSLinguisticTagger的{​​{1}}属性

自iOS 11起,dominantLanguage具有一个名为dominantLanguage的属性。 NSLinguisticTagger具有以下声明:

dominantLanguage
  

返回用于语言标记器的字符串集的主要语言。

下面的Playground示例代码展示了如何使用var dominantLanguage: String? { get } 来了解字符串的主导语言:

dominantLanguage

#2。使用import Foundation let text = "あなたはそれを行うべきではありません。" let tagger = NSLinguisticTagger(tagSchemes: [.language], options: 0) tagger.string = text let language = tagger.dominantLanguage print(language) // Optional("ja") 的{​​{1}}方法

作为替代方案,NSLinguisticTagger有一个方便的方法,称为dominantLanguage(for:),用于创建新的语言标记器,设置其string属性和获取dominantLanguage(for:)属性。 NSLinguisticTagger具有以下声明:

dominantLanguage
  

返回指定字符串的主导语言。

用法:

dominantLanguage(for:)

#3。使用class func dominantLanguage(for string: String) -> String? 的{​​{1}}属性

自iOS 12起,import Foundation let text = "Die Kleinen haben friedlich zusammen gespielt." let language = NSLinguisticTagger.dominantLanguage(for: text) print(language) // Optional("de") 具有名为dominantLanguage的属性。 NLLanguageRecognizer具有以下声明:

dominantLanguage
  

处理后的文本最可能的语言。

以下是使用NLLanguageRecognizer来猜测自然语言文本的主要语言的方法:

dominantLanguage

答案 5 :(得分:0)

从iOS 11开始,您可以使用dominantLanguage(for:)的{​​{1}} / dominantLanguageForString:类方法。

迅速:

NSLinguisticTagger

Objective-C:

extension String {
    var language: String? {
        return NSLinguisticTagger.dominantLanguage(for: self)
    }
}

print("Good morning".language)
print("Buenos días".language)

输出(两者):

  

en
  es