זיהוי שפת הטקסט באמצעות ML Kit ב-iOS

אפשר להשתמש ב-ML Kit כדי לזהות את השפה של מחרוזת טקסט. אפשר לקבל את השפה הסבירה ביותר של המחרוזת ואת ציוני הסמך של כל השפות האפשריות במחרוזת.

ML Kit מזהה טקסט ביותר מ-100 שפות שונות בסקריפטים המקוריים שלו. בנוסף, ניתן לזהות טקסט לטיני בשפות הבאות: ערבית, בולגרית, סינית, יוונית, הינדי, יפנית ורוסית. כדאי לעיין ברשימה המלאה של שפות וסקריפטים נתמכים.

אני רוצה לנסות

לפני שמתחילים

  1. יש לכלול את רצפי ה-ML Kit ב-Podfile:
    pod 'GoogleMLKit/LanguageID', '3.2.0'
    
  2. אחרי שמתקינים או מעדכנים את ה-Pods של הפרויקט, צריך לפתוח את פרויקט ה-Xcode באמצעות .xcworkspace שלו. ערכת ML Kit נתמכת ב-Xcode מגרסה 12.4 ואילך.

זיהוי השפה של מחרוזת

כדי לזהות את השפה של מחרוזת, מקבלים מופע של LanguageIdentification ומעבירים את המחרוזת ל-method 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 ולהעביר את המחרוזת ל-method 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 אובייקטים מועברת ל-handler ההמשך. מכל אובייקט תוכלו לקבל את קוד 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.