Triển khai công cụ phân loại văn bản

Trình phân loại văn bản sử dụng các kỹ thuật học máy để giúp nhà phát triển phân loại văn bản.

Công cụ phân loại văn bản trong bản phát hành Android 11

Android 11 giới thiệu một chế độ triển khai mặc định có thể cập nhật của dịch vụ phân loại văn bản trong mô-đun ExtServices. Trên các thiết bị chạy Android 11 trở lên, phương thức getTextClassifier() sẽ trả về chế độ triển khai mặc định này trong mô-đun ExtServices. Các nhà sản xuất thiết bị nên sử dụng chế độ triển khai TextClassifierService này vì chế độ này có thể được cập nhật thông qua các bản cập nhật OTA Mainline.

Android 11 cũng xoá chế độ triển khai mặc định của trình phân loại văn bản cục bộ được giới thiệu trước đó trong Android 8.1. Do đó, getLocalTextClassifier() sẽ trả về một trình phân loại văn bản NO_OP. Thay vì triển khai cục bộ, bạn nên sử dụng phương thức getDefaultTextClassifierImplementation().

Đối với những nhà sản xuất thiết bị có thể muốn sử dụng thuật toán phân loại văn bản của riêng mình, họ có thể triển khai một dịch vụ phân loại văn bản tuỳ chỉnh bằng cách chỉ định config_defaultTextClassifierPackage trong tệp config.xml. Nếu bạn không chỉ định cấu hình này, hệ thống sẽ sử dụng chế độ triển khai hệ thống mặc định. Các hoạt động triển khai tuỳ chỉnh có thể nhận được một phiên bản của hoạt động triển khai mặc định bằng cách gọi TextClassifierService.getDefaultTextClassifierImplementation(Context). Để biết thêm thông tin, hãy xem bài viết Triển khai dịch vụ phân loại văn bản tuỳ chỉnh.

Thử nghiệm

Để xác thực việc triển khai dịch vụ trình phân loại văn bản, hãy sử dụng các kiểm thử trong Bộ kiểm tra tính tương thích (CTS) trong platform/cts/tests/tests/textclassifier/.

Các điểm cải tiến của công cụ phân loại văn bản trong bản phát hành Android 10

Android 10 giới thiệu 2 phương thức cho TextClassifier API: suggestConversationActions detectLanguage. Phương thức suggestConversationActions tạo ra các câu trả lời và hành động đề xuất từ một cuộc trò chuyện nhất định, còn phương thức detectLanguage phát hiện ngôn ngữ của văn bản.

Các tệp mô hình cho những phương thức này được trình bày bên dưới và có thể tìm thấy trong external/libtextclassifier/models/.

  • suggestionConversationActions: actions_suggestions.universal.model
  • detectLanguage: lang_id.model

Để phát hành một thiết bị có các tệp mô hình mới nhất trong hình ảnh gốc, hãy làm như sau:

  1. Tìm nạp các tệp mô hình mới nhất.

    external/libtextclassifier/models/update.sh
    
  2. Đổi tên các tệp đã tải xuống để thay thế các tệp hiện có.
  3. Xác minh chế độ thiết lập.
    adb shell dumpsys textclassification
    

    Đây là một mẫu kết quả đầu ra của lệnh đó.

    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 }

Các điểm cải tiến của công cụ phân loại văn bản trong bản phát hành Android 9

Android 9 đã mở rộng khung phân loại văn bản được ra mắt trong Android 8.1 bằng dịch vụ phân loại văn bản mới. Dịch vụ phân loại văn bản là cách mà các OEM nên dùng để cung cấp dịch vụ hỗ trợ hệ thống phân loại văn bản. Dịch vụ phân loại văn bản có thể là một phần của mọi APK hệ thống và có thể được cập nhật khi cần.

Android 9 có một chế độ triển khai dịch vụ phân loại văn bản mặc định ( TextClassifierImpl) được dùng trừ phi bạn thay thế bằng một chế độ triển khai dịch vụ phân loại văn bản tuỳ chỉnh.

Triển khai dịch vụ phân loại văn bản tuỳ chỉnh

Các phần sau đây mô tả cách triển khai một dịch vụ phân loại văn bản tuỳ chỉnh mà bạn phát triển.

Mở rộng 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) {
        ...
    }
    ...
}

Xác định dịch vụ trong tệp kê khai 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>

Xin lưu ý rằng dịch vụ phải yêu cầu quyền android.permission.BIND_TEXTCLASSIFIER_SERVICE và phải chỉ định thao tác ý định android.service.textclassifier.TextClassifierService.

Đặt dịch vụ phân loại văn bản mặc định của hệ thống trong lớp phủ cấu hình

[config.xml]

<string name="config_defaultTextClassifierPackage" translatable="false">com.example.textclassifierservice</string>

Tạo dịch vụ phân loại văn bản trong hình ảnh hệ thống

Dịch vụ phân loại văn bản tuỳ chỉnh của bạn có thể là một APK độc lập được tích hợp vào hình ảnh hệ thống hoặc là một phần của một APK hệ thống khác. Hệ thống sử dụng PackageManager.MATCH_SYSTEM_ONLY để phân giải dịch vụ.

Thử nghiệm

Chạy kiểm thử trong android.view.textclassifier.cts.

Các thay đổi khác về phân loại văn bản trong Android 9

Tham khảo phần Kiểm tra các mô-đun ngôn ngữ đã cài đặt.

Các tệp mô hình Android 9 không tương thích với các tệp mô hình Android 8.x.

Các tệp mô hình Android 9 có mẫu đặt tên là: texclassifier.[language-code].model (ví dụ: textclassifier.en.model) thay vì textclassifier.smartselection.en.model trong Android 8.x.

Lấy các tệp mô hình phân loại văn bản mới nhất

Để có được các mô hình mới nhất, bạn có thể chạy tập lệnh sau. Tập lệnh này sẽ cập nhật các mô hình TextClassifier trong cây nguồn:

external/libtextclassifier/native/models/update.sh

Trình phân loại văn bản Android phiên bản 8.1

Android 8.1 đã giới thiệu TextClassfier API để triển khai tính năng phân loại văn bản.

TextClassificationManager tcm =
    context.getSystemService(TextClassificationManager.class);
TextClassifier classifier = tcm.getTextClassifier();
TextSelection selection = classifier.suggestSelection(...);
TextClassification classification = classifier.classifyText(...);

Nhà phát triển có thể thiết lập một trình phân loại văn bản tuỳ chỉnh:

tcm.setTextClassifier(customTextClassifier);

Nhưng nếu nhà phát triển ứng dụng đặt trình phân loại văn bản thành null, thì trình phân loại văn bản mặc định của hệ thống sẽ được trả về cho getTextClassifier().

Hãy xem android.view.textclassifier.TextClassifierImpl.

TextView và WebView sử dụng TextClassifier cho các tính năng chọn thông minh và chia sẻ văn bản thông minh.

Cách sử dụng công cụ phân loại văn bản

Hình 1. Cách sử dụng TextClassifier

Mô hình mạng nơ-ron TextClassifier

Dự án nguồn mở Android (AOSP) có một số mô hình mạng nơ-ron để phân loại văn bản. Mỗi tệp mô hình được huấn luyện cho một ngôn ngữ duy nhất. Bạn có thể cài đặt mọi tổ hợp mô hình. Các mô hình được xác định trong:

external/libtextclassifier/Android.mk

Cài đặt sẵn các mô hình ngôn ngữ trên thiết bị

Bạn có thể chỉ định một gói mô hình ngôn ngữ và cài đặt gói đó trên thiết bị:

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

Ví dụ: trong device/google/marlin/device-common.mk.

# TextClassifier smart selection model files
PRODUCT_PACKAGES += \
    textclassifier.smartselection.bundle1

Kiểm tra các mô-đun ngôn ngữ đã cài đặt

Sử dụng ADB để liệt kê các tệp trong thư mục:

$ 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

Thông tin cập nhật về mô hình

Bạn có thể cập nhật các mô hình bằng cách đưa một mô hình mới vào bản cập nhật hình ảnh hệ thống hoặc cập nhật động bằng cách có một thành phần hệ thống kích hoạt bản cập nhật thông qua ý định API ACTION_UPDATE_SMART_SELECTION của hệ thống. Bằng cách phát ý định API hệ thống này, khung có thể cập nhật mô hình ngôn ngữ của ngôn ngữ hiện được đặt. Bản thân các mô hình này chứa ngôn ngữ được hỗ trợ và số phiên bản để sử dụng mô hình mới nhất phù hợp.

Vì vậy, bạn không cần tải trước các mô hình cho tất cả ngôn ngữ vì chúng có thể được thêm sau. Nếu không tìm thấy tệp mô hình cho ngôn ngữ đã chỉ định, thì tính năng phân loại văn bản sẽ trả về các giá trị không hoạt động.

Các kiểm thử trong Bộ kiểm thử tính tương thích

Bạn có thể tìm thấy các kiểm thử trong Bộ kiểm tra tính tương thích (CTS) với Android có liên quan tại:

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