使用机器学习套件识别文本语言 (Android)

您可以使用机器学习套件识别文本字符串的语言。您可以获取字符串最可能使用的语言,以及字符串的所有可用语言的置信度分数。

机器学习套件可以在其原生脚本中识别 100 多种语言的不同文本。 此外,还可以识别以罗马字母书写的文本,包括阿拉伯语、保加利亚语、中文、希腊语、印地语、日语和俄语。请参阅受支持语言和脚本的完整列表

集成语言识别的方法有两种:将模型作为应用的一部分捆绑在一起,或使用依赖于 Google Play 服务的未捆绑模型。如果选择未捆绑模型,您的应用会变小。请参阅下表了解详情。

组合未捆绑
库名称com.google.mlkit:language-idcom.google.android.gms:play-services-mlkit-language-id
实现模型在构建时静态关联到您的应用。模型是通过 Google Play 服务动态下载的。
应用大小影响大小增加约 1.3 MB。大小增加约 500 KB。
初始化时间模型可立即使用。可能需要等到模型下载完毕后再使用。
  • 请试用示例应用,以查看此 API 的用法示例。

准备工作

  1. 请务必在您的项目级 build.gradle 文件中的 buildscriptallprojects 部分添加 Google 的 Maven 代码库。

  2. 将 Android 版机器学习套件库的依赖项添加到您的模块的应用级 Gradle 文件(通常为 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 服务中使用模型,则可以对应用进行配置,使其在从 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>
    

    您还可以通过 Google Play 服务 ModuleInstallClient API 明确检查模型的可用性并请求下载。

    如果您未启用安装时模型下载或请求显式下载,系统会在您首次运行标识符时下载模型。您在下载完毕之前提出的请求不会产生任何结果。

识别字符串使用的语言

如需识别字符串使用的语言,请调用 LanguageIdentification.getClient() 以获取 LanguageIdentifier 的实例,然后将字符串传递给 LanguageIdentifieridentifyLanguage() 方法。

例如:

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(未确定)。

默认情况下,机器学习套件仅在识别置信度值至少为 0.5 的语言时才会返回非 und 值。您可以通过将 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 代码以及字符串使用该语言的置信度。请注意,这些值表示整个字符串采用给定语言的置信度;机器学习套件无法识别单个字符串中的多种语言。

默认情况下,机器学习套件仅返回置信度值至少为 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 的项。