文字分類器使用機器學習技術來幫助開發人員對文字進行分類。
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
意圖操作。
在配置覆蓋中設定係統預設文字分類器服務
[配置.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 實現智慧選擇和智慧文字共享功能。
文字分類器神經網路模型
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 意圖,框架能夠更新目前設定語言的語言模型。模型本身包含支援的語言和版本號,因此使用最新的適當模型。
因此,您不需要預先載入所有語言的模型,因為它們可以稍後添加。如果沒有找到指定語言的模型文件,文字分類將傳回無操作值。
相容性測試套件測試
相關的 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