Identificar o idioma do texto com o Kit de ML no Android

É possível usar o Kit de ML para identificar o idioma de uma string de texto. É possível conferir o idioma mais provável da string, bem como as pontuações de confiança de todos os idiomas possíveis.

O Kit de ML reconhece textos em mais de cem idiomas diferentes nos scripts nativos. Além disso, o texto romanizado pode ser reconhecido em árabe, búlgaro, chinês, grego, hindi, japonês e russo. Veja a lista completa de linguagens e scripts compatíveis.

AgrupadasDesagrupados
Nome da bibliotecacom.google.mlkit:language-idcom.google.android.gms:play-services-mlkit-language-id
ImplementaçãoO modelo é estaticamente vinculado ao app no tempo de compilação.O download do modelo é feito dinamicamente pelo Google Play Services.
Impacto no tamanho do appAumento de aproximadamente 900 KB no tamanho.Aumento de aproximadamente 200 KB no tamanho.
Tempo de inicializaçãoO modelo fica disponível imediatamente.Talvez seja necessário aguardar o download do modelo para usá-lo pela primeira vez.

Testar

Antes de começar

  1. No arquivo build.gradle no nível do projeto, inclua o repositório Maven do Google nas seções buildscript e allprojects.

  2. Adicione as dependências das bibliotecas do Android do Kit de ML ao arquivo Gradle do módulo no nível do app, que geralmente é app/build.gradle. Escolha uma das seguintes dependências com base nas suas necessidades:

    Para agrupar o modelo e o app:

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

    Para usar o modelo no 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. Se você optar por usar o modelo no Google Play Services, poderá configurar seu app para fazer o download automaticamente do modelo no dispositivo depois que o app for instalado da Play Store. Para fazer isso, adicione a seguinte declaração ao arquivo AndroidManifest.xml do seu app:

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

    Você também pode verificar explicitamente a disponibilidade do modelo e solicitar o download pela API ModuleInstallClient do Google Play Services.

    Se você não ativar os downloads do modelo no momento da instalação ou solicitar um download explícito, o modelo será transferido na primeira vez que você executar o identificador. As solicitações feitas antes da conclusão do download não geram resultados.

Identificar o idioma de uma string

Para identificar o idioma de uma string, chame LanguageIdentification.getClient() para receber uma instância de LanguageIdentifier e, em seguida, transmita a string para o método identifyLanguage() de LanguageIdentifier.

Exemplo:

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

Se a chamada for bem-sucedida, um código de idioma BCP-47 (link em inglês) será transmitido ao listener de êxito, indicando o idioma do texto. Se nenhum idioma for detectado com confiança, o código und (indeterminado) será transmitido.

Por padrão, o Kit de ML retorna um valor diferente de und somente quando identifica o idioma com um valor de confiança de pelo menos 0,5. Para alterar esse limite, transmita um objeto LanguageIdentificationOptions para getClient():

Kotlin

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

Java

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

Identificar os possíveis idiomas de uma string

Para receber os valores de confiança dos idiomas mais prováveis de uma string, receba uma instância de LanguageIdentifier e, em seguida, transmita a string para o método identifyPossibleLanguages().

Exemplo:

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

Se a chamada for bem-sucedida, uma lista de objetos IdentifiedLanguage será transmitida ao listener de êxito. Você pode receber o código BCP-47 do idioma de cada objeto e o nível de confiança de que a string está nesse idioma. Esses valores indicam a confiança de que toda a string está no idioma especificado. O Kit de ML não identifica vários idiomas em uma única string.

Por padrão, o Kit de ML retorna apenas idiomas com valores de confiança de pelo menos 0,01. É possível alterar esse limite transmitindo um objeto LanguageIdentificationOptions para getClient():

Kotlin

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

Java

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

Se nenhum idioma atingir esse limite, a lista terá um item com o valor und.