Android 文字分類指南

MediaPipe 文字分類器工作可讓您將文字歸類到一組已定義的類別,例如正面或負面情緒。類別會決定您使用的模型 以及該模型的訓練方式以下操作說明將說明如何搭配使用文字分類器與 Android 應用程式。

如要查看這項工作的運作情形,請查看示範。如要進一步瞭解這項工作的功能、模型和設定選項,請參閱總覽

程式碼範例

文字分類器的範例程式碼提供這項工作的簡易實作方式。這段程式碼可協助您測試這項工作,並開始建構您自己的文字分類應用程式。您可以瀏覽 GitHub 上的文字分類器範例程式碼

下載程式碼

以下說明如何使用 git 版本控制指令列工具建立範例程式碼的本機副本。

如要下載範例程式碼,請按照下列步驟操作:

  1. 使用下列指令複製 Git 存放區:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. 您可以選擇將 Git 執行個體設為使用稀疏檢查,因此只有 Text Classifier 範例應用程式的檔案:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/text_classification/android
    

想瞭解如何使用 Android Studio 設定及執行範例,請參閱 Android 設定指南中的範例程式碼設定操作說明。

重要元件

下列檔案包含文字分類範例應用程式的重要程式碼:

設定

本節說明設定開發環境的重要步驟,以及專門用於使用文字分類器的程式碼專案。如需瞭解如何使用 MediaPipe 工作設定開發環境的一般資訊,包括平台版本需求,請參閱「Android 設定指南」。

依附元件

文字分類器使用 com.google.mediapipe:tasks-text 程式庫。將此依附元件新增至 Android 應用程式開發專案的 build.gradle 檔案。您可以使用下列程式碼匯入必要的依附元件:

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

型號

MediaPipe 文字分類器工作需要使用與這項工作相容的已訓練模型。如要進一步瞭解文字分類器的可用已訓練模型,請參閱工作總覽「模型」一節

選取並下載模型,然後儲存在專案的 assets 目錄中:

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

使用 BaseOptions.Builder.setModelAssetPath() 方法指定要使用的模型路徑。如需程式碼範例,請參閱下一節。

建立工作

使用其中一個文字分類器 TextClassifier.createFrom...() 函式,為執行推論的準備工作。您可以使用 createFromFile() 函式,搭配已訓練模型檔案的相對或絕對路徑。以下程式碼範例示範如何使用 TextClassifier.createFromOptions() 函式。如要進一步瞭解可用的設定選項,請參閱設定選項一文。

下列程式碼示範如何建構及設定這項工作。

// 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
    }
}

您可以在 TextClassifierHelper 類別 initClassifier() 函式的程式碼範例中查看如何建立工作的範例。

設定選項

這項工作的 Android 應用程式設定選項如下:

選項名稱 說明 值範圍 預設值
displayNamesLocale 設定標籤語言,用於工作模型中繼資料內的顯示名稱 (如有)。英文的預設值是 en。您可以使用 TensorFlow Lite Metadata Writer API,在自訂模型的中繼資料中加入本地化標籤。語言代碼 en
maxResults 設定要傳回的最高評分分類結果數量上限 (選用)。如果小於 0,系統會傳回所有可用的結果。 任何正數 -1
scoreThreshold 設定預測分數門檻,覆寫模型中繼資料 (如有) 中提供的分數門檻。這個值下方的結果遭到拒絕。 不限浮點值 未設定
categoryAllowlist 設定允許的類別名稱 (選用)。如果不是空白,系統會篩除類別名稱不在這個組合中的分類結果。系統會忽略重複或不明的類別名稱。這個選項與 categoryDenylist 互斥,且同時使用兩者會導致錯誤。 任何字串 未設定
categoryDenylist 設定不允許使用的類別名稱清單。如果不是空白,系統會篩除類別名稱在此集合中的分類結果。系統會忽略重複或不明的類別名稱。這個選項與 categoryAllowlist 互斥,且同時使用兩者會導致錯誤。 任何字串 未設定

準備資料

文字分類器適用於文字 (String) 資料。這項工作會處理資料輸入預先處理作業,包括代碼化和張量預先處理。

所有預先處理作業都會在 classify() 函式中處理。不需要事先對輸入文字進行額外的預先處理。

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

執行工作

文字分類器會使用 TextClassifier.classify() 函式執行推論。使用單獨的執行執行緒執行分類,避免讓 Android 使用者介面執行緒與應用程式封鎖。

下列程式碼示範如何使用單獨的執行緒,搭配工作模型執行處理。

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

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

您可以在 TextClassifierHelper 類別 classify() 函式的程式碼範例中查看如何執行工作的範例。

處理並顯示結果

文字分類器會輸出 TextClassifierResult,其中包含輸入文字的可能類別清單。類別是由您使用的模型定義,因此如果您想使用不同的類別,請挑選其他模型,或重新訓練現有模型。

以下為這項工作的輸出資料範例:

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

對輸入文字執行 BERT-classifier 已取得這項結果:"an imperfect but overall entertaining mystery"

您可以查看以下程式碼範例,瞭解如何在程式碼範例 ResultsAdapter 類別和 ViewHolder 內部類別中顯示結果。