實作文字分類器

文字分類器採用機器學習技術協助開發人員 例如分類文字

Android 11 版本文字分類器

Android 11 導入了可更新的預設值 程式碼中實作文字分類程式服務的 ExtServices 模組。搭載 Android 11 的裝置 或更高版本 getTextClassifier() 方法會在 ExtServices 模組中傳回這個預設實作。 建議裝置製造商將 TextClassifierService,因為可透過 Mainline OTA 更新 更新。

Android 11 也移除了本機文字分類器 先前介紹的 Android 8.1。因此 getLocalTextClassifier() 傳回 NO_OP 文字分類器。不要使用本機 您應改用 getDefaultTextClassifierImplementation() 方法。

適合想使用自己的文字分類的裝置製造商 演算法即可導入自訂文字分類服務,方法是指定 config.xmlconfig_defaultTextClassifierPackage 檔案。如果沒有指定這項設定,系統會採用預設的系統實作方式 自訂實作可以取得預設項目 呼叫 TextClassifierService.getDefaultTextClassifierImplementation(Context)。 若需更多資訊,請參閲 導入自訂文字分類器服務

測試

如要驗證文字分類器服務實作結果,請使用 中的 Compatibility Test Suite (CTS) 測試 platform/cts/tests/tests/textclassifier/

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) 的建議方式 提供文字分類系統支援文字分類器服務 。

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 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