了解如何生成文本分类项目

已完成

自定义文本分类项目是用于生成、训练、改进和部署分类模型的工作区。 可以通过两种方式处理项目:通过语言工作室和通过 REST API。 语言工作室是将在实验室中使用的 GUI,但 REST API 具有相同的功能。 无论喜欢哪种方法,开发模型的步骤都是相同的。

Azure AI 语言项目生命周期

Diagram that shows a life cycle with steps to define labels, tag data, train model, view model, improve model, deploy model, and classify text.

  • 定义标签:了解要分类的数据,确定要分类到的可能的标签。 在我们的电子游戏示例中,标签为“动作”、“冒险”、“策略”等。
  • 标记数据:标记现有数据,并指定每个文件的标签。 标记数据非常重要,因为这是模型学习如何对将来文件进行分类的方式。 最佳做法是使标签之间具有明显的差异,以避免歧义,并提供每个标签的良好示例以供模型学习。 例如,我们会将“Quest for the Mine Brush”标记为“冒险”,将“Flight Trainer”标记为“动作”。
  • 训练模型:使用标记的数据训练模型。 训练将教会模型应将各类型的电子游戏的摘要标记为哪种流派。
  • 查看模型:模型训练完成后,查看模型的结果。 根据测试数据的精准率和召回率,在 0 到 1 之间对你的模型评分。 记下哪种流派的游戏表现不佳。
  • 改进模型:通过查看哪些分类未能评估到正确的标签来改进模型,查看标签分布,并找出要添加哪些数据,从而提高性能。 例如,你可能会发现模型混合了“冒险”和“策略”游戏。 尝试找到每个标签的更多示例,将其添加到数据集,以重新训练模型。
  • 部署模型:模型可以按预期运行后,部署模型,使其可通过 API 提供。 模型可能被命名为“GameGenres”,部署后可用于对游戏摘要进行分类。
  • 对文本进行分类:使用模型对文本进行分类。 实验室介绍如何使用 API,并且你可以查看 API 参考

如何拆分数据集用于训练

标记数据时,可以指定希望每个文件所属的数据集:

  • 训练 - 训练数据集用于实际训练模型;提供的数据和标签被输入到机器学习算法中,以教会模型将哪些数据分类到哪个标签。 训练数据集将是这两个数据集中较大的数据集,建议为大约 80% 的标记数据。
  • 测试 - 测试数据集是标记数据,用于在完成训练后验证模型。 Azure 将获取测试数据集中的数据,将其提交给模型,并将输出与标记数据的方式进行比较,以确定模型的执行情况。 通过此比较可得出对模型的评分方式,并帮助你了解如何提高预测性能。

在“训练模型”步骤中,对于如何训练模型,有两个选项

  • 自动拆分 - Azure 获取所有数据,随机将其拆分为指定的百分比,并将其应用于模型训练。 如果数据集较大,数据自然更一致,或者数据分布广泛涵盖类,则此选项是最佳选择。
  • 手动拆分 - 手动指定每个数据集中应包含的文件。 提交训练作业时,Azure AI 语言服务会告诉你数据集的拆分和分布。 此拆分最适合用于较小的数据集,可以确保提供类的正确分布和数据变化,从而正确训练模型。

若要使用自动拆分,请在标记数据时将所有文件放入训练数据集中(此选项为默认选项)。 若要使用手动拆分,请在数据标记期间指定哪些文件应位于测试数据集与训练数据集中。

部署选项

通过 Azure AI 语言,每个项目都可创建多个模型和多个部署,并且每一个都有自己唯一的名称。 优点包括可以执行以下操作:

  • 并排测试两个模型
  • 比较数据集拆分对性能的影响
  • 部署模型的多个版本

注意

每个项目的部署名称上限为十个

在部署过程中,可以为部署的模型选择名称,然后可以在提交分类任务时选择该名称:

<...>
  "tasks": [
    {
      "kind": "CustomSingleLabelClassification",
      "taskName": "MyTaskName",
      "parameters": {
        "projectName": "MyProject",
        "deploymentName": "MyDeployment"
      }
    }
  ]
<...>

使用 REST API

借助可用于 Azure AI 语言服务的 REST API,可按照 Language Studio 提供用户界面来生成项目的相同方式对 Azure AI 语言项目进行 CLI 开发。 在本模块的实验室中进一步探讨语言工作室。

使用 API 的模式

对于大多数调用,Azure AI 语言服务的 API 以异步方式运行。 在每个步骤中,我们首先向服务提交请求,然后通过后续调用与服务进行核对,从而获取状态或结果。

对于每个请求,都需要一个标头才能对请求进行身份验证:

密钥
Ocp-Apim-Subscription-Key Azure AI 语言资源的密钥

提交初始请求

提交请求的 URL 因你所执行的步骤而异,但所有 URL 都以 Azure AI 语言资源提供的终结点为前缀。

例如,若要训练模型,需要为 URL 创建 POST,如下所示

<YOUR-ENDPOINT>/language/analyze-text/projects/<PROJECT-NAME>/:train?api-version=<API-VERSION>
占位符 示例
<YOUR-ENDPOINT> 用于 API 请求的终结点 https://<your-custom-resource>.cognitiveservices.azure.com
<PROJECT-NAME> 项目名称(值区分大小写) myProject

以下正文将附加到请求:

    {
        "modelLabel": "<MODEL-NAME>",
        "trainingConfigVersion": "<CONFIG-VERSION>",
        "evaluationOptions": {
            "kind": "percentage",
            "trainingSplitPercentage": 80,
            "testingSplitPercentage": 20
        }
    }
密钥
<YOUR-MODEL> 模型名称。
trainingConfigVersion 用于训练模型的模型版本。
runValidation 用于对测试集运行验证的布尔值。
evaluationOptions 指定评估选项。
kind 指定数据拆分类型。 如果使用自动拆分,则可以是 percentage,如果手动拆分数据集,则可以是 set
testingSplitPercentage 仅当 type 为“百分比”时才需要整数字段。 指定测试拆分。
trainingSplitPercentage 仅当 type 为“百分比”时才需要整数字段。 指定训练拆分。

对上述请求的响应将是 202,表示请求成功。 从响应头中抓取 location 值,该值类似于以下 URL:

<ENDPOINT>/language/analyze-text/projects/<PROJECT-NAME>/train/jobs/<JOB-ID>?api-version=<API-VERSION>
密钥
<JOB-ID> 请求的标识符

此 URL 用于在下一步中获取训练状态。

获取训练状态

若要获取训练状态,请使用请求响应标头中的 URL 来提交 GET 请求,该请求与提供我们的 Azure AI 语言服务密钥用于身份验证的标头相同。 响应正文将类似于以下 JSON:

{
  "result": {
    "modelLabel": "<MODEL-NAME>",
    "trainingConfigVersion": "<CONFIG-VERSION>",
    "estimatedEndDateTime": "2023-05-18T15:47:58.8190649Z",
    "trainingStatus": {
      "percentComplete": 3,
      "startDateTime": "2023-05-18T15:45:06.8190649Z",
      "status": "running"
    },
    "evaluationStatus": {
      "percentComplete": 0,
      "status": "notStarted"
    }
  },
  "jobId": "<JOB-ID>",
  "createdDateTime": "2023-05-18T15:44:44Z",
  "lastUpdatedDateTime": "2023-05-18T15:45:48Z",
  "expirationDateTime": "2023-05-25T15:44:44Z",
  "status": "running"
}

训练模型可能需要一些时间,因此请定期检查此状态 URL,直到响应 status 返回 succeeded。 训练成功后,可以查看、验证和部署模型。

使用已部署的模型

使用模型对文本进行分类与上述模式相同,使用 POST 请求提交作业,使用 GET 请求检索结果。

提交文本进行分类

若要使用模型,请将 POST 提交到以下 URL 中的 analyze 终结点

<ENDPOINT>/language/analyze-text/jobs?api-version=<API-VERSION>
占位符 示例
<YOUR-ENDPOINT> 用于 API 请求的终结点 https://<your-custom-resource>.cognitiveservices.azure.com

重要

请记得将资源密钥包含在 Ocp-Apim-Subscription-Key 的标头中

以下 JSON 结构将附加到请求:

{
  "displayName": "Classifying documents",
  "analysisInput": {
    "documents": [
      {
        "id": "1",
        "language": "<LANGUAGE-CODE>",
        "text": "Text1"
      },
      {
        "id": "2",
        "language": "<LANGUAGE-CODE>",
        "text": "Text2"
      }
    ]
  },
  "tasks": [
     {
      "kind": "<TASK-REQUIRED>",
      "taskName": "<TASK-NAME>",
      "parameters": {
        "projectName": "<PROJECT-NAME>",
        "deploymentName": "<DEPLOYMENT-NAME>"
      }
    }
  ]
}
密钥
<TASK-REQUIRED> 要请求的任务。 对于多个标签项目,该任务为 CustomMultiLabelClassification;对于单个标签项目,为 CustomSingleLabelClassification
<LANGUAGE-CODE> 语言代码,例如 en-us
<TASK-NAME> 任务名称。
<PROJECT-NAME> 项目名称。
<DEPLOYMENT-NAME> 部署名称。

对上述请求的响应将是 202,表示请求成功。 在响应头中,查找类似于以下 URL 的 operation-location 值:

<ENDPOINT>/language/analyze-text/jobs/<JOB-ID>?api-version=<API-VERSION>
密钥
<YOUR-ENDPOINT> 用于 API 请求的终结点
<JOB-ID> 请求的标识符

此 URL 用于获取任务结果。

获取分类结果

在上一个请求中向终结点提交 GET 请求,并使用相同的标头进行身份验证。 响应正文将类似于以下 JSON:

{
  "createdDateTime": "2023-05-19T14:32:25.578Z",
  "displayName": "MyJobName",
  "expirationDateTime": "2023-05-19T14:32:25.578Z",
  "jobId": "xxxx-xxxxxx-xxxxx-xxxx",
  "lastUpdateDateTime": "2023-05-19T14:32:25.578Z",
  "status": "succeeded",
  "tasks": {
    "completed": 1,
    "failed": 0,
    "inProgress": 0,
    "total": 1,
    "items": [
      {
        "kind": "customSingleClassificationTasks",
        "taskName": "Classify documents",
        "lastUpdateDateTime": "2022-10-01T15:01:03Z",
        "status": "succeeded",
        "results": {
          "documents": [
            {
              "id": "<DOC-ID>",
              "class": [
                  {
                      "category": "Class_1",
                      "confidenceScore": 0.0551877357
                  }
              ],
              "warnings": []
            }
          ],
          "errors": [],
          "modelVersion": "2022-04-01"
        }
      }
    ]
  }
}

对于提交的每个文档,分类结果位于项数组的 results 对象中。