Określ język tekstu za pomocą ML Kit na Androidzie

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

Aby określić język ciągu tekstowego, możesz użyć ML Kit. Można uzyskać najbardziej prawdopodobny ciąg znaków oraz wszystkie stany ufności dla wszystkich możliwych ciągów znaków.

ML Kit rozpoznaje tekst w ponad 100 językach w skryptach natywnych. Oprócz tego tekst zromanizowany może być rozpoznawany w języku arabskim, bułgarskim, chińskim, hindi, japońskim, rosyjskim i rosyjskim. Zobacz pełną listę obsługiwanych języków i skryptów.

Istnieją 2 sposoby integrowania identyfikacji języka: połączenie modelu w ramach aplikacji lub użycie pakietu niezależnego od Usług Google Play. Jeśli wybierzesz pakiet bez pakietu, aplikacja będzie mniejsza. Szczegółowe informacje znajdziesz w tabeli poniżej.

PołączonaNiegrupowane
Nazwa bibliotekicom.google.mlkit:language-idcom.google.android.gms:play-services-mlkit-language-id
ImplementacjaStatyczny model jest połączony z aplikacją w czasie kompilowania.Model jest pobierany dynamicznie przez Usługi Google Play.
Wpływ na rozmiar aplikacjiWzrost o około 1,3 MB.Powiększenie o około 500 KB.
Czas inicjowaniaModel jest dostępny od razu.Zanim zaczniesz korzystać z modelu, może minąć trochę czasu.

Zanim zaczniesz

  1. W pliku build.gradle na poziomie projektu umieść repozytorium Google Maven w sekcjach buildscript i allprojects.

  2. Dodaj zależności do bibliotek ML Kit na Androida do pliku Gradle na poziomie aplikacji, który zwykle wynosi app/build.gradle. W zależności od potrzeb wybierz jedną z tych zależności:

    Aby połączyć model z aplikacją:

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

    Aby korzystać z modelu w Usługach 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. Jeśli zdecydujesz się używać modelu w Usługach Google Play, możesz skonfigurować aplikację tak, aby po zainstalowaniu aplikacji ze Sklepu Play była ona automatycznie pobierana na urządzenie. Aby to zrobić, dodaj tę deklarację do pliku AndroidManifest.xml aplikacji:

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

    Możesz też bezpośrednio sprawdzić dostępność modelu i poprosić o jego pobranie przy użyciu interfejsu ModuleInstallClient API w usługach Google Play.

    Jeśli nie włączysz pobierania modelu w czasie instalacji lub nie zezwolisz na pobieranie danych bez ograniczeń, model zostanie pobrany przy pierwszym uruchomieniu identyfikatora. Prośby przesłane przed zakończeniem pobierania nie zwracają żadnych wyników.

Rozpoznawanie języka ciągu znaków

Aby zidentyfikować język ciągu, wywołaj metodę LanguageIdentification.getClient(), aby uzyskać instancję LanguageIdentifier, a następnie przekazać ten ciąg do metody identifyLanguage() metody LanguageIdentifier.

Przykład:

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.
                        // ...
                    }
                });

Jeśli wywołanie się powiedzie, do detektora zostanie przekazany kod języka BCP-47, który wskazuje język tekstu. Jeśli nie uda się wykryć żadnego języka, zostanie przekazany kod und (nieokreślony).

Domyślnie zestaw ML Kit zwraca wartość inną niż und tylko wtedy, gdy identyfikuje język z wartością ufności na poziomie co najmniej 0,5. Możesz zmienić ten próg, przesyłając obiekt LanguageIdentificationOptions do getClient():

Kotlin

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

Java

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

Poznaj możliwe języki ciągu

Aby uzyskać wartości ufności ciągu tekstowego, pobierz instancję LanguageIdentifier i przekaż ciąg znaków do metody identifyPossibleLanguages().

Przykład:

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.
                        // ...
                    }
                });

Jeśli wywołanie się powiedzie, lista obiektów IdentifiedLanguage zostanie przekazana do detektora powodzenia. Z każdego obiektu możesz uzyskać kod BCP-47 dla języka, a także pewność, że ciąg znaków jest w tym języku. Te wartości pokazują pewność, że cały ciąg jest w danym języku. ML Kit nie rozpoznaje wielu języków w jednym ciągu.

Domyślnie ML Kit zwraca tylko języki, w których wartość ufności wynosi co najmniej 0,01. Możesz zmienić ten próg, przesyłając obiekt LanguageIdentificationOptions do getClient():

Kotlin

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

Java

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

Jeśli żaden język nie przekracza tego progu, lista zawiera jeden element z wartością und.