演示模板:使用以下方法标记意图crowd-classifier - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

演示模板:使用以下方法标记意图crowd-classifier

如果您选择自定义模板,则将进入自定义标签任务面板。在这里,您可以从多个初学者模板中进行选择,这些模板代表一些更常见的任务。这些模板为构建自定义标签任务的模板提供了一个起点。

在本演示中,您将使用意图检测模板,该模板使用crowd-classifier元素以及在任务之前和之后处理数据所需的Amazon Lambda函数。

入门意图检测自定义模板

这是作为起点提供的目的检测模板。

此自定义模板使用 Liquid 模板语言,双大括号之间的每个项都是一个变量。预先注释的Amazon Lambda 函数应提供一个名为的对象,taskInput并且可以像在模板{{ task.input.<property name> }}中一样访问该对象的属性。

您的意图检测自定义模板

在入门模板中,有两个变量:crowd-classifier 元素中的 task.input.labels 属性,用于打开标记,以及 classification-target 区域的内容中的 task.input.utterance

除非你需要提供不同语句的不同标签集,否则避免使用变量而仅使用文本可以节省处理时间并减少出错的可能性。本演示中使用的模板将删除该变量,但演crowd-bounding-box文章中将更详细地解释诸如to_json此类的变量和过滤器。

为元素设置样式

这些自定义元素中有两个有时会被忽略的部分是<full-instructions><short-instructions>区域。好的指令会产生良好的结果。

在包含这些区域的元素中,它们会自动<short-instructions>出现在工作人员屏幕左侧的 “说明” 窗格中。链接<full-instructions>来自该窗格顶部附近的 “查看完整说明” 链接。单击该链接将打开一个包含更多详细说明的模态窗格。

你不仅可以使用 HTML、CSS, JavaScript 在这些部分中,如果你相信自己能提供一套强有力的说明和示例,帮助工作人员以更快的速度和准确性完成任务,我们鼓励你这样做。

例 用 jsFiddle 试试样本

试试示例<crowd-classifier>任务。该示例由 JSFiddle 呈现,因此所有模板变量都被硬编码值替换。单击 “查看完整说明” 链接,查看一组带有扩展 CSS 样式的示例。你可以通过分叉来尝试自己对 CSS 的更改、添加示例图像或添加扩展 JavaScript 功能。

例 : 最终自定义意图检测模板

这使用了示例<crowd-classifier>任务,但使用了变量<classification-target>。如果你想在一系列不同的标签工作中保持一致的 CSS 设计,你可以像在任何其他 HTML 文档中一样使用<link rel...>元素添加外部样式表。

例 :您的清单文件

如果您正在为此类文本分类任务手动准备清单文件,请按以下方式格式化数据。

{"source": "Roses are red"} {"source": "Violets are Blue"} {"source": "Ground Truth is the best"} {"source": "And so are you"}

这有别于用于“演示模板:使用以下方法对图像进行注释crowd-bounding-box”演示的清单文件,在后者中,source-ref 用作属性名而非 source。使用为必须转换为 HTTP 的图像或其他文件source-ref指定 S3 URI。否则,应将 source 视为含上面的文本字符串来使用。

你的注释前 Lambda 函数

作为任务设置的一部分,提供可以调用的 ARN 来处理您的清单条目并将其传递给模板引擎。Amazon Lambda

此 Lambda 函数必须包含以下四个字符串之一作为函数名的一部分: SageMakerSagemakersagemakerLabelingFunction

这适用于您的注释前和注释后 Lambda。

当您使用控制台时,如果您有一个归您的账户拥有的 Lambda,则将提供满足命名要求的函数的下拉列表供您选择一个函数。

在这个非常基本的示例中,您只有一个变量,它主要是一个直通函数。下面是使用 Python 3.7 的标记前 Lambda 的一个示例。

import json def lambda_handler(event, context): return { "taskInput": event['dataObject'] }

dataObject属性event包含清单中数据对象的属性。

在本演示中,这是一个简单的传递,您只需将其作为taskInput值直接传递即可。如果将具有这些值的属性添加到 event['dataObject'] 对象,则它们可作为格式为 {{ task.input.<property name> }} 的 Liquid 变量用于您的 HTML 模板。

你的注释后 Lambda 函数

作为任务设置的一部分,提供 Lambda 函数的 ARN,可在工作人员完成任务时调用该函数来处理表单数据。这可以很简单,也可以很复杂。如果你想在数据进入时进行答案合并和评分,你可以应用你选择的评分或合并算法。如果您想要存储原始数据以进行脱机处理,则这是一个选项。

为您的注释后 Lambda 函数设置权限

注释数据将位于一个文件中,该文件由 payload 对象中的 s3Uri 字符串指定。要在注释传入时对其进行处理,即使是简单的传递函数,您也需要分配S3ReadOnly对 Lambda 的访问权限,这样它才能读取注释文件。

在用于创建 Lambda 的控制台中,滚动至 Execution role (执行角色) 面板。选择 Aper 从一个或多个模板创建新角色。为角色命名。从策略模板下拉列表中,选择 Amazon S3 对象只读权限。保存 Lambda,角色将被保存并选中。

以下示例适用于 Python 3.7。

import json import boto3 from urllib.parse import urlparse def lambda_handler(event, context): consolidated_labels = [] parsed_url = urlparse(event['payload']['s3Uri']); s3 = boto3.client('s3') textFile = s3.get_object(Bucket = parsed_url.netloc, Key = parsed_url.path[1:]) filecont = textFile['Body'].read() annotations = json.loads(filecont); for dataset in annotations: for annotation in dataset['annotations']: new_annotation = json.loads(annotation['annotationData']['content']) label = { 'datasetObjectId': dataset['datasetObjectId'], 'consolidatedAnnotation' : { 'content': { event['labelAttributeName']: { 'workerId': annotation['workerId'], 'result': new_annotation, 'labeledContent': dataset['dataObject'] } } } } consolidated_labels.append(label) return consolidated_labels

您的标签作业输出

注释后 Lambda 通常会在事件对象中接收批量任务结果。这种批处理将是 Lambda 应迭代的 payload 对象。

您将在您指定的目标 S3 存储桶中以您的标记作业命名的文件夹中找到作业的输出。它将位于名为 manifests 的子文件夹中。

对于意图检测任务,输出清单中的输出将有点像下面的演示。这个示例已进行清理并加宽间距,以便于阅读。实际输出将更加压缩,便于机器读取。

例 :输出清单中的 JSON
[ { "datasetObjectId":"<Number representing item's place in the manifest>", "consolidatedAnnotation": { "content": { "<name of labeling job>": { "workerId":"private.us-east-1.XXXXXXXXXXXXXXXXXXXXXX", "result": { "intent": { "label":"<label chosen by worker>" } }, "labeledContent": { "content":"<text content that was labeled>" } } } } }, "datasetObjectId":"<Number representing item's place in the manifest>", "consolidatedAnnotation": { "content": { "<name of labeling job>": { "workerId":"private.us-east-1.6UDLPKQZHYWJQSCA4MBJBB7FWE", "result": { "intent": { "label": "<label chosen by worker>" } }, "labeledContent": { "content": "<text content that was labeled>" } } } } }, ... ... ... ]

这应该可以帮助您创建和使用自己的自定义模板。