实施文本分类器

文本分类器使用机器学习技术来帮助开发者对文本进行分类。

Android 11 版本文本分类器

Android 11 在 ExtServices 模块中引入了文本分类器服务的可更新默认实现。在运行 Android 11 或更高版本的设备上, getTextClassifier() 方法会在 ExtServices 模块中返回此默认实现。建议设备制造商使用 TextClassifierService 的此实现,因为它可以通过主线 OTA 更新进行更新。

Android 11 还移除了先前在 Android 8.1 中引入的本地文本分类器默认实现。因此, getLocalTextClassifier() 会返回 NO_OP 文本分类器。您应该使用 getDefaultTextClassifierImplementation() 方法,而不是本地实现。

对于可能希望使用自己的文本分类算法的设备制造商,他们可以通过在 config.xml 文件中指定 config_defaultTextClassifierPackage 来实现自定义文本分类器服务。如果未指定此配置,则使用默认系统实现。自定义实现可以通过调用 TextClassifierService.getDefaultTextClassifierImplementation(Context) 来获取默认实现的实例。有关详细信息,请参阅 实现自定义文本分类器服务

测试

要验证您的文本分类器服务实现,请使用 platform/cts/tests/tests/textclassifier/ 中的兼容性测试套件 (CTS) 测试。

Android 10 版本文本分类器增强功能

Android 10 为 TextClassifier API 引入了两种方法: suggestConversationActions detectLanguagesuggestConversationActions 方法从给定的对话中生成建议的回复和操作,而 detectLanguage 方法检测文本的语言。

这些方法的模型文件如下所示,可以在 external/libtextclassifier/models/ 中找到。

  • suggestionConversationActions: actions_suggestions.universal.model
  • detectLanguage: lang_id.model

要在您的工厂映像中使用最新的模型文件发布设备,请执行以下操作:

  1. 获取最新的模型文件。

    external/libtextclassifier/models/update.sh
    
  2. 重命名下载的文件以替换现有文件。
  3. 验证设置。
    adb shell dumpsys textclassification
    

    这是该命令的输出示例。

    TextClassifierImpl:
      Annotator model file(s):
        ModelFile { path=/etc/textclassifier/textclassifier.universal.model name=textclassifier.universal.model version=608 locales=und }
        ModelFile { path=/etc/textclassifier/textclassifier.en.model name=textclassifier.en.model version=608 locales=en }
      LangID model file(s):
        ModelFile { path=/etc/textclassifier/lang_id.model name=lang_id.model version=0 locales=und }
      Actions model file(s):
        ModelFile { path=/etc/textclassifier/actions_suggestions.universal.model name=actions_suggestions.universal.model version=0 locales=und }

Android 9 版本文本分类器增强功能

Android 9 通过新的文本分类器服务扩展了 Android 8.1 中引入的文本分类框架。文本分类器服务是 OEM 提供文本分类系统支持的推荐方式。文本分类器服务可以是任何系统 APK 的一部分,并且可以在必要时进行更新。

Android 9 包括默认的文本分类器服务实现 ( TextClassifierImpl),除非您将其替换为自定义文本分类器服务实现,否则将使用该实现。

实现自定义文本分类器服务

以下部分介绍如何实现您开发的自定义文本分类器服务。

扩展 android.service.textclassifier.TextClassifierService

public final class TextClassifierServiceImpl
        extends TextClassifierService {

    // Returns TextClassifierImpl.
    private final TextClassifier tc = getLocalTextClassifier();

    @Override
    public void onSuggestSelection(
            @Nullable TextClassificationSessionId sessionId,
            @NonNull TextSelection.Request request,
            @NonNull CancellationSignal cancellationSignal,
            @NonNull Callback<TextSelection> callback) {
        CompletableFuture.supplyAsync(
                () -> tc.suggestSelection(request))
                .thenAccept(r -> callback.onSuccess(r));
    }

    @Override
    public void onClassifyText(
            @Nullable TextClassificationSessionId sessionId,
		@NonNull TextClassification.Request request,
		@NonNull CancellationSignal cancellationSignal,
		@NonNull Callback<TextClassification> callback) {
        ...
    }

    @Override
    public void onGenerateLinks(
            @Nullable TextClassificationSessionId sessionId,
            @NonNull TextLinks.Request request,
            @NonNull CancellationSignal cancellationSignal,
            @NonNull Callback<TextLinks> callback) {
        ...
    }
    ...
}

在 Android 清单中定义服务

[AndroidManifest.xml]

<service android:name=".TextClassifierServiceImpl"
  android:permission="android.permission.BIND_TEXTCLASSIFIER_SERVICE">
    <intent-filter>
      <action android:name=
        "android.service.textclassifier.TextClassifierService"/>
    </intent-filter>
</service>

请注意,该服务必须需要 android.permission.BIND_TEXTCLASSIFIER_SERVICE 权限,并且必须指定 android.service.textclassifier.TextClassifierService intent 操作。

在配置叠加层中设置系统默认文本分类器服务

[config.xml]

<string name="config_defaultTextClassifierPackage" translatable="false">com.example.textclassifierservice</string>

将文本分类器服务构建到系统映像中

您的自定义文本分类器服务可以是构建到系统映像中的独立 APK,也可以是另一个系统 APK 的一部分。系统使用 PackageManager.MATCH_SYSTEM_ONLY 来解析服务。

测试

android.view.textclassifier.cts 中运行测试。

Android 9 中的其他文本分类更改

请参阅 检查已安装的语言模块

Android 9 模型文件与 Android 8.x 模型文件不兼容。

Android 9 模型文件具有命名模式:texclassifier.[language-code].model(例如,textclassifier.en.model)而不是 Android 8.x 中的 textclassifier.smartselection.en.model

获取最新的文本分类模型文件

要获取最新的模型,可以运行以下脚本,该脚本会更新源代码树中的 TextClassifier 模型

external/libtextclassifier/native/models/update.sh

Android 8.1 版本文本分类器

Android 8.1 引入了 TextClassfier API 来实现文本分类。

TextClassificationManager tcm =
    context.getSystemService(TextClassificationManager.class);
TextClassifier classifier = tcm.getTextClassifier();
TextSelection selection = classifier.suggestSelection(...);
TextClassification classification = classifier.classifyText(...);

开发者可以设置自定义文本分类器

tcm.setTextClassifier(customTextClassifier);

但是,如果应用开发者将文本分类器设置为 null,则会为 getTextClassifier() 返回系统默认文本分类器。

请参阅 android.view.textclassifier.TextClassifierImpl

TextView 和 WebView 使用 TextClassifier 实现智能选择和智能文本共享功能。

Text classifier usage

图 1. TextClassifier 用法

TextClassifier 神经网络模型

Android 开源项目 (AOSP) 提供了许多用于分类文本的神经网络模型。每个模型文件都针对一种语言进行训练。您可以安装任何模型组合。这些模型在以下位置定义:

external/libtextclassifier/Android.mk

在设备上预安装语言模型

您可以指定语言模型包并在设备上安装它们

# -----------------------
# Smart Selection bundles
# -----------------------

include $(CLEAR_VARS)
LOCAL_MODULE           := textclassifier.smartselection.bundle1
LOCAL_REQUIRED_MODULES := textclassifier.smartselection.en.model
LOCAL_REQUIRED_MODULES += textclassifier.smartselection.es.model
LOCAL_REQUIRED_MODULES += textclassifier.smartselection.de.model
LOCAL_REQUIRED_MODULES += textclassifier.smartselection.fr.model
include $(BUILD_STATIC_LIBRARY)

例如,在 device/google/marlin/device-common.mk 中。

# TextClassifier smart selection model files
PRODUCT_PACKAGES += \
    textclassifier.smartselection.bundle1

检查已安装的语言模块

使用 ADB 列出目录中的文件

$ adb shell ls -l /etc/textclassifier
-rw-r--r-- 1 root root ... textclassifier.smartselection.de.model
-rw-r--r-- 1 root root ... textclassifier.smartselection.en.model
-rw-r--r-- 1 root root ... textclassifier.smartselection.es.model
-rw-r--r-- 1 root root ... textclassifier.smartselection.fr.model

模型更新

模型可以通过以下方式更新:将新模型作为系统映像更新的一部分包含在内,或者通过系统组件动态更新,该系统组件通过系统 API ACTION_UPDATE_SMART_SELECTION intent 触发更新。通过广播此系统 API intent,框架能够更新当前设置语言的语言模型。模型本身包含支持的语言和版本号,以便使用最新的适当模型。

因此,您无需预加载所有语言的模型,因为它们可以在以后添加。如果找不到指定语言的模型文件,则文本分类将返回空操作值。

兼容性测试套件测试

相关的 Android 兼容性测试套件 (CTS) 测试可以在以下位置找到:

cts/tests/tests/view/src/android/view/textclassifier/cts/TextClassificationManagerTest.java

cts/tests/tests/widget/src/android/widget/cts/TextViewTest.java

  • testSmartSelection
  • testSmartSelection_dragSelection
  • testSmartSelection_resetSelection