Hướng dẫn phân loại văn bản cho Android

Nhiệm vụ của Trình phân loại văn bản MediaPipe cho phép bạn phân loại văn bản thành một nhóm danh mục xác định, chẳng hạn như cảm xúc tích cực hoặc tiêu cực. Các danh mục được xác định là mô hình mà bạn sử dụng và cách mô hình đó được huấn luyện. Các hướng dẫn này chỉ cho bạn cách sử dụng Trình phân loại văn bản trong các ứng dụng Android.

Bạn có thể xem cách hoạt động của tác vụ này bằng cách xem bản minh hoạ. Để biết thêm thông tin về các tính năng, mô hình và lựa chọn cấu hình của tác vụ này, hãy xem phần Tổng quan.

Ví dụ về mã

Mã ví dụ cho Trình phân loại văn bản cung cấp cách triển khai đơn giản của tác vụ này để bạn tham khảo. Mã này giúp bạn kiểm thử tác vụ này và bắt đầu xây dựng ứng dụng phân loại văn bản của riêng mình. Bạn có thể duyệt xem mã ví dụ về Trình phân loại văn bản trên GitHub.

Tải mã xuống

Hướng dẫn sau đây chỉ cho bạn cách tạo bản sao cục bộ của mã ví dụ bằng công cụ dòng lệnh git quản lý phiên bản.

Cách tải mã ví dụ xuống:

  1. Sao chép kho lưu trữ git bằng lệnh sau:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Bạn có thể tuỳ ý định cấu hình thực thể git để sử dụng quy trình thanh toán thưa thớt, nhờ đó bạn chỉ có các tệp cho ứng dụng mẫu của Trình phân loại văn bản:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/text_classification/android
    

Để được hướng dẫn về cách thiết lập và chạy một ví dụ bằng Android Studio, hãy xem hướng dẫn thiết lập mã mẫu trong Hướng dẫn thiết lập dành cho Android.

Thành phần chính

Các tệp sau đây chứa mã quan trọng cho ứng dụng ví dụ về phân loại văn bản:

  • TextClassifierHelper.kt – Khởi chạy thuật toán phân loại văn bản và xử lý việc lựa chọn mô hình.
  • MainActivity.kt – Triển khai ứng dụng, bao gồm cả việc gọi TextClassifierHelperResultsAdapter.
  • ResultsAdapter.kt – Xử lý và định dạng kết quả.

Thiết lập

Phần này mô tả các bước chính để thiết lập môi trường phát triển và các dự án mã dành riêng cho việc sử dụng Công cụ phân loại văn bản. Để biết thông tin chung về cách thiết lập môi trường phát triển để sử dụng MediaPipe Tasks, bao gồm cả các yêu cầu về phiên bản nền tảng, hãy xem Hướng dẫn thiết lập dành cho Android.

Phần phụ thuộc

Trình phân loại văn bản sử dụng thư viện com.google.mediapipe:tasks-text. Thêm phần phụ thuộc này vào tệp build.gradle của dự án phát triển ứng dụng Android. Bạn có thể nhập các phần phụ thuộc bắt buộc bằng đoạn mã sau:

dependencies {
    implementation 'com.google.mediapipe:tasks-text:latest.release'
}

Mẫu

Tác vụ Trình phân loại văn bản MediaPipe cần có một mô hình đã qua huấn luyện tương thích với tác vụ này. Để biết thêm thông tin về các mô hình được huấn luyện hiện có cho Công cụ phân loại văn bản, hãy xem phần Mô hình tổng quan về tác vụ.

Chọn và tải một mô hình xuống, sau đó lưu trữ mô hình đó trong thư mục assets của dự án:

<dev-project-root>/src/main/assets

Sử dụng phương thức BaseOptions.Builder.setModelAssetPath() để chỉ định đường dẫn của mô hình sẽ sử dụng. Để biết ví dụ về mã, hãy xem phần tiếp theo.

Tạo việc cần làm

Sử dụng một trong các hàm TextClassifier.createFrom...() của Trình phân loại văn bản để chuẩn bị tác vụ chạy thông tin suy luận. Bạn có thể sử dụng hàm createFromFile() với đường dẫn tương đối hoặc tuyệt đối đến tệp mô hình đã huấn luyện. Ví dụ về mã bên dưới minh hoạ cách sử dụng hàm TextClassifier.createFromOptions(). Để biết thêm thông tin về các lựa chọn cấu hình hiện có, hãy xem phần Lựa chọn cấu hình.

Mã sau đây minh hoạ cách tạo và định cấu hình tác vụ này.

// no directory path required if model file is in src/main/assets:
String currentModel = "text_classifier_model.tflite";

fun initClassifier() {
    val baseOptionsBuilder = BaseOptions.builder()
        .setModelAssetPath(currentModel)
    try {
        val baseOptions = baseOptionsBuilder.build()
        val optionsBuilder = TextClassifier.TextClassifierOptions.builder()
            .setBaseOptions(baseOptions)
        val options = optionsBuilder.build()
        textClassifier = TextClassifier.createFromOptions(context, options)
    } catch (e: IllegalStateException) { // exception handling
    }
}

Bạn có thể xem ví dụ về cách tạo tác vụ trong hàm initClassifier() của lớp TextClassifierHelper ví dụ về mã.

Các lựa chọn về cấu hình

Tác vụ này có các lựa chọn cấu hình sau đây cho ứng dụng Android:

Tên lựa chọn Nội dung mô tả Khoảng giá trị Giá trị mặc định
displayNamesLocale Đặt ngôn ngữ của nhãn để sử dụng cho tên hiển thị được cung cấp trong siêu dữ liệu của mô hình của tác vụ, nếu có. Giá trị mặc định là en đối với tiếng Anh. Bạn có thể thêm nhãn đã bản địa hoá vào siêu dữ liệu của mô hình tuỳ chỉnh bằng cách sử dụng API Trình viết siêu dữ liệu TensorFlow Lite Mã ngôn ngữ vi
maxResults Đặt số lượng kết quả phân loại được tính điểm cao nhất (không bắt buộc) để trả về. Nếu < 0, hàm sẽ trả về tất cả kết quả hiện có. Số dương bất kỳ -1
scoreThreshold Đặt ngưỡng điểm dự đoán để ghi đè ngưỡng được cung cấp trong siêu dữ liệu mô hình (nếu có). Những kết quả bên dưới giá trị này sẽ bị từ chối. Số thực bất kỳ Không đặt
categoryAllowlist Đặt danh sách các tên danh mục được phép (không bắt buộc). Nếu không để trống, kết quả phân loại có tên danh mục không có tên trong tập hợp này sẽ bị lọc ra. Tên danh mục trùng lặp hoặc không xác định sẽ bị bỏ qua. Tuỳ chọn này loại trừ lẫn nhau với categoryDenylist và việc sử dụng cả hai sẽ dẫn đến lỗi. Chuỗi bất kỳ Không đặt
categoryDenylist Đặt danh sách các tên danh mục không được phép (không bắt buộc). Nếu không để trống, kết quả phân loại có tên danh mục nằm trong tập hợp này sẽ bị lọc ra. Tên danh mục trùng lặp hoặc không xác định sẽ bị bỏ qua. Tuỳ chọn này loại trừ lẫn nhau với categoryAllowlist và việc sử dụng cả hai sẽ gây ra lỗi. Chuỗi bất kỳ Không đặt

Chuẩn bị dữ liệu

Tính năng Phân loại văn bản hoạt động với dữ liệu văn bản (String). Tác vụ này sẽ xử lý tiền xử lý đầu vào dữ liệu, bao gồm cả việc mã hoá và tiền xử lý tensor.

Mọi quá trình xử lý trước đều được xử lý trong hàm classify(). Bạn không cần phải xử lý thêm văn bản nhập trước.

String inputText = "The input text to be classified.";

Chạy tác vụ

Trình phân loại văn bản dùng hàm TextClassifier.classify() để chạy dự đoán. Sử dụng một luồng thực thi riêng để thực thi việc phân loại nhằm tránh chặn luồng giao diện người dùng Android với ứng dụng của bạn.

Mã sau đây minh hoạ cách thực thi quá trình xử lý với mô hình tác vụ bằng cách sử dụng một luồng thực thi riêng biệt.

    fun classify(text: String) {
        executor = ScheduledThreadPoolExecutor(1)

        executor.execute {
            val results = textClassifier.classify(text)
            listener.onResult(results)
        }
    }

Bạn có thể xem ví dụ về cách chạy một tác vụ trong hàm classify() của lớp TextClassifierHelper ví dụ về mã.

Xử lý và hiển thị kết quả

Trình phân loại văn bản sẽ xuất ra một TextClassifierResult chứa danh sách các danh mục có thể có đối với văn bản đầu vào. Các danh mục được xác định theo mô hình mà bạn sử dụng. Vì vậy, nếu bạn muốn có nhiều danh mục, hãy chọn một mô hình khác hoặc đào tạo lại mô hình hiện có.

Sau đây là ví dụ về dữ liệu đầu ra của nhiệm vụ này:

TextClassificationResult:
  Classification #0 (single classification head):
    ClassificationEntry #0:
      Category #0:
        category name: "positive"
        score: 0.8904
        index: 0
      Category #1:
        category name: "negative"
        score: 0.1096
        index: 1

Kết quả này đã thu được bằng cách chạy trình phân loại BERT trên văn bản nhập: "an imperfect but overall entertaining mystery".

Bạn có thể xem ví dụ về cách hiển thị kết quả trong lớp ví dụ về mã ResultsAdapter và lớp bên trong ViewHolder.