文字分類器會運用機器學習技術,協助開發人員分類文字。
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.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 推出 TextClassifier 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
意圖觸發更新的系統元件動態更新。廣播這個系統 API 意圖後,架構就能更新目前所設語言的語言模型。模型本身包含支援的語言和版本號碼,因此系統會使用最合適的最新模型。
因此您不需要預先載入所有語言的模型,因為稍後可以新增。如果找不到指定語言的模型檔案,文字分類就會傳回無運算值。
Compatibility Test Suite 測試
相關的 Android Compatibility Test Suite (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