Обнаружить язык NSString
Кто-то рассказал мне о классе для распознавания языка в 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".
Ответы
Ответ 1
Это результат:
- (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
В интерфейсе cocoa имеется 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, чтобы получить язык каждого слова в тексте.
Ответ 3
Вместо этого вы можете использовать -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);
}];
Ответ 4
Быстрое расширение строки для ответа Дженнифер:
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()
Ответ 5
С Swift 5 вы можете выбрать один из следующих подходов, чтобы определить язык данной строки.
# 1. Использование NSLinguisticTagger
dominantLanguage
Начиная с iOS 11, NSLinguisticTagger
имеет свойство под названием dominantLanguage
. dominantLanguage
имеет следующее объявление:
var dominantLanguage: String? { get }
Возвращает доминирующий язык строки, установленной для лингвистического тегера.
Пример кода Playground ниже показывает, как использовать dominantLanguage
, чтобы знать доминирующий язык строки:
import Foundation
let text = "あなたはそれを行うべきではありません。"
let tagger = NSLinguisticTagger(tagSchemes: [.language], options: 0)
tagger.string = text
let language = tagger.dominantLanguage
print(language) // Optional("ja")
# 2. Использование NSLinguisticTagger
dominantLanguage(for:)
метода dominantLanguage(for:)
В качестве альтернативы NSLinguisticTagger
имеет NSLinguisticTagger
метод dominantLanguage(for:)
для создания нового лингвистического тегера, установки его string
свойства и получения свойства dominantLanguage
. dominantLanguage(for:)
имеет следующее объявление:
class func dominantLanguage(for string: String) -> String?
Возвращает доминирующий язык для указанной строки.
Использование:
import Foundation
let text = "Die Kleinen haben friedlich zusammen gespielt."
let language = NSLinguisticTagger.dominantLanguage(for: text)
print(language) // Optional("de")
# 3. Использование NLLanguageRecognizer
dominantLanguage
Начиная с iOS 12, NLLanguageRecognizer
имеет свойство под названием dominantLanguage
. dominantLanguage
имеет следующее объявление:
var dominantLanguage: NLLanguage? { get }
Наиболее вероятный язык для обработанного текста.
Вот как использовать dominantLanguage
чтобы угадать доминирующий язык текста на естественном языке:
import NaturalLanguage
let string = "J'ai deux amours. Mon pays et Paris."
let recognizer = NLLanguageRecognizer()
recognizer.processString(string)
let language = recognizer.dominantLanguage
print(language?.rawValue) // Optional("fr")
Ответ 6
Начиная с iOS 11 вы можете использовать dominantLanguage(for:)
/dominantLanguageForString:
метод класса NSLinguisticTagger
.
Swift:
extension String {
var language: String? {
return NSLinguisticTagger.dominantLanguage(for: self)
}
}
print("Good morning".language)
print("Buenos días".language)
Objective-C:
@interface NSString (Tagger)
@property (nonatomic, readonly, nullable) NSString *language;
@end
@implementation NSString (Tagger)
- (NSString *)language {
return [NSLinguisticTagger dominantLanguageForString:self];
}
@end
NSLog(@"%@", @"Good morning".language);
NSLog(@"%@", @"Buenos días".language);
Выход (для обоих):
ан
эс