Определение языка текста с помощью ML Kit на iOS

С помощью ML Kit можно определить язык текстовой строки. Вы можете получить наиболее вероятный язык строки, а также оценки достоверности для всех возможных языков строки.

ML Kit распознает текст более чем на 100 языках, написанный на языке оригинала. Кроме того, распознается текст, написанный латиницей, на арабском, болгарском, греческом, китайском, русском, хинди и японском языках. Ознакомьтесь с полным списком поддерживаемых языков и систем письма.

Попробовать

Подготовка

  1. Добавьте в Podfile следующие контейнеры ML Kit:
    pod 'GoogleMLKit/LanguageID', '8.0.0'
    
  2. После установки или обновления Pods откройте проект Xcode, используя файл .xcworkspace. ML Kit поддерживается в Xcode версии 12.4 и выше.

Как определить язык строки

Чтобы определить язык строки, получите экземпляр LanguageIdentification, а затем передайте строку методу identifyLanguage(for:).

Пример:

Swift

let languageId = NaturalLanguage.languageIdentification()

languageId.identifyLanguage(for: text) { (languageCode, error) in
  if let error = error {
    print("Failed with error: \(error)")
    return
  }
  if let languageCode = languageCode, languageCode != "und" {
    print("Identified Language: \(languageCode)")
  } else {
    print("No language was identified")
  }
}

Objective-C

MLKLanguageIdentification *languageId = [MLKLanguageIdentification languageIdentification];

[languageId identifyLanguageForText:text
                         completion:^(NSString * _Nullable languageCode,
                                      NSError * _Nullable error) {
                           if (error != nil) {
                             NSLog(@"Failed with error: %@", error.localizedDescription);
                             return;
                           }
                           if (![languageCode isEqualToString:@"und"] ) {
                             NSLog(@"Identified Language: %@", languageCode);
                           } else {
                             NSLog(@"No language was identified");
                           }
                         }];

Если вызов выполнен успешно, обработчику завершения передается код языка BCP-47, указывающий на язык текста. Если язык определить не удалось, передается код und (неопределенный).

По умолчанию ML Kit возвращает значение, отличное от und, только если он определяет язык с уровнем достоверности не менее 0,5. Вы можете изменить это пороговое значение, передав объект LanguageIdentificationOptions в languageIdentification(options:):

Swift

let options = LanguageIdentificationOptions(confidenceThreshold: 0.4)
let languageId = NaturalLanguage.languageIdentification(options: options)

Objective-C

MLKLanguageIdentificationOptions *options =
    [[MLKLanguageIdentificationOptions alloc] initWithConfidenceThreshold:0.4];
MLKLanguageIdentification *languageId =
    [MLKLanguageIdentification languageIdentificationWithOptions:options];

Как определить возможные языки строки

Чтобы получить значения достоверности для наиболее вероятных языков строки, получите экземпляр LanguageIdentification, а затем передайте строку методу identifyPossibleLanguages(for:).

Пример:

Swift

let languageId = NaturalLanguage.languageIdentification()

languageId.identifyPossibleLanguages(for: text) { (identifiedLanguages, error) in
  if let error = error {
    print("Failed with error: \(error)")
    return
  }
  guard let identifiedLanguages = identifiedLanguages,
    !identifiedLanguages.isEmpty,
    identifiedLanguages[0].languageCode != "und"
  else {
    print("No language was identified")
    return
  }

  print("Identified Languages:\n" +
    identifiedLanguages.map {
      String(format: "(%@, %.2f)", $0.languageCode, $0.confidence)
      }.joined(separator: "\n"))
}

Objective-C

MLKLanguageIdentification *languageId = [MLKLanguageIdentification languageIdentification];

[languageId identifyPossibleLanguagesForText:text
                                  completion:^(NSArray * _Nonnull identifiedLanguages,
                                               NSError * _Nullable error) {
  if (error != nil) {
    NSLog(@"Failed with error: %@", error.localizedDescription);
    return;
  }
  if (identifiedLanguages.count == 1
      && [identifiedLanguages[0].languageCode isEqualToString:@"und"] ) {
    NSLog(@"No language was identified");
    return;
  }
  NSMutableString *outputText = [NSMutableString stringWithFormat:@"Identified Languages:"];
  for (MLKIdentifiedLanguage *language in identifiedLanguages) {
    [outputText appendFormat:@"\n(%@, %.2f)", language.languageCode, language.confidence];
  }
  NSLog(outputText);
}];

Если вызов выполнен успешно, обработчику продолжения передается список объектов IdentifiedLanguage. Из каждого объекта можно получить код языка по стандарту BCP-47 и степень уверенности в том, что строка написана на этом языке. Обратите внимание, что эти значения указывают на уверенность в том, что вся строка написана на определенном языке. ML Kit не определяет несколько языков в одной строке.

По умолчанию ML Kit возвращает только языки, для которых уровень достоверности составляет не менее 0,01. Вы можете изменить этот порог, передав объект LanguageIdentificationOptions в функцию languageIdentification(options:):

Swift

let options = LanguageIdentificationOptions(confidenceThreshold: 0.4)
let languageId = NaturalLanguage.languageIdentification(options: options)

Objective-C

MLKLanguageIdentificationOptions *options =
    [[MLKLanguageIdentificationOptions alloc] initWithConfidenceThreshold:0.4];
MLKLanguageIdentification *languageId =
    [MLKLanguageIdentification languageIdentificationWithOptions:options];

Если ни один язык не соответствует этому порогу, в списке будет один элемент со значением und.