Подтвердить что ты не робот

Обнаружить язык 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".

4b9b3361

Ответ 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);

Выход (для обоих):

ан
эс