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

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

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 לקובץ ההדרגתיות של המודול ברמת האפליקציה, שהוא בדרך כלל 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.

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

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

כדי לזהות את השפה של מחרוזת, צריך לקרוא לפונקציה LanguageIdentification.getClient() על מנת לקבל מופע של LanguageIdentifier, ואז להעביר את המחרוזת לשיטה 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 מועבר ל-listener, שמציין את השפה של הטקסט. אם לא זוהתה שפה כלשהי באופן מהימן, הקוד und (לא ידוע) מועבר.

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