教程:关于使用python和mturk众包ML培训数据的初学者指南

对于许多机器学习项目来说,生成培训数据的最佳方法之一是使用python从AmazonMechanical Turk(mturk)以编程方式将其众包。万博体育网址在本指南中,我们将介绍一个使用Python访问mturk的端到端示例。

本指南不要求熟悉MTURK。为了跟进,您只需要一些关于Python的基本知识。本教程使用python 2,但是在Python3中,原理基本上是相同的。


第1部分:开始

第一,按如下方式设置工具和帐户:

工具

1。蟒蛇-可从以下网址获得:https://www.python.org/下载/

2。匹普-如果安装python,默认情况下应该安装它,但以防万一,更多安装说明如下:https://pip.pypa.io/en/stable/安装/.PIP允许您轻松安装python应用程序。

三。虚拟现实-可以使用PIP安装:

$pip安装virtualenv

您还可以在此处获得更详细的安装说明:https://virtualenv.pypa.io/en/stable/安装/.virtualenv允许您在隔离的环境中轻松地运行python应用程序,从而减少版本冲突和权限问题。

一旦安装了virtualenv,创建要在其中工作的目录,在其中设置并激活virtualenv环境:

$mkdir工作
光盘工作
$virtualenv.
$source bin/激活

4。一旦激活了virtualenv,安装BOT-3,请针对python的官方AWS SDK(我们将使用它访问mturk)和XMLtoDICT,请用于解析XML的简便的python实用程序:

$pip安装boto3
$pip安装xmltodict

账户
为了用python连接到mturk,您需要一个mturk请求者帐户和一个aws帐户(这是两个独立的帐户)。

遵循以下步骤:

  1. 注册一个AWS帐户亚马逊网站
  2. 注册mturk帐户请求者.mturk.com
  3. 转到“开发人员”选项卡(https://requester.mturk.com/developer/开发人员)并将您的AWS帐户链接到您的mturk帐户(该屏幕上的步骤2)
  4. Mturk还有一个沙盒这是mturk市场的测试版本。您可以使用它来测试发布和完成任务,而无需支付任何费用。要使用沙盒,您需要在注册一个沙盒帐户请求者sandbox.mturk.com.然后您还需要将您的AWS帐户链接到您的沙盒帐户请求者和box.mturk.com/developer。

为mturk设置IAM用户
在进行API调用时,您将使用来自您的AWS帐户的凭据来安全地验证您自己的身份。建议的方法是创建一个IAM“用户遵循这些步骤.创建IAM用户后,将其关联的访问密钥和密钥放在手边,以便进行下一步。

连接到mturk沙盒
使用mturk编写代码时,最好从mturk沙盒中检查帐户余额开始。这是“你好世界密特克人的

  1. 回到先前创建的工作文件夹中,通过键入“重新激活virtualenv设置”货源箱/激活”“
  2. 使用任何文本编辑器启动新文件并键入以下内容:
导入BOT-3
mturk_sandbox='https://mturk-requester-sandbox.us-east-1.amazonaws.com'
mturk=boto3.client('mturk',,请
aws_access_key_id=”粘贴你的用户访问键,请,请
aws_secret_access_key=粘贴你的用户密钥,请,请
Region_name='US-East-1',,请
endpoint_url=mturk_沙盒
“打印”我有“美元”+mturk.get_account_balance()['availablebalance']+“在我的沙盒帐户中”“

这里有一些事情需要注意。首先,我们正在创建一个mturk”“客户”使用Boto3 SDK。然后,我们使用客户对mturk进行账户余额调用。您可以看到客户机可以执行的所有可用操作的列表。在这里.

其次,调用boto3.client()函数时,我们在这里使用您的IAM用户访问密钥和密钥。

这允许您验证对mturk的调用。然而,这不是在生产环境中部署代码的推荐方法。最佳做法是将您的凭据存储在本地计算机上的单独文件中,这样他们就不会不经意间与他人分享。

直接嵌入密钥是一种快速的测试方法,但一旦你成功了,就去看看我们的指导方针关于如何最好地管理凭证。

最后,对于mturk,区域名称总是'us-east-1'。

三。将文件另存为“创建“tasks.py”在工作文件夹中

4。从命令行或终端运行文件,方法是键入“Python运行.如果一切顺利,您将看到以下输出:

$I在我的沙盒帐户中有$10000.00

在沙盒中,get_account_balance()调用始终返回10美元,000。为了连接到实时mturk市场,只需像这样省去端点参数:

mturk=boto3.client('mturk',,请
aws_access_key_id=”粘贴你的用户访问键,请,请
aws_secret_access_key=粘贴你的用户密钥,请,请
区域“名称='US-EAST-1'

为您的帐户购买预付点击量
使用沙盒时,您不必担心为您的帐户购买预付点击量。当您准备好将任务发布到Live Marketplace时,您需要先通过访问在您的帐户中购买预付点击量https://requester.mturk.com/账户.

每次发布新任务时,MTURK将从您的预付现金余额中提取。当你接受工人提交的工作时,余额转移给她/他。这可以自动发生,或者,您可以选择查看正在提交的每个任务。如果你拒绝一项任务,工人得不到报酬,亚马逊不收取任何费用。相反,余额将被退回您的帐户。

第2部分:创建任务

现在你可以连接到mturk了,您已准备好开始发布工作人员可以执行的任务。开始,让我们回顾一下一些简单的概念:

工人:工人是指拥有mturk工人帐户的任何人。工人浏览发布在mturk上的任务,可以选择接受任务,完成后再提交。

击中:hit代表“人类智能任务”.命中是你想要完成的单个工作单元。例如,如果要标记100个图像的集合,这些图片中的每一张都可能是一次点击。

工作分配:您可以要求一个或多个工人完成每个点击。每个工人为每次命中提交的工作称为分配。例如,如果有两个工人给你的100张照片贴上标签,每次命中你会得到2个任务,总共200个任务。为什么你会要求不止一个工人完成同一项任务两次?因为您可以比较来自多个人的结果,提高培训数据集的可信度和质量。

定义命中
让我们开始组合新的热门歌曲。将以下内容添加到“创建“tasks.py”以下内容:

question=open(name='questions.xml',模式='r').read()。
new_hit=mturk.create_hit(
title='这条推特快乐吗?生气的,兴奋的,害怕的,生气还是不高兴?',,请
description='阅读此推文并输入一个词来描述发布者的情绪:高兴,生气的,害怕的,烦躁不安',,请
keywords='文本,快,标记,,请
奖励='0.15',,请
最大分配=1,,请
生命周期秒=172800,,请
工作分配持续时间条件=600,,请
自动批准延迟秒=14400,,请
问题=问题,,请
“打印”已创建新的命中率。您可以在此处预览它:““
“打印”“https://workersandbox.mturk.com/mturk/preview?群组=“+新的“hit”[“hit”][“hitGroupID”]
“打印”hitid=“+新的“hit”[“hit”][“hitid”]+“(用于获取结果)“
#发布时请记住修改上面的URL
#点击直播市场。
用途:https://worker.mturk.com/mturk/preview?群组=

让我们来看看这些字段的含义:

标题,描述和关键字:这些将帮助工作人员了解浏览点击时您的任务是什么。关键字有助于提高您在mturk搜索结果中的点击率。

奖励:如果您批准工人提交的工作,您将支付给他们的费用(不包括费用支付给Mturk)。

MaxAssignments:你想在这一次罢工中工作多少工人?

生命周期条件和工作分配持续时间条件:这些可以让您指定希望该命中在市场上可用的时间,以及一个工人在开始命中后必须完成该命中的时间。这两个时间限制都很高,除非你有特定的理由缩短它们。

自动批准延迟秒数:您还可以指定如果不明确批准或拒绝某个工人的工作分配,该工作分配将自动获得批准的时间。尽可能短地保持这一限制。默认情况下,分配将在2天后自动批准。

问题:它包含一个由HTML或XML内容组成的字符串,您可以指定这些内容来定义布局的外观。

在这个例子中,通过读取名为“的文件来填充此字段。”问题:XML我们还没有创造出来。此文件将定义我们的任务对工人的实际外观。下一步我们来看看。

定义任务布局
mturk命中是一个包含简单表单的HTML文档。您可以使用HTML自定义文档的所有内容,CSS和JavaScript。您可以添加任意数量的图像,文本字段,单选按钮,复选框等。您还可以链接到外部资源,如引导程序,jquery或react。您的HTML将在默认高度为600px的iframe中呈现和加载,除非您指定了不同的内容。

在这里,我们会保持简单,并用一个文本字段和一些说明设计布局。创建名为“”的新文件问题:XML并添加以下内容:

            
             
<pre-name=”A68ID=“A68类=graf-graf——前graf后——前”><!--您的HTML开始---<br><!doctype html><br><html><br><head><br><meta http equiv='content-type'content='text/html;charset=utf-8'/><br><script type='text/javascript'src='https://s3.amazonaws.com/mturk public/externalHit_v1.js'><script><br><head><br><body><br><form name='mturk_form'method='post'id='mturk_form'action='//www.us-65.com/mturk/externalSubmit'><input type='hidden'value='name='assignmentid'id='assignmentid'/>='pre><pre name='“4A8F”ID=““4A8F”类=graf-graf——前graf后——前”><h2>这条微博快乐吗?生气的,兴奋的,害怕的,生气还是不高兴?输入一个词来描述信息中的主要情绪。如果不清楚,键入““不清楚”.<h2><pre><pre name=”E2D7ID=“E2D7类=graf-graf——前graf后——前”<H3>推特:我真的很期待下一场海鹰比赛!“<h3><pre><pre name=”“7F8”ID=““7F8”类=graf-graf——前graf后——前”><div><br><input type='text'name='reported ou emotion'placeholder='type in your answer here'><br><div><br><p><input type='submit'id='submitbutton'value='submit'/>.<p><form><pre name='E37ID=“E37类=graf-graf——前graf后——前”><script language='javascript'>turksetassignmentid();<script><pre-name=”BF68”ID=“BF68”类=graf-graf——前graf后——前”><body><html><br><!--您的HTML结尾是“-->.<pre><pre name=”“55 3D”ID=““55 3D”类=graf-graf——前graf后——前”>

           
            
             六百
            

           

为什么这里有XML?发生的是,在发送到mturk之前,您的HTML代码被包装在一个XML对象中。可以使用这个相同的包装器,只使用XML而不使用HTML来定义布局。在那种情况下,mturk api将为您处理您被击中时的外观和感觉,你定制体验的能力是有限的。

为了我们的目的,你可以忽略XML只需关注包装器中的HTML代码。

请注意,重要的是为输入字段提供一个“名称“属性。稍后您将使用它跟踪响应。

保存questions.xml之后,再次尝试运行您的python代码,并在mturk沙盒中看到您的命中率。

正如你可能看到的,这不是一个设计得很好的任务。例如,向员工展示一份情绪列表作为单选按钮或复选框是一个更好的主意,而不是让他们每次都输入。

我们现在就用这个,但是当你创造你的点击量时,值得花时间仔细考虑一下设计。我们的最佳实践指南包含可用于此操作的更多有用提示。

最后,这个问题文件只适用于一次点击。如果你想发布50个点击量,大约50个不同的图片,你会怎么做?你可以把这个文件作为一个字符串来读取,循环浏览50个图像URL的列表,并使用字符串替换将每个URL插入到字符串中,然后再创建命中。你也可以考虑其他一些方法。

运行此代码时,你会得到一个”HITId“当你创建命中。这是一个唯一的ID,您以后可以使用它来获取结果(“作业“)由工人为您的任务提交。让我们看看这是怎么回事。

第3部分:检索结果

创建一个新的python文件,名为“获取“结果.py”并保存到同一工作目录。像你一样设置它”创建“tasks.py”以前的文件,并使用从创建命中点中获得的击球员ID。

导入BOT-3
mturk=boto3.client('mturk',,请
aws_access_key_id=”粘贴你的用户访问键,请,请
aws_secret_access_key=粘贴你的用户密钥,请,请
Region_name='US-East-1',,请
endpoint_url=mturk_沙盒
#您将需要以下库
#帮助分析从mturk提供的XML答案
#在本地环境中安装
#pip安装xmltodict
导入xmltodict
#使用先前创建的点击ID
点击“粘贴”按钮
#我们只向一个工人发布此任务
#因此,如果一个数组已完成,我们将返回一个包含一个项的数组
worker_results=mturk.list_assignments_为_hit(hit id=hit_id,assignmentstatus=[“已提交”])

这将返回一个python字典,如果工人提交了任何作业,它们将显示在一个数组中,并带有键“作业“.每个作业本身就是一个dict,具有以下结构:

{
'assignmentid':'string',,请
'workerid':'string',,请
'hitid':'string',,请
'assignmentstatus':'已提交'|“批准”|'拒绝',,请
“autoApprovalTime”:日期时间(2015,1,1),请
“acceptTime”:日期时间(2015,1,1),请
“SubmitTime”:日期时间(2015,1,1),请
“ApprovalTime”:日期时间(2015,1,1),请
“RejectionTime”:日期时间(2015,1,1),请
“截止日期”:日期时间(2015,1,1),请
“answer”:“字符串”,,请
'requesterfeedback':'string'
}

工人的实际输入存储在回答“字段,它是一个XML字符串。工作者输入的响应需要从字符串中提取。有很多方法可以做到这一点,下面我们向您展示一个选项,使用“XMLtoDICT以前安装的模块。更新您的“获取“结果.py”文件和添加:

如果worker_results['numresults']>0:
对于工作人员分配的结果[“分配”]:
xml_doc=xmltodict.parse(赋值[‘answer’])

“打印”工人的回答是:““
如果类型(xml_doc['questionformanswers']['answer'])是列表:
#命中布局中的多个字段
对于xml_-doc中的answer字段['questionformanswers'][答案]:
“打印”对于输入字段:“+回答域[‘questionidentifier’]
“打印”提交的答案:“+回答域[自由文本]
其他:
#在命中布局中找到一个字段
“打印”对于输入字段:“+XML文档['questionformanswers'][答案][问题标识符]
“打印”提交的答案:“+XML文档['questionformanswers'][答案][自由文本]
其他:
“打印”尚未准备好结果”“

此代码分析“中的字符串回答“字段并将其转换为python dict。在录音机里,question.xml文件中的每个输入字段都可以作为字典使用。每个输入字段的字典都有一个“问题标识符”包含在HTML布局中设置的输入字段名称的键。工人的输入存储在FreeText“关键。如果你的命中率有多个区域,您将得到一个结果数组,它稍微改变了如何解析和检索答案-这反映在代码示例中。

现在你有了一个工人提交的结果,你可以做三件事之一:批准任务,拒绝任务或什么都不做。如果你赞成,工人将获得所提交工作的报酬,并将工作分配标记为已批准。

您还可以选择向工人支付A“奖金这是与任务相关联的奖励金额分开的附加金额。这允许您提供变量,员工绩效奖励。给工人发奖金,使用“mturk.send_bonus()“操作。

如果你拒绝了任务,它将被标记为拒绝,工人将不被支付。拒绝工作时,您必须包括拒绝该任务的原因。一般来说,工人提交的任务只有在工人明显提交恶意结果的情况下(如将所有内容留空,或者反复输入相同的文本)。

如果你什么都不做,分配将在指定时间后自动批准。

第4部分:更多地使用mturk

恭喜你能走这么远!现在,您应该对使用通常使用Python的mturk有了很好的理解。下一步你可以用mturk做很多事情,以下是一些很好的起点:

  1. 完整列表可以在python中使用的操作
  2. 了解资格条件,请您可以使用一种机制将工作目标锁定到满足特定标准的工人(本文使用Ruby示例,但可以很容易地转换为python)。
  3. 在云中使用mturk,请使用AWS lambda:非常适合在生产中部署应用程序,而不是在办公桌下的多尘机器上部署应用程序
  4. 学习如何让mturk工人使用用于注释图像的边界框

如果你有任何问题,请把问题发到我们的姆图克论坛.成为一个请求者,,请在这里注册.想作为员工客户贡献自己的力量吗??从这里开始.

响应
作者选择了不显示对这个故事的回应。您仍然可以通过单击响应气泡来响应。