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

קל לארגן דפים בעזרת אוספים אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.

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

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

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

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

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

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

  2. מוסיפים את יחסי התלות של ספריות ה-Android של ערכת ה-ML, לקובץ Grad ברמת האפליקציה, שהוא בדרך כלל 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 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, ולאחר מכן להעביר את המחרוזת למתודה 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 מוחזרת ערך שהוא לא 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 לא מזהה מספר שפות במחרוזת אחת.

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