步骤 2:创建自定义的工作人员任务模板
工作人员任务模板是 Ground Truth 用来自定义工作人员用户界面 (UI) 或人工任务 UI 的文件。您可以使用 HTML、CSS、JavaScript、Liquid 模板语言和 Crowd HTML Elements 创建工作人员任务模板。Liquid 可用于自动化模板,而 Crowd HTML 元素可用于包含常用注释工具,并提供向 Ground Truth 提交的逻辑。
使用以下主题了解如何创建工作人员任务模板。您可以在 GitHub
从基本模板开始
您可以使用 Ground Truth 控制台中的模板编辑器开始创建模板。该编辑器包括许多预先设计的基本模板以及 HTML 和 Crowd HTML Element 自动填充功能。
要访问 Ground Truth 自定义模板编辑器,请执行以下操作:
-
按照创建标注作业(控制台)中的说明进行操作,然后选择自定义作为标注作业任务类型。
-
选择下一步后,您就可以访问自定义标注任务设置部分的模板编辑器和基本模板。
-
(可选)从模板下的下拉菜单中选择一个基本模板。如果您想从头开始创建模板,请从下拉菜单中选择自定义,以获得最小的模板框架。
在本地开发模板
尽管您需要在控制台中测试模板将如何处理传入的数据,但您可以通过在 HTML 文件的顶部添加此代码,在浏览器中测试模板的 HTML 和自定义元素的外观。
这会加载必要的代码来呈现自定义 HTML 元素。如果您希望在首选编辑器而非在控制台中开发您模板的外观,则使用此方法。
但请记住,这不会解析您的变量。您可能希望在本地开发时将它们替换为示例内容。
使用外部资产
Amazon SageMaker Ground Truth 自定义模板允许嵌入外部脚本和样式表。例如,下面的代码块演示了如何将位于 https://www.example.com/my-enhancement-styles.css
的样式表添加到模板中。
<script src="https://www.example.com/my-enhancment-script.js"></script> <link rel="stylesheet" type="text/css" href="https://www.example.com/my-enhancement-styles.css">
如果您遇到错误,请确保您的原始服务器随资产一起发送正确的 MIME 类型和编码标头。
例如,对于远程脚本,MIME 和编码类型为 application/javascript;CHARSET=UTF-8
。
对于远程样式表,MIME 和编码类型为 text/css;CHARSET=UTF-8
。
跟踪变量
在下面构建示例的过程中,将有一个步骤用于向示例添加变量,以表示可能会随任务或工作人员不同而变化的数据片段。如果您以其中一个示例模板开始,您将需要确保自己知道它已经使用的变量。在创建注释前 Amazon Lambda 脚本时,其输出需要包含您选择保留的任何这些变量的值。
用于变量的值可能来自于清单文件。将为注释前 Lambda 提供数据对象中的所有键值对。如果这是一个简单的传递脚本,将数据对象中的值键与模板中的变量名称相匹配是将这些值传递到工作人员看到的任务表单的最简单方法。
简单示例
所有任务都以 <crowd-form> </crowd-form>
元素开始和结束。与标准 HTML <form>
元素类似,所有格式代码都应位于它们之间。
对于简单的推文分析任务,请使用 <crowd-classifier>
元素。它需要以下属性:
名称 - 用于格式输出结果的变量名称。
类别 - JSON 格式的一系列可能的答案。
标题 - 用于注释工具的标题
作为 <crowd-classifier>
元素的子元素,您必须有三个区域。
<classification-target> - 工作人员将根据在上面
categories
属性中指定的选项进行分类的文本。<full-instructions> - 工具中的“查看完整说明”链接中提供的说明。这可以留空,但建议您提供适当的说明来获得更好的结果。
<short-instructions> - 对于工具栏边栏中显示的任务的更简要说明。这可以留空,但建议您提供适当的说明来获得更好的结果。
此工具的简单版本如下所示。
例 使用 crowd-classifier
您可以复制代码并将其粘贴到 Ground Truth 标注作业创建工作流中的编辑器以预览该工具,或尝试使用 CodePen 上的该代码演示
使用 Liquid 添加自动化
我们的自定义模板系统使用 Liquid
Liquid 的最常见用途是分析来自注释前 Lambda 的数据,并提取相关变量以创建任务。注释前 Lambda 返回的 taskInput
对象将作为模板中的 task.input
对象。
清单的数据对象中的属性将作为 event.dataObject
传递到 注释前 Lambda。简单的传递脚本仅将该对象作为 taskInput
对象返回。您可以将清单中的值表示为变量,如下所示。
例 清单数据对象
{ "source": "This is a sample text for classification", "labels": [ "angry" , "sad" , "happy" , "inconclusive" ], "header": "What emotion is the speaker feeling?" }
例 使用变量的示例 HTML
<crowd-classifier name='tweetFeeling' categories='{{ task.input.labels | to_json }}' header='{{ task.input.header }}' > <classification-target> {{ task.input.source }} </classification-target>
请注意,在上面的 labels
属性中添加了“ | to_json
”。这是一个筛选条件,用于将数组转换为数组的 JSON 表示形式。下一节将介绍变量筛选条件。
以下列表包括两种类型的 Liquid 标签,在自动化模板输入数据的处理时,这些标签可能会非常有用。如果您选择了以下标签类型之一,您将被重定向到 Liquid 文档。
-
控制流
:包括编程逻辑运算符,如 if/else
、unless
和case/when
。 -
迭代
:使您能够使用 for 循环之类的语句重复运行代码块。 有关使用 Liquid 元素创建 for 循环的 HTML 模板示例,请参阅 GitHub 中的 translation-review-and-correction.liquid.html
。
有关更多信息和文档,请访问 Liquid 主页
变量筛选条件
除了标准的 Liquid 筛选条件|
) 字符,然后指定筛选条件名称,以应用筛选条件。筛选条件可以采用以下形式链接起来:
{{ <content> | <filter> | <filter> }}
自动转义和显式转义
默认情况下,输入将进行 HTML 转义,以防止在变量文本和 HTML 之间产生混淆。您可以显式添加 escape
筛选条件,以使其对于正读取正在进行转义的模板源的用户更显而易见。
escape_once
escape_once
可确保您的代码已经转义,而不会再次重新转义。例如,确保 & 不会变为 &amp;。
skip_autoescape
当您的内容要用作 HTML 时,skip_autoescape
很有用。例如,您可能在边界框的完整说明中有一些文本段落和一些图像。
请谨慎使用 skip_autoescape
模板中的最佳实践是避免使用 skip_autoescape
传递功能代码或标记,除非您绝对确信您对正传递的内容具有严格的控制。如果您传递用户输入,就可能使您的工作人员遭受跨站点脚本攻击。
to_json
to_json
将对您提供给 JavaScript 对象表示法 (JSON) 的内容进行编码。如果您向其提供对象,它会对该对象序列化。
grant_read_access
grant_read_access
获取 S3 URI 并将其编码为 HTTPS URL(具有针对该资源的短期访问令牌)。这样,就可以向工作人员显示存储在 S3 存储桶中但原本无法公开访问的照片、音频或视频对象。
例 筛选条件
输入
auto-escape: {{ "Have you read 'James & the Giant Peach'?" }} explicit escape: {{ "Have you read 'James & the Giant Peach'?" | escape }} explicit escape_once: {{ "Have you read 'James & the Giant Peach'?" | escape_once }} skip_autoescape: {{ "Have you read 'James & the Giant Peach'?" | skip_autoescape }} to_json: {{ jsObject | to_json }} grant_read_access: {{ "s3://mybucket/myphoto.png" | grant_read_access }}
输出
auto-escape: Have you read 'James & the Giant Peach'? explicit escape: Have you read 'James & the Giant Peach'? explicit escape_once: Have you read 'James & the Giant Peach'? skip_autoescape: Have you read 'James & the Giant Peach'? to_json: { "point_number": 8, "coords": [ 59, 76 ] } grant_read_access: https://s3.amazonaws.com/mybucket/myphoto.png?
<access token and other params>
例 自动化的分类模板。
要自动执行简单文本分类示例,请将推文文本替换为变量。
文本分类模板如下,添加了自动化功能。更改/添加以粗体突出显示。
前面示例中的推文文本现已替换为一个对象。entry.taskInput
对象使用 source
(或者在注释前 Lambda 中指定的其他名称)作为文本的属性名称,并通过双大括号将其直接插入 HTML 中。
端到端演示
您可以查看下面的端到端演示,其中包括示例 Lambda 函数: