Phân loại văn bản với Android

Hướng dẫn này chỉ cho bạn cách xây dựng một ứng dụng Android bằng TensorFlow Lite để phân loại văn bản ngôn ngữ tự nhiên. Ứng dụng này được thiết kế cho thiết bị Android vật lý nhưng cũng có thể chạy trên trình mô phỏng thiết bị.

Ứng dụng ví dụ sử dụng TensorFlow Lite để phân loại văn bản thành tích cực hoặc tiêu cực, sử dụng thư viện Tác vụ cho ngôn ngữ tự nhiên (NL) để cho phép thực thi các mô hình học máy phân loại văn bản.

Nếu bạn đang cập nhật một dự án hiện có, bạn có thể sử dụng ứng dụng mẫu làm tài liệu tham khảo hoặc mẫu. Để biết hướng dẫn về cách thêm phân loại văn bản vào ứng dụng hiện có, hãy tham khảo Cập nhật và sửa đổi ứng dụng của bạn .

Tổng quan về phân loại văn bản

Phân loại văn bản là nhiệm vụ học máy nhằm gán một tập hợp các danh mục được xác định trước cho văn bản mở. Mô hình phân loại văn bản được đào tạo trên kho văn bản ngôn ngữ tự nhiên, trong đó các từ hoặc cụm từ được phân loại thủ công.

Mô hình được đào tạo nhận văn bản làm đầu vào và cố gắng phân loại văn bản theo tập hợp các lớp đã biết mà nó được đào tạo để phân loại. Ví dụ: các mô hình trong ví dụ này chấp nhận một đoạn văn bản và xác định xem cảm xúc của văn bản là tích cực hay tiêu cực. Đối với mỗi đoạn văn bản, mô hình phân loại văn bản đưa ra một điểm cho biết độ tin cậy của việc văn bản được phân loại chính xác là tích cực hay tiêu cực.

Để biết thêm thông tin về cách tạo mô hình trong hướng dẫn này, hãy tham khảo hướng dẫn Phân loại văn bản bằng TensorFlow Lite Model Maker .

Mô hình và tập dữ liệu

Hướng dẫn này sử dụng các mô hình đã được đào tạo bằng bộ dữ liệu SST-2 (Stanford Sentiment Treebank). SST-2 chứa 67.349 bài đánh giá phim dành cho đào tạo và 872 bài đánh giá phim để thử nghiệm, trong đó mỗi bài đánh giá được phân loại là tích cực hoặc tiêu cực. Các mô hình được sử dụng trong ứng dụng này đã được đào tạo bằng công cụ TensorFlow Lite Model Maker .

Ứng dụng ví dụ sử dụng các mô hình được đào tạo trước sau:

  • Vectơ từ trung bình ( NLClassifier ) - NLClassifier của Thư viện tác vụ phân loại văn bản đầu vào thành các danh mục khác nhau và có thể xử lý hầu hết các mô hình phân loại văn bản.

  • MobileBERT ( BertNLClassifier ) - BertNLClassifier của Thư viện tác vụ tương tự như NLClassifier nhưng được điều chỉnh cho các trường hợp yêu cầu mã thông báo Từ ngữ và Câu văn ngoài biểu đồ.

Thiết lập và chạy ứng dụng mẫu

Để thiết lập ứng dụng phân loại văn bản, hãy tải xuống ứng dụng mẫu từ GitHub và chạy ứng dụng đó bằng Android Studio .

Yêu cầu hệ thống

  • Android Studio phiên bản 2021.1.1 (Bumblebee) trở lên.
  • SDK Android phiên bản 31 trở lên
  • Thiết bị Android có phiên bản hệ điều hành tối thiểu là SDK 21 (Android 7.0 - Nougat) đã bật chế độ nhà phát triển hoặc Trình mô phỏng Android.

Lấy mã ví dụ

Tạo một bản sao cục bộ của mã ví dụ. Bạn sẽ sử dụng mã này để tạo một dự án trong Android Studio và chạy ứng dụng mẫu.

Để sao chép và thiết lập mã ví dụ:

  1. Sao chép kho git
    git clone https://github.com/tensorflow/examples.git
    
  2. Bạn có thể tùy ý định cấu hình phiên bản git của mình để sử dụng tính năng kiểm tra thưa thớt, để bạn chỉ có các tệp cho ứng dụng ví dụ phân loại văn bản:
    cd examples
    git sparse-checkout init --cone
    git sparse-checkout set lite/examples/text_classification/android
    

Nhập và chạy dự án

Tạo một dự án từ mã ví dụ đã tải xuống, xây dựng dự án rồi chạy nó.

Để nhập và xây dựng dự án mã ví dụ:

  1. Khởi động Android Studio .
  2. Từ Android Studio, chọn Tệp > Mới > Nhập dự án .
  3. Điều hướng đến thư mục mã ví dụ chứa tệp build.gradle ( .../examples/lite/examples/text_classification/android/build.gradle ) và chọn thư mục đó.
  4. Nếu Android Studio yêu cầu Đồng bộ hóa Gradle, hãy chọn OK.
  5. Đảm bảo rằng thiết bị Android của bạn được kết nối với máy tính và chế độ nhà phát triển được bật. Nhấp vào mũi Run màu xanh lá cây.

Nếu bạn chọn đúng thư mục, Android Studio sẽ tạo một dự án mới và xây dựng nó. Quá trình này có thể mất vài phút, tùy thuộc vào tốc độ máy tính của bạn và liệu bạn có sử dụng Android Studio cho các dự án khác hay không. Khi quá trình xây dựng hoàn tất, Android Studio sẽ hiển thị thông báo BUILD SUCCESSFUL trong bảng trạng thái Build Output .

Để chạy dự án:

  1. Từ Android Studio, chạy dự án bằng cách chọn Run > Run… .
  2. Chọn một thiết bị Android (hoặc trình mô phỏng) được đính kèm để kiểm tra ứng dụng.

Sử dụng ứng dụng

Ứng dụng ví dụ phân loại văn bản trong Android

Sau khi chạy dự án trong Android Studio, ứng dụng sẽ tự động mở trên thiết bị được kết nối hoặc trình mô phỏng thiết bị.

Để sử dụng trình phân loại văn bản:

  1. Nhập một đoạn văn bản vào hộp văn bản.
  2. Từ trình đơn thả xuống Đại biểu , chọn CPU hoặc NNAPI .
  3. Chỉ định mô hình bằng cách chọn AverageWordVec hoặc MobileBERT .
  4. Chọn Phân loại .

Ứng dụng đưa ra điểm dương và điểm âm . Hai điểm này sẽ có tổng bằng 1 và đo lường khả năng cảm xúc của văn bản đầu vào là tích cực hay tiêu cực. Con số cao hơn biểu thị mức độ tin cậy cao hơn.

Bây giờ bạn đã có một ứng dụng phân loại văn bản đang hoạt động. Sử dụng các phần sau để hiểu rõ hơn cách hoạt động của ứng dụng mẫu và cách triển khai các tính năng phân loại văn bản cho ứng dụng sản xuất của bạn:

Cách ứng dụng ví dụ hoạt động

Ứng dụng sử dụng gói thư viện tác vụ cho ngôn ngữ tự nhiên (NL) để triển khai các mô hình phân loại văn bản. Hai mô hình, Average Word Vector và MobileBERT, đã được đào tạo bằng TensorFlow Lite Model Maker . Ứng dụng chạy trên CPU theo mặc định, với tùy chọn tăng tốc phần cứng bằng cách sử dụng đại biểu NNAPI.

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

  • TextClassificationHelper.kt - Khởi tạo trình phân loại văn bản và xử lý lựa chọn mô hình và đại biểu.
  • MainActivity.kt - Triển khai ứng dụng, bao gồm cả việc gọi TextClassificationHelperResultsAdapter .
  • ResultsAdapter.kt - Xử lý và định dạng kết quả.

Sửa đổi ứng dụng của bạn

Các phần sau đây giải thích các bước chính để sửa đổi ứng dụng Android của riêng bạn nhằm chạy mô hình được hiển thị trong ứng dụng ví dụ. Những hướng dẫn này sử dụng ứng dụng mẫu làm điểm tham chiếu. Những thay đổi cụ thể cần thiết cho ứng dụng của riêng bạn có thể khác với ứng dụng mẫu.

Mở hoặc tạo dự án Android

Bạn cần có một dự án phát triển Android trong Android Studio để làm theo những hướng dẫn còn lại. Thực hiện theo các hướng dẫn bên dưới để mở một dự án hiện có hoặc tạo một dự án mới.

Để mở một dự án phát triển Android hiện có:

  • Trong Android Studio, chọn Tệp > Mở và chọn dự án hiện có.

Để tạo một dự án phát triển Android cơ bản:

Để biết thêm thông tin về cách sử dụng Android Studio, hãy tham khảo tài liệu về Android Studio .

Thêm phụ thuộc dự án

Trong ứng dụng của riêng mình, bạn phải thêm các phần phụ thuộc dự án cụ thể để chạy các mô hình máy học TensorFlow Lite và truy cập các chức năng tiện ích giúp chuyển đổi dữ liệu như chuỗi thành định dạng dữ liệu tensor mà mô hình bạn đang sử dụng có thể xử lý.

Hướng dẫn sau đây giải thích cách thêm các phần phụ thuộc mô-đun và dự án cần thiết vào dự án ứng dụng Android của riêng bạn.

Để thêm phụ thuộc mô-đun:

  1. Trong mô-đun sử dụng TensorFlow Lite, hãy cập nhật tệp build.gradle của mô-đun để bao gồm các phần phụ thuộc sau.

    Trong ứng dụng ví dụ, các phần phụ thuộc được đặt trong app/build.gradle :

    dependencies {
      ...
      implementation 'org.tensorflow:tensorflow-lite-task-text:0.4.0'
    }
    

    Dự án phải bao gồm thư viện tác vụ Text ( tensorflow-lite-task-text ).

    Nếu bạn muốn sửa đổi ứng dụng này để chạy trên bộ xử lý đồ họa (GPU), thư viện GPU ( tensorflow-lite-gpu-delegate-plugin ) cung cấp cơ sở hạ tầng để chạy ứng dụng trên GPU và Delegate ( tensorflow-lite-gpu ) cung cấp danh sách tương thích. Chạy ứng dụng này trên GPU nằm ngoài phạm vi của hướng dẫn này.

  2. Trong Android Studio, đồng bộ hóa các phần phụ thuộc của dự án bằng cách chọn: File > Sync Project with Gradle Files .

Khởi tạo các mô hình ML

Trong ứng dụng Android, bạn phải khởi tạo mô hình học máy TensorFlow Lite với các tham số trước khi chạy dự đoán bằng mô hình.

Mô hình TensorFlow Lite được lưu trữ dưới dạng tệp *.tflite . Tệp mô hình chứa logic dự đoán và thường bao gồm siêu dữ liệu về cách diễn giải kết quả dự đoán, chẳng hạn như tên lớp dự đoán. Thông thường, các tệp mô hình được lưu trữ trong thư mục src/main/assets của dự án phát triển của bạn, như trong ví dụ về mã:

  • <project>/src/main/assets/mobilebert.tflite
  • <project>/src/main/assets/wordvec.tflite

Để thuận tiện và dễ đọc mã, ví dụ khai báo một đối tượng đồng hành xác định cài đặt cho mô hình.

Để khởi tạo mô hình trong ứng dụng của bạn:

  1. Tạo một đối tượng đồng hành để xác định cài đặt cho mô hình. Trong ứng dụng ví dụ, đối tượng này nằm trong TextClassificationHelper.kt :

    companion object {
      const val DELEGATE_CPU = 0
      const val DELEGATE_NNAPI = 1
      const val WORD_VEC = "wordvec.tflite"
      const val MOBILEBERT = "mobilebert.tflite"
    }
    
  2. Tạo cài đặt cho mô hình bằng cách xây dựng đối tượng phân loại và xây dựng đối tượng TensorFlow Lite bằng cách sử dụng BertNLClassifier hoặc NLClassifier .

    Trong ứng dụng ví dụ, điều này nằm trong hàm initClassifier trong TextClassificationHelper.kt :

    fun initClassifier() {
      ...
      if( currentModel == MOBILEBERT ) {
        ...
        bertClassifier = BertNLClassifier.createFromFileAndOptions(
          context,
          MOBILEBERT,
          options)
      } else if (currentModel == WORD_VEC) {
          ...
          nlClassifier = NLClassifier.createFromFileAndOptions(
            context,
            WORD_VEC,
            options)
      }
    }
    

Kích hoạt tính năng tăng tốc phần cứng (tùy chọn)

Khi khởi tạo mô hình TensorFlow Lite trong ứng dụng của mình, bạn nên cân nhắc sử dụng các tính năng tăng tốc phần cứng để tăng tốc độ tính toán dự đoán của mô hình. Các đại biểu TensorFlow Lite là các mô-đun phần mềm giúp tăng tốc việc thực thi các mô hình học máy bằng cách sử dụng phần cứng xử lý chuyên dụng trên thiết bị di động, chẳng hạn như bộ xử lý đồ họa (GPU) hoặc bộ xử lý tensor (TPU).

Để bật tính năng tăng tốc phần cứng trong ứng dụng của bạn:

  1. Tạo một biến để xác định đại biểu mà ứng dụng sẽ sử dụng. Trong ứng dụng ví dụ, biến này nằm sớm trong TextClassificationHelper.kt :

    var currentDelegate: Int = 0
    
  2. Tạo bộ chọn đại biểu. Trong ứng dụng ví dụ, bộ chọn đại biểu được đặt trong hàm initClassifier trong TextClassificationHelper.kt :

    val baseOptionsBuilder = BaseOptions.builder()
    when (currentDelegate) {
       DELEGATE_CPU -> {
           // Default
       }
       DELEGATE_NNAPI -> {
           baseOptionsBuilder.useNnapi()
       }
    }
    

Nên sử dụng đại biểu để chạy các mô hình TensorFlow Lite nhưng không bắt buộc. Để biết thêm thông tin về cách sử dụng đại biểu với TensorFlow Lite, hãy xem Đại biểu TensorFlow Lite .

Chuẩn bị dữ liệu cho mô hình

Trong ứng dụng Android, mã của bạn cung cấp dữ liệu cho mô hình để diễn giải bằng cách chuyển đổi dữ liệu hiện có như văn bản thô thành định dạng dữ liệu Tensor mà mô hình của bạn có thể xử lý. Dữ liệu trong Tensor mà bạn truyền vào mô hình phải có kích thước hoặc hình dạng cụ thể phù hợp với định dạng dữ liệu được sử dụng để huấn luyện mô hình.

Ứng dụng phân loại văn bản này chấp nhận một chuỗi làm đầu vào và các mô hình được đào tạo riêng trên kho ngữ liệu tiếng Anh. Các ký tự đặc biệt và các từ không phải tiếng Anh sẽ bị bỏ qua trong quá trình suy luận.

Để cung cấp dữ liệu văn bản cho mô hình:

  1. Đảm bảo rằng hàm initClassifier chứa mã cho đại biểu và mô hình, như được giải thích trong phần Khởi tạo mô hình MLBật tăng tốc phần cứng .

  2. Sử dụng khối init để gọi hàm initClassifier . Trong ứng dụng ví dụ, init nằm trong TextClassificationHelper.kt :

    init {
      initClassifier()
    }
    

Chạy dự đoán

Trong ứng dụng Android, sau khi khởi tạo đối tượng BertNLClassifier hoặc NLClassifier , bạn có thể bắt đầu cung cấp văn bản đầu vào để mô hình phân loại thành "tích cực" hoặc "tiêu cực".

Để chạy dự đoán:

  1. Tạo hàm classify , sử dụng bộ phân loại đã chọn ( currentModel ) và đo thời gian thực hiện để phân loại văn bản đầu vào ( inferenceTime ). Trong ứng dụng ví dụ, hàm classify nằm trong TextClassificationHelper.kt :

    fun classify(text: String) {
      executor = ScheduledThreadPoolExecutor(1)
    
      executor.execute {
        val results: List<Category>
        // inferenceTime is the amount of time, in milliseconds, that it takes to
        // classify the input text.
        var inferenceTime = SystemClock.uptimeMillis()
    
        // Use the appropriate classifier based on the selected model
        if(currentModel == MOBILEBERT) {
          results = bertClassifier.classify(text)
        } else {
          results = nlClassifier.classify(text)
        }
    
        inferenceTime = SystemClock.uptimeMillis() - inferenceTime
    
        listener.onResult(results, inferenceTime)
      }
    }
    
  2. Chuyển kết quả từ classify đến đối tượng người nghe.

    fun classify(text: String) {
      ...
      listener.onResult(results, inferenceTime)
    }
    

Xử lý đầu ra mô hình

Sau khi bạn nhập một dòng văn bản, mô hình sẽ tạo ra điểm dự đoán, được biểu thị dưới dạng Số nổi, trong khoảng từ 0 đến 1 cho danh mục 'tích cực' và 'tiêu cực'.

Để có được kết quả dự đoán từ mô hình:

  1. Tạo hàm onResult cho đối tượng người nghe để xử lý đầu ra. Trong ứng dụng ví dụ, đối tượng người nghe nằm trong MainActivity.kt

    private val listener = object : TextClassificationHelper.TextResultsListener {
      override fun onResult(results: List<Category>, inferenceTime: Long) {
        runOnUiThread {
          activityMainBinding.bottomSheetLayout.inferenceTimeVal.text =
            String.format("%d ms", inferenceTime)
    
          adapter.resultsList = results.sortedByDescending {
            it.score
          }
    
          adapter.notifyDataSetChanged()
        }
      }
      ...
    }
    
  2. Thêm hàm onError vào đối tượng Listener để xử lý lỗi:

      private val listener = object : TextClassificationHelper.TextResultsListener {
        ...
        override fun onError(error: String) {
          Toast.makeText(this@MainActivity, error, Toast.LENGTH_SHORT).show()
        }
      }
    

Sau khi mô hình trả về một tập hợp kết quả dự đoán, ứng dụng của bạn có thể hành động theo những dự đoán đó bằng cách hiển thị kết quả cho người dùng hoặc thực thi logic bổ sung. Ứng dụng ví dụ liệt kê điểm dự đoán trong giao diện người dùng.

Bước tiếp theo