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

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

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

בחבילהלא חלק מהחבילה
שם הספרייהcom.google.mlkit:language-idcom.google.android.gms:play-services-mlkit-language-id
הטמעההמודל מקושר באופן סטטי לאפליקציה בזמן ה-build.הורדת המודל מתבצעת באופן דינמי דרך Google Play Services.
ההשפעה של גודל האפליקציההגדלה של כ-900KB.הגדלה של כ-200KB.
מועד האתחולהמודל זמין באופן מיידי.יכול להיות שתצטרכו להמתין להורדת המודל לפני השימוש הראשון.

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

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

  1. בקובץ build.gradle ברמת הפרויקט, חשוב לכלול את מאגר Maven של Google בקטע buildscript וגם בקטע allprojects.

  2. מוסיפים את יחסי התלות של ספריות ML Kit Android לקובץ GRid ברמת האפליקציה של המודול, בדרך כלל app/build.gradle. תוכלו לבחור באחד מיחסי התלות הבאים בהתאם לצרכים שלכם:

    כדי לקבץ את המודל עם האפליקציה:

    dependencies {
      // ...
      // Use this dependency to bundle the model with your app
      implementation 'com.google.mlkit:language-id:17.0.5'
    }
    

    כדי להשתמש במודל ב-Google Play Services:

    dependencies {
      // ...
      // Use this dependency to use the dynamically downloaded model in Google Play Services
      implementation 'com.google.android.gms:play-services-mlkit-language-id:17.0.0'
    }
    
  3. אם תבחרו להשתמש במודל ב-Google Play Services, תוכלו להגדיר שהאפליקציה תוריד את המודל באופן אוטומטי למכשיר אחרי התקנת האפליקציה מחנות Play. כדי לעשות את זה, צריך להוסיף את ההצהרה הבאה לקובץ AndroidManifest.xml של האפליקציה:

    <application ...>
          ...
          <meta-data
              android:name="com.google.mlkit.vision.DEPENDENCIES"
              android:value="langid" >
          <!-- To use multiple models: android:value="langid,model2,model3" -->
    </application>
    

    תוכלו גם לבדוק באופן מפורש את זמינות המודל ולבקש הורדה דרך ModuleInstallClient API של Google Play Services.

    אם לא מפעילים הורדות של מודלים בזמן ההתקנה או מבקשים הורדה מפורשת, הורדת המודל מתבצעת בפעם הראשונה שמריצים את המזהה. בקשות שמבצעים לפני סיום ההורדה לא מובילות לתוצאות.

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

כדי לזהות את השפה של מחרוזת, קוראים לפונקציה LanguageIdentification.getClient() כדי לקבל מופע של LanguageIdentifier, ואז מעבירים את המחרוזת ל-method identifyLanguage() של LanguageIdentifier.

למשל:

Kotlin

val languageIdentifier = LanguageIdentification.getClient()
languageIdentifier.identifyLanguage(text)
        .addOnSuccessListener { languageCode ->
            if (languageCode == "und") {
                Log.i(TAG, "Can't identify language.")
            } else {
                Log.i(TAG, "Language: $languageCode")
            }
        }
        .addOnFailureListener {
            // Model couldn’t be loaded or other internal error.
            // ...
        }

Java

LanguageIdentifier languageIdentifier =
        LanguageIdentification.getClient();
languageIdentifier.identifyLanguage(text)
        .addOnSuccessListener(
                new OnSuccessListener<String>() {
                    @Override
                    public void onSuccess(@Nullable String languageCode) {
                        if (languageCode.equals("und")) {
                            Log.i(TAG, "Can't identify language.");
                        } else {
                            Log.i(TAG, "Language: " + languageCode);
                        }
                    }
                })
        .addOnFailureListener(
                new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        // Model couldn’t be loaded or other internal error.
                        // ...
                    }
                });

אם הקריאה מצליחה, מועבר קוד שפה BCP-47 למאזינים המוצלחים כדי לציין את שפת הטקסט. אם המערכת לא מזהה שפה בוודאות, הקוד und (לא ידוע) מועבר.

כברירת מחדל, ערכת ML Kit מחזירה ערך שאינו und רק כאשר היא מזהה את השפה עם ערך סמך של 0.5 לפחות. אפשר לשנות את הסף הזה על ידי העברת אובייקט LanguageIdentificationOptions ל-getClient():

Kotlin

val languageIdentifier = LanguageIdentification
        .getClient(LanguageIdentificationOptions.Builder()
                .setConfidenceThreshold(0.34f)
                .build())

Java

LanguageIdentifier languageIdentifier = LanguageIdentification.getClient(
        new LanguageIdentificationOptions.Builder()
                .setConfidenceThreshold(0.34f)
                .build());

הצגת השפות האפשריות של מחרוזת

כדי לקבל את ערכי הסמך של השפות הנפוצות ביותר במחרוזת, צריך לקבל מופע של LanguageIdentifier ואז להעביר את המחרוזת ל-method identifyPossibleLanguages().

למשל:

Kotlin

val languageIdentifier = LanguageIdentification.getClient()
languageIdentifier.identifyPossibleLanguages(text)
        .addOnSuccessListener { identifiedLanguages ->
            for (identifiedLanguage in identifiedLanguages) {
                val language = identifiedLanguage.languageTag
                val confidence = identifiedLanguage.confidence
                Log.i(TAG, "$language $confidence")
            }
        }
        .addOnFailureListener {
            // Model couldn’t be loaded or other internal error.
            // ...
        }

Java

LanguageIdentifier languageIdentifier =
        LanguageIdentification.getClient();
languageIdentifier.identifyPossibleLanguages(text)
        .addOnSuccessListener(new OnSuccessListener<List<IdentifiedLanguage>>() {
            @Override
            public void onSuccess(List<IdentifiedLanguage> identifiedLanguages) {
                for (IdentifiedLanguage identifiedLanguage : identifiedLanguages) {
                    String language = identifiedLanguage.getLanguageTag();
                    float confidence = identifiedLanguage.getConfidence();
                    Log.i(TAG, language + " (" + confidence + ")");
                }
            }
        })
        .addOnFailureListener(
                new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        // Model couldn’t be loaded or other internal error.
                        // ...
                    }
                });

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

כברירת מחדל, ערכת ML Kit מחזירה רק שפות עם ערכי סמך של 0.01 לפחות. כדי לשנות את הסף הזה מעבירים את האובייקט LanguageIdentificationOptions אל getClient():

Kotlin

val languageIdentifier = LanguageIdentification
      .getClient(LanguageIdentificationOptions.Builder()
              .setConfidenceThreshold(0.5f)
              .build())

Java

LanguageIdentifier languageIdentifier = LanguageIdentification.getClient(
      new LanguageIdentificationOptions.Builder()
              .setConfidenceThreshold(0.5f)
              .build());

אם אין שפה שעומדת בסף הזה, ברשימה יש פריט אחד עם הערך und.