适用于 iOS 的文本分类指南

借助文本分类器任务,您可以将文本分类为一组定义的类别, 例如正面或负面情绪。类别是根据 您使用的模型以及该模型的训练方式。以下说明会向您展示 如何在 iOS 应用中使用文本分类器。以上介绍的代码示例 有关说明,请访问 GitHub

您可以查看此网页 演示。对于 功能、模型和配置选项 请参阅 概览

代码示例

MediaPipe Tasks 示例代码是文本分类器的基本实现 。

您可以以此为基础来创建自己的 iOS 应用,也可以作为参考 对现有应用进行了修改。您可以参考文本分类器示例代码 已开启 GitHub

下载代码

以下说明介绍了如何创建示例的本地副本 使用 git 命令行工具运行 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/ios/
    

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

关键组件

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

设置

本部分介绍了设置开发环境和 以便使用文本分类器。有关如何设置 用于使用 MediaPipe 任务(包括平台版本)的开发环境 要求,请参阅 iOS 设置指南

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

依赖项

文本分类器使用 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 文本分类器任务需要一个经过训练的模型, 此任务。如需详细了解适用于 Kubernetes 的 文本分类器,请参阅任务概览模型 部分

选择并下载模型,然后使用 Xcode 将其添加到您的项目目录。 有关如何向 Xcode 项目添加文件的说明,请参阅管理 Xcode 中的文件和文件夹 项目

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

创建任务

您可以通过调用文本分类器任务之一来创建该任务。通过 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 将评分最高的分类结果的可选数量上限设置为 return。如果 <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-loader 来获得此结果: "an imperfect but overall entertaining mystery"

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