Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

實現文本分類器

文本分類器使用機器學習技術來幫助開發人員對文本進行分類。

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/

  • suggestionConversationActions actions_suggestions.universal.model
  • detectLanguage lang_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 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目的觸發更新的系統組件來動態更新API ACTION_UPDATE_SMART_SELECTION 。通過廣播此系統API意圖,框架可以更新當前設置的語言的語言模型。這些模型本身包含受支持的語言和版本號,因此將使用最新的適當模型。

因此,您無需為所有語言預加載模型,因為以後可以添加它們。如果找不到用於指定語言的模型文件,則文本分類將返回無操作值。

兼容性測試套件測試

相關的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