适用于 Android 的文本分类指南

借助 MediaPipe Text Classifier 任务,你可以将文本分类为一组定义的类别, 例如正面或负面情绪。这些类别决定了 以及该模型的训练方式。这些说明将介绍如何使用 将文本分类器与 Android 应用结合使用。

要了解此任务的实际运行情况,请查看 演示。 如需详细了解其功能、模型和 配置选项,请参阅概览

代码示例

文本分类器的示例代码提供了此分类的简单实现, 供您参考。此代码可帮助您测试此任务并 构建自己的文本分类应用。您可以浏览 文本分类器示例代码

下载代码

以下说明介绍了如何创建示例的本地副本 使用 git 版本控制命令行工具构建代码库。

<ph type="x-smartling-placeholder">

如需下载示例代码,请执行以下操作:

  1. 使用以下命令克隆 git 代码库:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. (可选)将您的 Git 实例配置为使用稀疏检出, 因此您只有文本分类器示例应用的文件:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/text_classification/android
    

如需了解如何使用 Android Studio 设置和运行示例, 请参阅 Android 版设置指南

关键组件

以下文件包含文本分类的关键代码, 示例应用:

设置

本部分介绍了设置开发环境和 专门用于文本分类器的代码项目。有关 设置开发环境以使用 MediaPipe Tasks,包括 平台版本要求,请参阅 Android 版设置指南

<ph type="x-smartling-placeholder">

依赖项

文本分类器使用 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
    }
}

您可以在代码示例中查看如何创建任务的示例 TextClassifierHelperinitClassifier() 函数。

配置选项

此任务具有以下适用于 Android 应用的配置选项:

选项名称 说明 值范围 默认值
displayNamesLocale 设置要用于 任务模型的元数据(如果有)。默认值为 en, 英语。您可以向自定义模型的元数据中添加本地化标签 使用 TensorFlow Lite Metadata Writer API 语言区域代码 en
maxResults 将评分最高的分类结果的可选数量上限设置为 return。如果 <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)
        }
    }

您可以在代码示例中查看如何运行任务的示例 TextClassifierHelperclassify() 函数。

处理和显示结果

文本分类器输出包含列表的 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-loader 来获得此结果: "an imperfect but overall entertaining mystery"

如需查看有关如何显示结果的示例,请参阅代码示例 ResultsAdapter 类和 ViewHolder 内部类。