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

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

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

יש שתי דרכים לשלב זיהוי שפה: באמצעות קיבוץ המודל כחלק מהאפליקציה או שימוש במודל ללא חבילה שתלוי בשירותי Google Play. אם בוחרים את המודל שאינו בחבילה, האפליקציה שלכם תהיה קטנה יותר. עיינו כאן בטבלה כדי לקבל פרטים נוספים.

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

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

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

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

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

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

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

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