實作文字分類器

文字分類器會運用機器學習技術,協助開發人員分類文字。

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/ 中的 Compatibility Test Suite (CTS) 測試。

Android 10 版本文字分類器強化功能

Android 10 為 TextClassifier API 導入了兩種方法: suggestConversationActions detectLanguagesuggestConversationActions 方法會根據指定對話產生建議回覆和動作,而 detectLanguage 方法則會偵測文字的語言。

這些方法的模型檔案如下所示,您可以在 external/libtextclassifier/models/ 中找到。

  • suggestionConversationActions actions_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 意圖動作。

在設定疊加層中設定系統預設的文字分類器服務

[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 8.x 中,Android 9 模型檔案的命名模式如下:texclassifier.[language-code].model (例如 textclassifier.en.model),而非 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 意圖觸發更新,以動態方式更新模型。透過廣播此系統 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