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

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

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

如果您选择自定义模板,您将访问 Custom labeling task (自定义标记任务) 面板。在那里,您可以从表示一些更常见任务的多个初学者模板中进行选择。这些模板提供了构建自定义标记任务模板的起点。

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

Starter Intent Detection 自定义模板

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

<script src="https://assets.crowd.aws/crowd-html-elements.js"></script> <crowd-form> <crowd-classifier name="intent" categories="{{ task.input.labels | to_json | escape }}" header="Pick the most relevant intention expressed by the below text" > <classification-target> {{ task.input.utterance }} </classification-target> <full-instructions header="Intent Detection Instructions"> <p>Select the most relevant intention expressed by the text.</p> <div> <p><strong>Example: </strong>I would like to return a pair of shoes</p> <p><strong>Intent: </strong>Return</p> </div> </full-instructions> <short-instructions> Pick the most relevant intention expressed by the text </short-instructions> </crowd-classifier> </crowd-form>

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

您的目的检测自定义模板

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

除非您需要提供具有不同表达的不同标签集,否则避免使用变量和仅使用文本将节省处理时间并减少出错的可能性。本演示中使用的 模板将删除该变量,但to_json演示crowd-bounding-box文章中将更详细地介绍变量和筛选条件 (如 )。

样式元素

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

在包含这些区域的元素中, 会自动<short-instructions>显示在工作人员屏幕左侧的“Instructions (说明)”窗格中。<full-instructions> 通过该窗格顶部附近的“View full instructions (查看完整说明)”链接。单击链接将打开包含更详细的说明的模态窗格。

在这些部分中,您不仅可以使用 HTML、CSS 和 JavaScript如果您认为可以提供一组强大的说明和示例来帮助工作人员以更好的速度和准确性完成任务,则鼓励您这样做。

例 尝试使用 JSFiddle 的示例

试用示例<crowd-classifier>任务。该示例由 JSFiddle 呈现,因此,所有模板变量都将替换为硬编码值。单击“View full instructions (查看完整说明)”链接可查看一组具有扩展 CSS 样式的示例。您可以分支项目以试验您对 CSS 进行的更改、添加示例图像或添加扩展 JavaScript 功能。

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

这将使用示例<crowd-classifier>任务,但对于 具有 变量<classification-target>。如果您尝试在一系列不同的标记作业中保持一致的 CSS 设计,则可以像在任何其他 HTML 文档中一样使用 <link rel...> 元素来包含外部样式表。

<script src="https://assets.crowd.aws/crowd-html-elements.js"></script> <crowd-form> <crowd-classifier name="intent" categories="['buy', 'eat', 'watch', 'browse', 'leave']" header="Pick the most relevant intent expressed by the text below" > <classification-target> {{ task.input.source }} </classification-target> <full-instructions header="Emotion Classification Instructions"> <p>In the statements and questions provided in this exercise, what category of action is the speaker interested in doing?</p> <table> <tr> <th>Example Utterance</th> <th>Good Choice</th> </tr> <tr> <td>When is the Seahawks game on?</td> <td> eat<br> <greenbg>watch</greenbg> <botchoice>browse</botchoice> </td> </tr> <tr> <th>Example Utterance</th> <th>Bad Choice</th> </tr> <tr> <td>When is the Seahawks game on?</td> <td> buy<br> <greenbg>eat</greenbg> <botchoice>watch</botchoice> </td> </tr> </table> </full-instructions> <short-instructions> What is the speaker expressing they would like to do next? </short-instructions> </crowd-classifier> </crowd-form> <style> greenbg { background: #feee23; display: block; } table { *border-collapse: collapse; /* IE7 and lower */ border-spacing: 0; } th, tfoot, .fakehead { background-color: #8888ee; color: #f3f3f3; font-weight: 700; } th, td, tfoot { border: 1px solid blue; } th:first-child { border-radius: 6px 0 0 0; } th:last-child { border-radius: 0 6px 0 0; } th:only-child{ border-radius: 6px 6px 0 0; } tfoot:first-child { border-radius: 0 0 6px 0; } tfoot:last-child { border-radius: 0 0 0 6px; } tfoot:only-child{ border-radius: 6px 6px; } td { padding-left: 15px ; padding-right: 15px ; } botchoice { display: block; height: 17px; width: 490px; overflow: hidden; position: relative; background: #fff; padding-bottom: 20px; } botchoice:after { position: absolute; bottom: 0; left: 0; height: 100%; width: 100%; content: ""; background: linear-gradient(to top, rgba(255,255,255, 1) 55%, rgba(255,255,255, 0) 100% ); pointer-events: none; /* so the text is still selectable */ } </style>

例 :您的清单文件

如果您手动为此类文本分类任务准备清单文件,请采用以下方式设置数据格式。

{"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 URIs。否则,应将 source 视为含上面的文本字符串来使用。

您的注释前 Lambda 函数

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

此 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 函数设置权限

注释数据将位于一个文件中,该文件由 s3Uri 对象中的 payload 字符串指定。要在出现注释时处理注释,即使对于简单的直通函数,您也需要分配对 Lambda S3ReadOnly 的访问权限,以便它可以读取注释文件。

在用于创建 Lambda 的控制台中,滚动至 Execution role (执行角色) 面板。选择 Create a new role from one or more templates (从一个或多个模板创建新角色)。为角色指定名称。从 Policy templates (策略模板) 下拉列表中,选择 Amazon Amazon S3 object read-only permissions (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>" } } } } }, ... ... ... ]

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