适用于 iOS 的文本分类指南

借助文本分类器任务,您可以将文本划分为一组定义的类别,例如正面或负面的情感。类别取决于您使用的模型以及模型的训练方式。以下说明介绍了如何在 iOS 应用中使用文本分类器。GitHub 上提供了这些说明中介绍的代码示例。

您可以观看此 Web 演示,了解此任务的实际效果。如需详细了解此任务的功能、模型和配置选项,请参阅概览

代码示例

MediaPipe Tasks 示例代码是适用于 iOS 的文本分类器应用的基本实现。

您可以使用该应用作为基础来开发自己的 iOS 应用,也可以在修改现有应用时参考该应用。您可以参考 GitHub 上的文本分类器示例代码。

下载代码

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

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

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

创建示例代码的本地版本后,您可以安装 MediaPipe 任务库,使用 Xcode 打开项目并运行该应用。有关说明,请参阅 iOS 设置指南

关键组件

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

初始设置

本部分介绍了设置开发环境和代码项目以使用文本分类器的关键步骤。如需了解有关为使用 MediaPipe 任务设置开发环境的一般信息(包括平台版本要求),请参阅 iOS 设置指南

依赖项

文本分类器使用 MediaPipeTasksText 库,必须使用 CocoaPods 进行安装。该库与 Swift 和 Objective-C 应用兼容,不需要任何其他针对特定语言的设置。

如需了解如何在 macOS 上安装 CocoaPods,请参阅 CocoaPods 安装指南。 如需了解如何创建包含应用必要 Pod 的 Podfile,请参阅使用 CocoaPods

使用以下代码在 Podfile 中添加 MediaPipeTasksText pod:

target 'MyTextClassifierApp' do
  use_frameworks!
  pod 'MediaPipeTasksText'
end

如果您的应用包含单元测试目标,请参阅 iOS 设置指南,详细了解如何设置 Podfile

模型

MediaPipe 文本分类器任务需要使用与此任务兼容的经过训练的模型。如需详细了解文本分类器可用的经过训练的模型,请参阅任务概览“模型”部分

选择并下载模型,然后使用 Xcode 将模型添加到您的项目目录中。如需了解如何将文件添加到 Xcode 项目,请参阅管理 Xcode 项目中的文件和文件夹

使用 BaseOptions.modelAssetPath 属性指定 app bundle 中模型的路径。如需查看代码示例,请参阅下一部分。

创建任务

您可以通过调用文本分类器任务的一个初始化程序来创建该任务。TextClassifier(options:) 初始化程序用于设置配置选项的值。

如果您不需要使用自定义配置选项初始化的文本分类器,可以使用 TextClassifier(modelPath:) 初始化程序使用默认选项创建文本分类器。如需详细了解配置选项,请参阅配置概览

以下代码演示了如何构建和配置此任务。

Swift

import MediaPipeTasksText

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "tflite")

let options = TextClassifierOptions()
options.baseOptions.modelAssetPath = modelPath
options.scoreThreshold = 0.6

let textClassifier = try TextClassifier(options: options)

Objective-C

@import MediaPipeTasksText;

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model"
                                                      ofType:@"tflite"];

MPPTextClassifierOptions *options = [[MPPTextClassifierOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.scoreThreshold = 0.6;

MPPTextClassifier *textClassifier =
      [[MPPTextClassifier alloc] initWithOptions:options error:nil];

配置选项

此任务针对 iOS 应用提供以下配置选项:

选项名称 说明 值范围 默认值
displayNamesLocale 设置任务模型元数据中提供的显示名(如果有)要使用的标签语言。英语的默认值为 en。您可以使用 TensorFlow Lite Metadata Writer API 向自定义模型的元数据添加本地化标签。语言区域代码 en
maxResults 设置要返回的得分最高的分类结果的数量上限(可选)。如果小于 0,将返回所有可用的结果。 任何正数 -1
scoreThreshold 设置预测分数阈值,以替换模型元数据中提供的阈值(如果有)。低于此值的结果会被拒绝。 任意浮点数 未设置
categoryAllowlist 设置允许的类别名称的可选列表。如果为非空,则类别名称不在此集合中的分类结果将被滤除。系统会忽略重复或未知的类别名称。 此选项与 categoryDenylist 互斥,如果同时使用这两者,就会引发错误。 任何字符串 未设置
categoryDenylist 设置不允许使用的类别名称的可选列表。如果非空,则类别名称在此集合中的分类结果将被滤除。系统会忽略重复或未知的类别名称。此选项与 categoryAllowlist 互斥,同时使用这两者会导致错误。 任何字符串 未设置

准备数据

文本分类器可处理文本数据。该任务会处理数据输入预处理,包括标记化和张量预处理。

所有预处理都在 classify(text:) 函数中处理。无需事先对输入文本进行额外的预处理。

Swift

let text = "The input text to be classified."

Objective-C

NSString *text = @"The input text to be classified.";

运行任务

如需运行文本分类器,请使用 classify(text:) 方法。文本分类器会返回输入文本的可能类别。

Swift

let result = try textClassifier.classify(text: text)

Objective-C

MPPTextClassifierResult *result = [textClassifier classifyText:text
                                                          error:nil];

注意:任务会阻塞当前线程,直到其完成对文本的推断。为避免阻塞当前线程,请使用 iOS DispatchNSOperation 框架在后台线程中执行处理。

处理和显示结果

运行推理后,文本分类器任务会返回一个 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"

示例代码中的 ViewController.swift 文件演示了如何显示任务返回的检测结果。