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

如何创建自定义命名实体识别 (NER) 项目

本文介绍如何进行设置以满足开始使用自定义 NER 的要求,以及如何创建项目。

Prerequisites

在开始使用自定义 NER 之前,需要:

创建语言资源

在开始使用自定义 NER 之前,需要在 Foundry Tools 资源中使用 Azure 语言。 建议创建语言资源,并在 Azure 门户中将存储帐户连接到该资源。 在 Azure 门户中创建资源可让你同时创建一个 Azure 存储帐户,并预配置了所有必需的权限。 还可以在本文中进一步阅读,了解如何使用预先存在的资源,并将其配置为使用自定义命名实体识别。

你还需要一个 Azure 存储帐户,在其中上传用于训练模型以提取实体的 .txt 文档。

注意

  • 你需要分配有资源组的“所有者”角色才能创建语言资源。
  • 如果连接预先存在的存储帐户,则应为其分配所有者角色。

创建语言资源并连接存储帐户

可以通过下列方式创建资源:

  • Azure 门户
  • PowerShell

注意

与 Azure 语言资源链接后,不应将存储帐户移动到其他资源组或订阅。

从 Azure 门户创建新资源

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

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

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

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

    名称 说明
    订阅 Azure 订阅。
    资源组 包含您资源的资源组。 可以使用现有资源组,也可以新建一个。
    区域 语言资源的区域。 例如,“美国西部 2”。
    名称 资源的名称。
    定价层 语言资源的定价层。 可以使用免费 (F0) 定价层试用该服务。

    注意

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

  4. 在“自定义文本分类和自定义命名实体识别”部分,选择现有存储帐户或选择“新建存储帐户”。 这些值是帮助您入门的参考,不一定是您希望在生产环境中使用的 存储帐户值。 为了避免在生成项目期间出现延迟,请连接到与语言资源位于同一区域中的存储帐户。

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

使用 PowerShell 创建新的语言资源

可使用以下 CLI 模板参数文件(托管在 GitHub 上)创建新资源和存储帐户。

在参数文件中编辑以下值:

参数名称 值说明
name 语言资源的名称
location 托管资源的区域。 有关详细信息,请参阅服务限制
sku 资源的定价层
storageResourceName 存储帐户的名称
storageLocation 托管存储帐户的区域。
storageSkuType 存储帐户的 SKU。
storageResourceGroupName 存储帐户的资源组

使用以下 PowerShell 命令,部署 Azure 资源管理器 (ARM) 模板和编辑的文件。

New-AzResourceGroupDeployment -Name ExampleDeployment -ResourceGroupName ExampleResourceGroup `
  -TemplateFile <path-to-arm-template> `
  -TemplateParameterFile <path-to-parameters-file>

要了解如何部署模板参数文件,请参阅 ARM 模板文档。

注意

  • 将存储帐户连接到语言资源的过程不可逆。 以后无法断开连接。
  • 只能将你的语言资源连接到一个存储帐户。

使用预先存在的语言资源

可使用现有的语言资源来开始使用自定义 NER,只要该资源满足以下要求即可:

要求 说明
区域 请确保现有资源是在某一个受支持的区域预配的。 否则,需要在其中一个区域中创建新资源。
定价层 了解有关支持的定价层的详细信息。
托管标识 请确保已启用资源的托管标识设置。 否则,请阅读下一部分。

若要使用自定义命名实体识别,需要 创建一个 Azure 存储帐户 (如果还没有)。

为资源启用标识管理

语言资源必须具有标识管理,若要使用 Azure 门户启用它,请执行以下操作:

  1. 转到你的语言资源
  2. 在左侧菜单中的“资源管理”部分下,选择“标识”
  3. 在“系统分配”选项卡中,确保将“状态”设置为“启用”

启用自定义命名实体识别功能

请确保从 Azure 门户启用“自定义文本分类/自定义命名实体识别”功能。

  1. 转到 Azure 门户中的语言资源。
  2. 在左侧菜单中的“资源管理”部分下,选择“功能”。
  3. 启用“自定义文本分类/自定义命名实体识别”功能。
  4. 连接你的存储帐户。
  5. 选择“应用”。

重要说明

请确保执行更改的用户分配有“存储 Blob 数据参与者”角色。

添加所需的角色

使用以下步骤为语言资源和存储帐户设置所需的角色。

显示如何在 Azure 门户中设置角色的动画图像。

Foundry Tools 中的 Azure 语言资源的角色

  1. Azure 门户中转到你的存储帐户或语言资源。

  2. 在左窗格中选择 “访问控制”(IAM )。

  3. 选择“添加”以添加角色分配,然后为帐户选择适当的角色。

    你应在你的语言资源上分配有“所有者”或“参与者”角色

  4. 在“将访问权限分配给”中,选择“用户、组或服务主体”

  5. 选择“选择成员”

  6. 选择用户名。 可在“选择”字段中搜索用户名。 对所有角色重复此操作。

  7. 对需要访问此资源的所有用户帐户重复这些步骤。

存储帐户的角色

  1. Azure 门户中转到自己的存储帐户页面。
  2. 在左窗格中选择 “访问控制”(IAM )。
  3. 选择“添加”以添加角色分配,然后选择存储帐户上的“存储 Blob 数据参与者”角色。
  4. 在“将访问权限分配给”中,选择“托管标识”
  5. 选择“选择成员”
  6. 选择你的订阅,然后选择“Language”作为托管标识。 可在“选择”字段中搜索用户名

用户的角色

重要说明

如果跳过此步骤,则在尝试连接到自定义项目时会出现 403 错误。 重要的是,即使你是存储帐户的所有者,当前用户也必须具有此角色才能访问存储帐户 blob 数据。

  1. Azure 门户中转到自己的存储帐户页面。
  2. 在左窗格中选择 “访问控制”(IAM )。
  3. 选择“添加”以添加角色分配,然后选择存储帐户上的“存储 Blob 数据参与者”角色。
  4. 在“将访问权限分配给”中,选择“用户、组或服务主体”
  5. 选择“选择成员”
  6. 选择你的用户。 可在“选择”字段中搜索用户名

重要说明

如果有虚拟网络或专用终结点,请务必在 Azure 门户中选择“允许受信任服务列表中的 Azure 服务访问此存储帐户”。

为你的存储帐户启用 CORS

当启用跨源资源共享 (CORS) 时,请确保允许(GET、PUT、DELETE)方法。 将“允许的来源”字段设置为 https://language.cognitive.azure.com。 通过将 * 添加到允许的标头值来允许所有标头,并将最长期限设置为 500

显示如何将 CORS 用于存储帐户的屏幕截图。

创建自定义命名实体识别项目(REST API)

配置资源和存储容器后,需要创建新的自定义 NER 项目。 项目是一个基于数据构建自定义 AI 模型的工作区。 只有你可以与有权访问正在使用的 Azure 资源的其他人员一起访问项目。 如果标记了数据,则可以使用它来开始 导入项目

若要开始创建自定义命名实体识别模型,需要创建项目。 通过创建项目,可以标记数据、训练、评估、改进和部署模型。

注意

项目名称对于所有操作都区分大小写。

使用以下 URL、标头和 JSON 正文创建 PATCH 请求,以创建项目。

请求 URL

使用以下 URL 创建项目。 将以下占位符替换为自己的值。

{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 版本。 引用的值适用于最新发布的版本。 有关详细信息, 请参阅模型生命周期 2022-05-01

请求标头

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

密钥 必选 类型
Ocp-Apim-Subscription-Key True 字符串 资源的密钥。 用于对 API 请求进行身份验证。
Content-Type True 字符串 application/merge-patch+json

请求主体

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

{
  "projectName": "{PROJECT-NAME}",
  "language": "{LANGUAGE-CODE}",
  "projectKind": "CustomEntityRecognition",
  "description": "Project description",
  "multilingual": "True",
  "storageInputContainerName": "{CONTAINER-NAME}"
}

密钥 占位符 示例
projectName {PROJECT-NAME} 项目名称。 此值区分大小写。 myProject
语言 {LANGUAGE-CODE} 指定项目中所使用文档的语言代码的字符串。 如果项目是多语言项目,请选择文档中最常表示的语言的代码。 请参阅语言支持,了解有关受支持语言代码的详细信息。 en-us
项目类型 CustomEntityRecognition 项目类型。 CustomEntityRecognition
multilingual true 通过布尔值,你可以在数据集中有多种语言的文档,并且在部署模型时可以使用任何支持的语言(不一定包含在训练文档中)查询模型。 请参阅语言支持,了解有关多语言支持的详细信息。 true
storageInputContainerName {CONTAINER-NAME 上传文档的 Azure 存储容器的名称。 myContainer

此请求返回 201 响应,这意味着该项目已创建。

如果出现以下情况,此请求将返回错误:

  • 所选资源不具有该存储帐户的适当权限。

导入项目 (REST API)

如果已标记数据,则可以使用它开始使用该服务。 请确保已标记的数据遵循接受的数据格式

使用以下 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 版本。 此处引用的值适用于已发布的最新版本。 有关详细信息, 请参阅模型生命周期 2022-05-01

头文件

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

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

身体

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

{
    "projectFileVersion": "{API-VERSION}",
    "stringIndexType": "Utf16CodeUnit",
    "metadata": {
        "projectName": "{PROJECT-NAME}",
        "projectKind": "CustomEntityRecognition",
        "description": "Trying out custom NER",
        "language": "{LANGUAGE-CODE}",
        "multilingual": true,
        "storageInputContainerName": "{CONTAINER-NAME}",
        "settings": {}
    },
    "assets": {
    "projectKind": "CustomEntityRecognition",
        "entities": [
            {
                "category": "Entity1"
            },
            {
                "category": "Entity2"
            }
        ],
        "documents": [
            {
                "location": "{DOCUMENT-NAME}",
                "language": "{LANGUAGE-CODE}",
                "dataset": "{DATASET}",
                "entities": [
                    {
                        "regionOffset": 0,
                        "regionLength": 500,
                        "labels": [
                            {
                                "category": "Entity1",
                                "offset": 25,
                                "length": 10
                            },
                            {
                                "category": "Entity2",
                                "offset": 120,
                                "length": 8
                            }
                        ]
                    }
                ]
            },
            {
                "location": "{DOCUMENT-NAME}",
                "language": "{LANGUAGE-CODE}",
                "dataset": "{DATASET}",
                "entities": [
                    {
                        "regionOffset": 0,
                        "regionLength": 100,
                        "labels": [
                            {
                                "category": "Entity2",
                                "offset": 20,
                                "length": 5
                            }
                        ]
                    }
                ]
            }
        ]
    }
}
密钥 占位符 示例
api-version {API-VERSION} 要调用的 API 版本。 此处使用的版本必须与 URL 中的 API 版本相同。 详细了解其他可用的 API 版本 2022-03-01-preview
projectName {PROJECT-NAME} 项目名称。 此值区分大小写。 myProject
projectKind CustomEntityRecognition 项目类型。 CustomEntityRecognition
language {LANGUAGE-CODE} 指定项目中所使用文档的语言代码的字符串。 如果项目是多语言项目,请选择大多数文档 的语言代码 en-us
multilingual true 通过布尔值,你可以在数据集中有多种语言的文档,并且在部署模型时可以使用任何支持的语言(不一定包含在训练文档中)查询模型。 如需了解多语言支持,请参阅语言支持 true
storageInputContainerName {CONTAINER-NAME} 包含已上传文档的 Azure 存储容器的名称。 myContainer
entities 一个数组,其中包含项目中拥有和从文档中提取的所有实体类型。
documents 一个数组,其中包含项目中的所有文档和每个文档中标记的实体列表。 []
location {DOCUMENT-NAME} 存储容器中文档的位置。 doc1.txt
dataset {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 值是一个字符串,而不是布尔值。

获取项目详细信息(REST API)

使用以下 GET 请求获取项目详细信息。 将占位符值替换为你自己的值。

{ENDPOINT}/language/authoring/analyze-text/projects/{PROJECT-NAME}?api-version={API-VERSION}
占位符 示例
{ENDPOINT} 用于对 API 请求进行身份验证的终结点。 https://<your-custom-subdomain>.cognitiveservices.azure.com
{PROJECT-NAME} 项目的名称。 此值区分大小写。 myProject
{API-VERSION} 要调用的 API 版本。 有关详细信息, 请参阅模型生命周期 2022-05-01

头文件

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

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

响应正文

    {
        "createdDateTime": "2021-10-19T23:24:41.572Z",
        "lastModifiedDateTime": "2021-10-19T23:24:41.572Z",
        "lastTrainedDateTime": "2021-10-19T23:24:41.572Z",
        "lastDeployedDateTime": "2021-10-19T23:24:41.572Z",
        "projectKind": "CustomEntityRecognition",
        "storageInputContainerName": "{CONTAINER-NAME}",
        "projectName": "{PROJECT-NAME}",
        "multilingual": false,
        "description": "Project description",
        "language": "{LANGUAGE-CODE}"
    }
占位符 说明 示例
projectKind CustomEntityRecognition 项目类型。 CustomEntityRecognition
storageInputContainerName {CONTAINER-NAME} 已上传文档的 Azure 存储容器的名称。 myContainer
projectName {PROJECT-NAME} 项目名称。 此值区分大小写。 myProject
multilingual true 通过布尔值,你可以在数据集中有多种语言的文档,并且在部署模型时可以使用任何支持的语言(不一定包含在训练文档中)查询模型。 如需详细了解多语言支持,请参阅语言支持 true
language {LANGUAGE-CODE} 指定项目中所使用文档的语言代码的字符串。 如果项目是多语言项目,请选择大部分文档 的语言代码 en-us

发送 API 请求后,会收到一个 200 响应,指示成功和 JSON 响应正文以及项目详细信息。

删除项目 (REST API)

当你不再需要项目时,可以使用以下 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 版本。 引用的值适用于已发布的最新版本。 有关详细信息, 请参阅模型生命周期 2022-05-01

头文件

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

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

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

后续步骤

  • 你应该了解标记数据时所用的项目模式

  • 创建项目后,可以开始 标记数据。 此过程告知实体提取模型如何解释文本,并用于训练和评估。