Google 致力于为黑人社区推动种族平等。查看具体举措

实现文本分类器

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

Android 11 版本的文本分类器

Android 11 引入了 ExtServices 模块中文本分类器服务的可更新默认实现。在搭载 Android 11 或更高版本的设备上,getTextClassifier() 方法会返回 ExtServices 模块中的此默认实现。建议设备制造商使用此 TextClassifierService 实现,因为它可以通过 Mainline 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 引入了两个方法:suggestConversationActionsdetectLanguagesuggestConversationActions 方法可根据给定的对话生成建议的回复和操作,而 detectLanguage 方法则可检测文本所使用的语言。

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

  • suggestionConversationActionsactions_suggestions.universal.model
  • detectLanguagelang_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 叠加层中设置系统默认文本分类器服务

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

文本分类器的使用

图 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