זיהוי השפה שבה כתוב טקסט באמצעות למידת מכונה ב-iOS

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

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

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

  1. יש לכלול ב-Podfile את מוטות ה-ML Kit הבאים:
    pod 'GoogleMLKit/LanguageID', '3.2.0'
    
  2. לאחר ההתקנה או עדכון של ה-Pod של הפרויקט, פותחים את פרויקט 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 מועבר ל-handler להשלמה, המציין את שפת הטקסט. אם לא ניתן לזהות באופן בטוח את השפה, הקוד 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 מועברת ל-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.