你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:自定义文本分类 REST API

参考本文开始创建自定义文本分类项目,以便为文本分类训练自定义模型。 模型是经过训练以执行特定任务的 AI 软件。 对于此系统,模型将对文本进行分类,并通过从标记数据中学习来进行训练。

自定义文本分类支持两种类型的项目:

  • 单标签分类 - 你只能为数据集中的每个文档分配一个类。 例如,电影剧本只能归类为“浪漫”或“喜剧”。
  • 多标签分类 - 你可以为数据集中的每个文档分配多个类。 例如,电影脚本可以归类为“喜剧”或“浪漫”和“喜剧”。

在本快速入门中,可以使用提供的示例数据集生成多标签分类,将电影脚本分类为一个或多个类别。 或者,可以使用单标签分类数据集将科学论文的摘要分类到预定义的领域之一。

Prerequisites

在 Foundry Tools 资源和 Azure 存储帐户中创建新的 Azure 语言

在使用自定义文本分类之前,需要创建语言资源,该资源将提供创建项目并开始训练模型所需的凭据。 还需要一个 Azure 存储帐户,可以在其中上传用于生成模型的数据集。

重要说明

若要快速开始,我们建议使用本文中提供的步骤创建新的语言资源,以便创建 Azure 语言资源,同时创建和/或连接存储帐户,这比稍后执行作要容易得多。

如果有要使用的 预先存在的资源 ,则需要将其连接到存储帐户。

从 Azure 门户创建新资源

  1. 转到 Azure 门户 ,在 Foundry Tools 资源中创建新的 Azure 语言。

  2. 在出现的窗口中,从自定义功能中选择“自定义文本分类和自定义命名实体识别”。 单击屏幕底部的“继续创建资源”

    屏幕截图显示 Azure 门户中自定义文本分类和自定义命名实体识别的选项。

  3. 创建包含以下详细信息的语言资源。

    名称 所需的值
    订阅 Azure 订阅。
    资源组 将包含资源的资源组。 可以使用现有资源组,也可以新建一个。
    区域 支持的区域之一。 例如“美国西部 2”。
    名称 资源的名称。
    定价层 支持的定价层之一。 可以使用免费 (F0) 定价层试用该服务。

    如果收到一条消息“登录帐户不是所选存储帐户资源组的所有者”,则帐户需要在资源组上分配一个所有者角色,然后才能创建语言资源。 请联系 Azure 订阅所有者寻求帮助。

    可以通过搜索你的资源组并单击其关联订阅的链接来确定你的 Azure 订阅所有者。 然后:

    1. 选择“访问控制(IAM)”选项卡
    2. 选择“角色分配”
    3. 按“角色:所有者”筛选。
  4. 在“自定义文本分类和自定义命名实体识别”部分,选择现有存储帐户或选择“新建存储帐户”。 请注意,这些值用于帮助你快速入门,不一定是你希望在生产环境中使用的存储帐户值。 为避免在生成项目时出现延迟,请连接到与语言资源位于同一区域的存储帐户。

    存储帐户值 建议的值
    存储帐户名称 任何名称
    存储帐户类型 标准 LRS
  5. 确保选中“负责任的 AI 通知”。 在页面底部选择“查看 + 创建”

将示例数据上传到 Blob 容器

创建 Azure 存储帐户并将其连接到语言资源后,需要将示例数据集中的文档上传到容器的根目录。 这些文档用于训练模型。

  1. 下载多标签分类项目的示例数据集

  2. 打开 .zip 文件,然后解压缩包含文档的文件夹。

提供的示例数据集包含大约 200 个文档,每个文档都是电影摘要。 每个文档都属于以下一个或多个类:

  • “Mystery”
  • “Drama”
  • “Thriller”
  • “Comedy”
  • “Action”

Azure 门户

  1. Azure 门户中,导航到您创建的存储帐户,选择存储帐户,并在筛选任何字段中输入您的存储帐户名称。

    如果你的资源组未显示,请确保将“订阅等于”筛选器设置为“全部”。

  2. 在存储帐户中,从位于“数据存储”下方的左侧菜单中选择“容器”。 在出现的屏幕上,选择“+ 容器”。 将容器命名为“example-data”并保留默认的“公共访问级别”

    屏幕截图显示存储帐户主页。

  3. 创建容器后,选择它。 然后选择“上传”按钮以选择之前下载的 .txt 文件.json

    屏幕截图显示用于将文件上传到存储帐户的按钮。

获取资源密钥和终结点

  • Azure 门户中,转到资源概述页

  • 在左侧菜单中,选择"密钥和终结点”。 终结点和密钥用于 API 请求。

显示 Azure 门户中的“密钥和终结点”页的屏幕截图。

创建自定义文本分类项目

配置资源和存储容器后,请创建新的自定义文本分类项目。 项目是一个工作区,用于基于你的数据构建自定义 ML 模型。 你的项目只能由你和有权访问正在使用的 Azure 语言资源的其他人访问。

触发导入项目作业

使用以下 URL、标头和 JSON 正文提交 POST 请求,以导入标签文件。 请确保标签文件遵循接受的格式

如果已存在同名的项目,则替换该项目的数据。

{Endpoint}/language/authoring/analyze-text/projects/{projectName}/:import?api-version={API-VERSION}
占位符 示例
{ENDPOINT} 用于对 API 请求进行身份验证的终结点。 https://<your-custom-subdomain>.cognitiveservices.azure.com
{PROJECT-NAME} 项目的名称。 此值区分大小写。 myProject
{API-VERSION} 要调用的 API 版本。 引用的值适用于已发布的最新版本。 了解其他可用 API 版本的详细信息 2022-05-01

头文件

使用以下标头对请求进行身份验证。

密钥
Ocp-Apim-Subscription-Key 资源的密钥。 用于对 API 请求进行身份验证。

身体

在请求中使用以下 JSON。 将占位符值替换为你自己的值。

{
  "projectFileVersion": "{API-VERSION}",
  "stringIndexType": "Utf16CodeUnit",
  "metadata": {
    "projectName": "{PROJECT-NAME}",
    "storageInputContainerName": "{CONTAINER-NAME}",
    "projectKind": "customMultiLabelClassification",
    "description": "Trying out custom multi label text classification",
    "language": "{LANGUAGE-CODE}",
    "multilingual": true,
    "settings": {}
  },
  "assets": {
    "projectKind": "customMultiLabelClassification",
    "classes": [
      {
        "category": "Class1"
      },
      {
        "category": "Class2"
      }
    ],
    "documents": [
      {
        "location": "{DOCUMENT-NAME}",
        "language": "{LANGUAGE-CODE}",
        "dataset": "{DATASET}",
        "classes": [
          {
            "category": "Class1"
          },
          {
            "category": "Class2"
          }
        ]
      },
      {
        "location": "{DOCUMENT-NAME}",
        "language": "{LANGUAGE-CODE}",
        "dataset": "{DATASET}",
        "classes": [
          {
            "category": "Class2"
          }
        ]
      }
    ]
  }
}

密钥 占位符 示例
api-version {API-VERSION} 要调用的 API 版本。 此处使用的版本必须与 URL 中的 API 版本相同。 了解其他可用 API 版本的详细信息 2022-05-01
projectName {PROJECT-NAME} 项目名称。 此值区分大小写。 myProject
项目类型 customMultiLabelClassification 项目类型。 customMultiLabelClassification
语言 {LANGUAGE-CODE} 指定项目中所使用文档的语言代码的字符串。 如果项目是多语言项目,请选择大部分文档的语言代码。 请参阅语言支持,了解有关多语言支持的详细信息。 en-us
multilingual true 通过布尔值,你可以在数据集中有多种语言的文档,并且在部署模型时可以使用任何支持的语言(不一定包含在训练文档中)查询模型。 请参阅语言支持,了解有关多语言支持的详细信息。 true
存储输入容器名称 {CONTAINER-NAME} 已上传文档的 Azure 存储容器的名称。 myContainer
classes [] 包含项目中所有类的数组。 []
documents [] 包含项目中所有文档以及为此文档标记的类的数组。 []
位置 {DOCUMENT-NAME} 存储容器中文档的位置。 由于所有文档都位于容器的根目录中,因此它应该是文档名称。 doc1.txt
数据集 {DATASET} 此文档在训练前拆分时归类到的测试集。 请参阅 如何训练模型。 此字段的可能值为 TrainTest Train

发送 API 请求后,会收到一个 202 响应,指示作业已正确提交。 在响应标头中,提取 operation-location 格式如下的值:

{ENDPOINT}/language/authoring/analyze-text/projects/{PROJECT-NAME}/import/jobs/{JOB-ID}?api-version={API-VERSION}

{JOB-ID} 用于标识请求,因为此操作是异步的。 使用此 URL 获取导入作业状态。

此请求可能出现的错误场景:

  • 所选资源不具有该存储帐户的适当权限
  • 指定的 storageInputContainerName 不存在。
  • 使用了无效的语言代码,或者语言代码类型不是字符串。
  • multilingual 值是一个字符串,而不是布尔。

获取导入作业状态

使用以下 GET 请求获取导入项目的状态。 将占位符值替换为你自己的值。

请求 URL

{ENDPOINT}/language/authoring/analyze-text/projects/{PROJECT-NAME}/import/jobs/{JOB-ID}?api-version={API-VERSION}
占位符 示例
{ENDPOINT} 用于对 API 请求进行身份验证的终结点。 https://<your-custom-subdomain>.cognitiveservices.azure.com
{PROJECT-NAME} 项目名称。 此值区分大小写。 myProject
{JOB-ID} 用于查找模型训练状态的 ID。 该值位于你在上一步骤中收到的 location 标头值中。 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx
{API-VERSION} 要调用的 API 版本。 引用的值适用于已发布的最新版本。 了解其他可用 API 版本的详细信息 2022-05-01

头文件

使用以下标头对请求进行身份验证。

密钥
Ocp-Apim-Subscription-Key 资源的密钥。 用于对 API 请求进行身份验证。

训练模型

通常,在创建项目后,将继续开始标记连接到项目的容器中的文档。 对于本快速入门,你已导入示例标记数据集并使用示例 JSON 标记文件对项目进行初始化。

开始训练模型

导入项目后,便可以开始训练模型。

使用以下 URL、标头和 JSON 正文提交 POST 请求以提交训练作业。 将占位符值替换为你自己的值。

{ENDPOINT}/language/authoring/analyze-text/projects/{PROJECT-NAME}/:train?api-version={API-VERSION}
占位符 示例
{ENDPOINT} 用于对 API 请求进行身份验证的终结点。 https://<your-custom-subdomain>.cognitiveservices.azure.com
{PROJECT-NAME} 项目名称。 此值区分大小写。 myProject
{API-VERSION} 要调用的 API 版本。 引用的值适用于已发布的最新版本。 了解其他可用 API 版本的详细信息 2022-05-01

头文件

使用以下标头对请求进行身份验证。

密钥
Ocp-Apim-Subscription-Key 资源的密钥。 用于对 API 请求进行身份验证。

请求正文

在请求正文中使用以下 JSON。 完成训练后,该模型将命名为 {MODEL-NAME}。 只有成功的训练作业才会生成模型。

{
	"modelLabel": "{MODEL-NAME}",
	"trainingConfigVersion": "{CONFIG-VERSION}",
	"evaluationOptions": {
		"kind": "percentage",
		"trainingSplitPercentage": 80,
		"testingSplitPercentage": 20
	}
}
密钥 占位符 示例
modelLabel {MODEL-NAME} 成功训练后,将会分配给模型的模型名称。 myModel
trainingConfigVersion {CONFIG-VERSION} 这是用于训练模型的 模型版本 2022-05-01
评估选项 用于将数据拆分为训练集和测试集的选项。 {}
kind percentage 拆分方法。 可能的值为 percentagemanual。 有关详细信息,请参阅如何训练模型 percentage
trainingSplitPercentage 80 要包含在训练集中的已标记数据的百分比。 建议的值为 80 80
testingSplitPercentage 20 要包含在测试集中的已标记数据的百分比。 建议的值为 20 20

注意

仅当 trainingSplitPercentage 设置为 testingSplitPercentageKindpercentage 才是必需的,并且两个百分比的总和应等于 100。

发送 API 请求后,会收到一个 202 响应,指示作业已正确提交。 在响应标头中,提取 location 格式如下的值:

{ENDPOINT}/language/authoring/analyze-text/projects/{PROJECT-NAME}/train/jobs/{JOB-ID}?api-version={API-VERSION}

{JOB-ID} 用来标识请求,因为此操作是异步操作。 可以使用此 URL 获取训练状态。

获取训练作业状态

训练可能需要 10 到 30 分钟。 可以使用以下请求继续轮询训练作业的状态,直到训练成功完成。

使用以下 GET 请求来获取模型训练过程的状态。 将占位符值替换为你自己的值。

请求 URL

{ENDPOINT}/language/authoring/analyze-text/projects/{PROJECT-NAME}/train/jobs/{JOB-ID}?api-version={API-VERSION}
占位符 示例
{ENDPOINT} 用于对 API 请求进行身份验证的终结点。 https://<your-custom-subdomain>.cognitiveservices.azure.com
{PROJECT-NAME} 项目名称。 此值区分大小写。 myProject
{JOB-ID} 用于查找模型训练状态的 ID。 该值位于你在上一步骤中收到的 location 标头值中。 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx
{API-VERSION} 要调用的 API 版本。 引用的值适用于已发布的最新版本。 有关详细信息, 请参阅模型生命周期 2022-05-01

头文件

使用以下标头对请求进行身份验证。

密钥
Ocp-Apim-Subscription-Key 资源的密钥。 用于对 API 请求进行身份验证。

响应正文

发送请求后,会收到以下响应。

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

部署模型

通常,训练模型后,你会查看其评估详细信息,并在必要时进行改进。 在本快速入门中,你只需部署模型,使其在 Language Studio 中可供试用,你也可以调用预测 API

提交部署作业

使用以下 URL、标头和 JSON 正文提交 PUT 请求以提交部署作业。 将占位符值替换为你自己的值。

{Endpoint}/language/authoring/analyze-text/projects/{projectName}/deployments/{deploymentName}?api-version={API-VERSION}
占位符 示例
{ENDPOINT} 用于对 API 请求进行身份验证的终结点。 https://<your-custom-subdomain>.cognitiveservices.azure.com
{PROJECT-NAME} 项目名称。 此值区分大小写。 myProject
{DEPLOYMENT-NAME} 部署的名称。 此值区分大小写。 staging
{API-VERSION} 要调用的 API 版本。 引用的值适用于已发布的最新版本。 了解其他可用 API 版本的详细信息 2022-05-01

头文件

使用以下标头对请求进行身份验证。

密钥
Ocp-Apim-Subscription-Key 资源的密钥。 用于对 API 请求进行身份验证。

请求正文

在请求正文中使用以下 JSON。 使用要分配给部署的模型名称。

{
  "trainedModelLabel": "{MODEL-NAME}"
}
密钥 占位符 示例
trainedModelLabel {MODEL-NAME} 分配给您部署的模型名称。 只能分配已成功训练的模型。 此值区分大小写。 myModel

发送 API 请求后,会收到一个 202 响应,指示作业已正确提交。 在响应标头中,提取 operation-location 格式如下的值:

{ENDPOINT}/language/authoring/analyze-text/projects/{PROJECT-NAME}/deployments/{DEPLOYMENT-NAME}/jobs/{JOB-ID}?api-version={API-VERSION}

{JOB-ID} 用来标识请求,因为此操作是异步操作。 可使用此 URL 获取部署状态。

获取部署作业状态

使用以下 GET 请求来查询部署作业的状态。 可以使用在上一步中收到的 URL,或者将占位符值替换为自己的值。

{ENDPOINT}/language/authoring/analyze-text/projects/{PROJECT-NAME}/deployments/{DEPLOYMENT-NAME}/jobs/{JOB-ID}?api-version={API-VERSION}
占位符 示例
{ENDPOINT} 用于对 API 请求进行身份验证的终结点。 https://<your-custom-subdomain>.cognitiveservices.azure.com
{PROJECT-NAME} 项目名称。 此值区分大小写。 myProject
{DEPLOYMENT-NAME} 部署的名称。 此值区分大小写。 staging
{JOB-ID} 用于查找模型训练状态的 ID。 它包含在上一步骤中收到的 location 标头值中。 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx
{API-VERSION} 要调用的 API 版本。 引用的值适用于已发布的最新版本。 了解其他可用 API 版本的详细信息 2022-05-01

头文件

使用以下标头对请求进行身份验证。

密钥
Ocp-Apim-Subscription-Key 资源的密钥。 用于对 API 请求进行身份验证。

响应正文

发送请求后,会收到以下响应。 继续轮询此终结点,直到“status”参数变为“succeeded”。 应获取一个 200 代码来指示请求的成功。

{
    "jobId":"{JOB-ID}",
    "createdDateTime":"{CREATED-TIME}",
    "lastUpdatedDateTime":"{UPDATED-TIME}",
    "expirationDateTime":"{EXPIRATION-TIME}",
    "status":"running"
}

对文本进行分类

成功部署模型后,可以开始使用模型通过预测 API 对文本进行分类。 在之前下载的示例数据集中,可以找到一些可在此步骤中使用的测试文档。

提交自定义文本分类任务

使用此 POST 请求启动文本分类任务

{ENDPOINT}/language/analyze-text/jobs?api-version={API-VERSION}
占位符 示例
{ENDPOINT} 用于对 API 请求进行身份验证的终结点。 https://<your-custom-subdomain>.cognitiveservices.azure.com
{API-VERSION} 要调用的 API 版本。 引用的值适用于已发布的最新版本。 有关详细信息, 请参阅模型生命周期 2022-05-01

头文件

密钥
Ocp-Apim-Subscription-Key 你的密钥,用于提供对此 API 的访问权限。

身体

{
  "displayName": "Classifying documents",
  "analysisInput": {
    "documents": [
      {
        "id": "1",
        "language": "{LANGUAGE-CODE}",
        "text": "Text1"
      },
      {
        "id": "2",
        "language": "{LANGUAGE-CODE}",
        "text": "Text2"
      }
    ]
  },
  "tasks": [
     {
      "kind": "CustomMultiLabelClassification",
      "taskName": "Multi Label Classification",
      "parameters": {
        "projectName": "{PROJECT-NAME}",
        "deploymentName": "{DEPLOYMENT-NAME}"
      }
    }
  ]
}
密钥 占位符 示例
displayName {JOB-NAME} 你的作业名称。 MyJobName
documents [{},{}] 要对其运行任务的文档列表。 [{},{}]
id {DOC-ID} 文档名称或 ID。 doc1
language {LANGUAGE-CODE} 指定文档语言代码的字符串。 如果未指定此键,该服务将采用在创建项目时选择的项目默认语言。 有关支持的语言代码的列表,请参阅语言支持 en-us
text {DOC-TEXT} 要对其运行任务的文档任务。 Lorem ipsum dolor sit amet
tasks 要执行的任务列表。 []
taskName 自定义多标签分类 任务名称 自定义多标签分类
parameters 要传递给任务的参数列表。
project-name {PROJECT-NAME} 项目的名称。 此值区分大小写。 myProject
deployment-name {DEPLOYMENT-NAME} 部署的名称。 此值区分大小写。 prod

响应

你会收到202状态码响应,表示操作成功。 在响应头中,提取 operation-locationoperation-location 的格式如下:

{ENDPOINT}/language/analyze-text/jobs/{JOB-ID}?api-version={API-VERSION}

可以使用此 URL 查询任务完成状态,并在任务完成时获取结果。

获取任务结果

使用以下 GET 请求查询文本分类任务的状态/结果

{ENDPOINT}/language/analyze-text/jobs/{JOB-ID}?api-version={API-VERSION}
占位符 示例
{ENDPOINT} 用于对 API 请求进行身份验证的终结点。 https://<your-custom-subdomain>.cognitiveservices.azure.com
{API-VERSION} 要调用的 API 版本。 引用的值适用于最新发布的 模型版本 2022-05-01

头文件

密钥
Ocp-Apim-Subscription-Key 你的密钥,用于提供对此 API 的访问权限。

响应正文

响应将是具有以下参数的 JSON 文档。

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

清理资源

当你不再需要项目时,可以使用以下 DELETE 请求将其删除。 将占位符值替换为你自己的值。

{Endpoint}/language/authoring/analyze-text/projects/{projectName}?api-version={API-VERSION}
占位符 示例
{ENDPOINT} 用于对 API 请求进行身份验证的终结点。 https://<your-custom-subdomain>.cognitiveservices.azure.com
{PROJECT-NAME} 项目的名称。 此值区分大小写。 myProject
{API-VERSION} 要调用的 API 版本。 引用的值适用于已发布的最新版本。 了解其他可用 API 版本的详细信息 2022-05-01

头文件

使用以下标头对请求进行身份验证。

密钥
Ocp-Apim-Subscription-Key 资源的密钥。 用于对 API 请求进行身份验证。

发送 API 请求后,会收到指示 202 成功的响应,这意味着项目被删除。 带有用于检查作业状态的 Operation-Location 标头的成功调用结果。

后续步骤

创建自定义文本分类模型后,可以:

当你开始创建自己的自定义文本分类项目时,请使用操作说明文章更详细地了解如何开发模型: