2011-06-12 98 views
35

有人告訴我有關Cocoa語言識別的類。 有人知道它是哪一個嗎?檢測NSString的語言

這是工作:

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

結果是 '恩',但應該是 '德'。

謝謝...

+0

我的德語不太好,但它不應該是「einen德意志文本」?對不起,如果我錯了。 – 2011-06-12 22:24:16

+1

+1很棒的問題!花了我花在框架上的時間,我很驚訝我從來沒有聽說過這種語言檢測。 – 2011-06-12 23:39:59

+2

@WTP:不,它是「ein」。不過,你會說「Ich lese * einen * deutschen Text」。 ;)德語是一個討厭的婊子。充滿熵。 ;)#native – Regexident 2011-06-13 00:07:01

回答

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)); 
    } 
} 
+4

返回(NSString *)CFStringTokenizerCopyBestStringLanguage((CFStringRef)text,CFRangeMake(0,MIN(text.length,100)));如果稍後將修改調用到CFStringTokenizerCopyBestStringLanguage – Guillaume 2011-11-19 12:13:54

+1

對於像「hello」這樣的簡短字,它將返回「it」,應該更清楚並且不太容易引入錯誤。意大利? – 2014-05-25 06:32:11

+0

那麼,它的工作好點大句子,但「ich bin Umair」出來,但是「nl」而不是「de」 – umairhhhs 2017-03-16 18:20:57

7

可以使用-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); 
}]; 
+0

此代碼完美工作。任何人都可以知道快速2.1等效 – user226372 2015-12-10 18:06:08

39

中有可用於檢查一個字符串的語言可可API,它始終是最好用粉底儘可能在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

這很好用!你甚至可以簡單地調用'[tagger orthographyAtIndex:0 effectiveRange:nil]'來創建'NSOrthography'。絕對是最好的答案。謝謝。 – 2012-12-11 10:39:55

5

詹妮弗的回答迅速串擴展:

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() 
+0

let language =「%」。language()// --->這是一個崩潰! – 2017-04-18 11:28:44

+0

不知道這是支持在iOS - 真棒 – RJH 2017-05-02 17:53:58

+0

#Tim FriedLand比不強迫包裝它。只是讓它可選。當不理解語言時,它將顯示無價值。 – MRizwan33 2017-11-13 06:56:02