实现文本分类

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

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/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 来实现智能选择和智能文本分享功能:

图 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