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

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

演示模板:使用的标记目的crowd-classifier

如果您选择自定义模板,您将到达自定义标签任务面板. 在那里,您可以从多个入门模板中进行选择,这些模板代表了一些较常见的任务。模板提供了构建自定义标记任务的模板的起点。

在本演示中,您使用目的检测模板,该模板使用crowd-classifier元素,以及Amazon Lambda函数来处理任务前后的数据。

入门目的检测自定义模板

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

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

您的意图检测自定义模板

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

除非您需要提供具有不同语言的不同标签集,否则避免变量并使用文本将节省处理时间并减少出错的可能性。本演示中使用的模板将删除该变量,但变量和过滤器(如to_json中进行了详细介绍。crowd-bounding-box示范文章。

设计您的元素

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

在包含这些区域的元素中,<short-instructions>自动显示在工作人员屏幕左侧的 “说明” 窗格中。这些区域有:<full-instructions>从该窗格顶部附近的 “查看完整说明” 链接中链接。单击链接会打开一个模式窗格,其中包含更详细的说明。

您不仅可以在这些部分中使用 HTML、CSS 和 JavaScript,如果您认为可以提供一套强大的说明和示例,帮助员工以更快的速度和准确性完成您的任务,我们鼓励您使用这些指令和示例。

例 尝试使用 JSfiddle 的样本

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

例 :最终自定义目的检测模板

这使用示例<crowd-classifier>task,但是有一个<classification-target>. 如果您试图在一系列不同的标注作业中保持一致的 CSS 设计,则可以使用<link rel...>元素的方式与在任何其他 HTML 文档中执行的方式相同。

例 :您的清单文件

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

{"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。使用source-ref为必须转换为 HTTP 的映像或其他文件指定 S3 URI。否则,应将 source 视为含上面的文本字符串来使用。

您的预注释 Lambda 函数

作为作业设置的一部 ARN,提供Amazon Lambda,可以调用以处理清单条目并将它们传递到模板引擎。

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

这同时适用于注释前 Lambda 和注释后 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 (执行角色) 面板。Select从一个或多个模板创建新角色. 为角色提供一个名称。从Policy templates下拉菜单中,选择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>" } } } } }, ... ... ... ]

这应该有助于您创建和使用自己的自定义模板。