文本分类器使用机器学习技术来帮助开发者对文本进行分类。
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 引入了两个方法:suggestConversationActions
和 detectLanguage
。suggestConversationActions
方法可根据给定的对话生成建议的回复和操作,而 detectLanguage
方法则可检测文本所使用的语言。
这两个方法的模型文件如下所示,并可在 external/libtextclassifier/models/
中找到。
suggestionConversationActions
:actions_suggestions.universal.model
detectLanguage
:lang_id.model
如需使用出厂映像中的最新模型文件发布设备,请执行以下操作:
获取最新的模型文件。
external/libtextclassifier/models/update.sh
- 重命名下载的文件,以替换现有文件。
- 验证设置。
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 来实现智能选择和智能文本分享功能。
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