教程:mturk在jupyter笔记本中使用python

ipython笔记本是数据科学家在Jupyter笔记本界面中分析数据和训练机器学习模型的强大工具。In this tutorial we'll explain how to use MTurk to annotate training data,全部来自Jupyter应用程序。要快速开始,您可以下载notebookHTMLfor this tutorial.

Jupyter笔记本设置

Jupyter Notebook是一个开源的Web应用程序,允许您创建和共享包含实时代码的文档,方程,形象化和叙事文本。它是从伊普利森计划中诞生的,虽然它仍然最常用于python,它支持40多种语言,包括R,茱莉亚,还有斯卡拉。

开始使用Jupyter的最简单方法是安装蟒蛇分布of Python 3.x.This includes Python,Jupyter Notebook,以及其他一些有用的软件包。If you don't want to install Anaconda,can follow the directions to install Jupyter using pip在这里.

一旦你安装了Jupyter,只需运行命令Jupyter笔记本from the Terminal or Command Prompt in the directory where you want to store your notebooks and assets.这将在您的计算机上启动Jupyter并打开一个Web浏览器窗口。

如果您在存储示例笔记本和HTML的同一目录中打开jupyter,您将在列表中看到这些文件。

在每个笔记本中,您都可以定义单元格。When working in Python the most common are代码降价.代码单元是放置要运行的python代码的地方,标记单元用于提供代码的描述和正在执行的步骤。

要运行代码单元,您可以选择单元格,然后选择“运行单元格”按钮或控制“回车”来执行它。该单元格中代码步骤的任何输出都将显示在该单元格的下方。

Account Setup

如果你还没有,you'll need to setup MTurk and AWS accounts that are linked together to use MTurk with Python.mturk帐户将用于向mturk群发布任务,而aws帐户将用于通过api连接mturk,并提供执行任务所需的任何其他aws资源的访问权限。

  1. 如果你还没有AWS账户,visit网址:https://aws.amazon.com并创建一个可用于项目的帐户。
  2. 如果您还没有mturk请求者帐户,visithttps://requester.mturk.com网站并创建一个新帐户。

设置好帐户后,you will need to link them together.当同时登录到您的aws帐户和mturk帐户的根目录时,visithttps://requester.mturk.com/developer/开发人员把他们联系在一起。

配置配置文件

要调用mturk,您需要将计算机配置为具有正确凭据的配置文件。开始,创建一个新的AWS IAM用户或选择一个您计划使用的现有用户。Add theAmazonMechanicalTurkFullAccess对用户的策略。然后选择安全凭据选项卡并创建新的访问密钥,复制访问密钥和秘密访问密钥以备将来使用。

使用此帐户配置计算机的最简单方法是安装AWS命令行界面(CLI)。You can install this from the command line by typingPIP安装awscli.安装后,您可以运行AWS配置——配置文件mturk配置一个姆图克调用API时将使用的计算机配置文件。提示时,提供上面捕获的访问密钥ID和秘密访问密钥ID。对于一个地区,您可以输入“us-east-1"并将输出格式保留为“无”。

PIP安装awscli
AWS配置——配置文件mturk

More libraries to install

作为最后一步,我们将安装boto3和xmltodict库。boto3包是一个易于使用的python库,用于访问AWS。xmltodict库使处理返回mturk的XML数据更加容易。

pip安装boto3
pip安装xmltodict

Getting Started in Jupyter

既然我们已经安装了所有必要的工具,we can get started with our first notebook.首先在Jupyter中创建一个新的python 3笔记本,或者打开之前下载的示例笔记本。

首先我们要进口Boto3,xmltodict,以及JSON包。

进口BOTO3
导入xmltodict
导入JSON

Next we'll create an MTurk client we'll use to make requests.mturk有两个您可以工作的环境。生产环境用于发布希望工人完成的任务。沙盒是一个测试环境,您可以在将任务发布给工作人员之前使用它来测试任务。使用沙盒没有成本,但因为manbetx官方网站登录它只用于测试,张贴在那里的项目将不会完成,除非你自己完成它们。

下面的代码将根据在生产中创建“点击”.请注意,在阶段变量如下:我们引用了姆图克以前创建的配置文件。如果使用违约profile.

在生产中创建\命中\错误
环境=
“生产”:{
“端点:"“https://mturk-requester.us-east-1.amazonaws.com“,,
“preview":"“//www.us-65.com/mturk/preview/预览““
,,
“沙盒:{
“端点:
““https://mturk-requester-sandbox.us-east-1.amazonaws.com网站“,,
“preview":"“https://workersandbox.mturk.com/mturk/preview/预览““
,,
}
mturk_environment = environments["生产”]如果在其他生产环境中创建“命中”沙盒]
session=boto3.session(profile_name='mturk')
client = session.client(
服务名='mturk',,
Region_name='US-East-1',,
endpoint_url=mturk_environment['endpoint'],,
)

一旦你创建了你的客户,你就可以通过获取你当前的mturk账户余额来检查它的设置是否正确。请注意,在沙盒环境中,您的余额始终为10美元,000。

print(client.get_account_balance()['AvailableBalance'])

定义您的任务

对于这个项目,我们将得到一组推特的感想,我们计划训练一个模型来评估。We will create an MTurk Human Intelligence Task (HIT) for each tweet and assign each tweet to five Workers so we can correct for bias and quality.

tweets=[在科学课上…呃…愚蠢的计划……,
'hmmm what to have for breaky?……Honey on toast ',,
'Doing home work x',,
离开镇上几天。Will miss my girls']

To submit tasks to MTurk you need to create an HTML template that will be shown to Workers for each item.您可以使用先前下载的HTML模板,也可以通过从Jupyter主页选择New->Text File在Jupyter中创建模板。

我们可以将此文件重命名为motionquestion.html,并从示例开始。

您可能已经注意到,在这个HTML中间是对一个名为content.我们要换这个$ {内容}当我们发布任务时,每个tweet的变量。

$ {内容}

现在我们可以从文件中读取这个HTML,并使用mturk所需的问题布局XML对其进行包装。我们用这个问题XML稍后变量。

html_layout = open('./SentimentQuestion.html',“r”
问题_xml=““““ http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchemas/2011-11-11/HTMLQuestion.xsd“>
{}
650个
““““
question_xml=question_xml.format(html_layout)

在最后的设置步骤中,我们将定义将应用于每个命中的属性。如上所述,对于每项任务,我们将有五名员工审查每一条推文。We specify this in the definition below as well as parameters indicating that the HIT remain live on the worker.mturk.com website for no more than an hour,工人们在不到十分钟的时间内对每一个项目作出反应。Each response has a reward of $0.05 so the total Worker reward for this task would be $0.25 plus $0.05 in MTurk fees.An appropriate title,说明,还提供关键字,让工人了解此任务涉及的内容。

taskAttributes=_
“maxassignments”:5,,
任务在MTURK上可用的时间(1小时)
“LifeTimeInSeconds”:60*60,,
工人完成每个项目需要多长时间(10分钟)
'AssignmentDurationInSeconds': 60*10,,
您将为员工提供的每项回应的奖励
'Reward': '0.05',,
“标题”:“为推特提供情感”,,
'Keywords': 'sentiment,鸣叫,,
“描述”:“以1到10的比例评价微博的情绪。”
}

Create your tasks

现在我们准备将这些任务发布到mturk,以便工人查看和完成它们。首先,我们将创建一个结果array to contain information about each HIT we submit.我们还将创建一个变量来包含为此任务生成的命中类型的ID。Then we'll loop through each tweet in the set and create a HIT using the attributes we defined earlier and the问题XMLwe created.注意,我们正在替换内容variable the tweet.我们将把生成的tweet和hit id附加到results变量中。The last step is to return a link to the HITs so you can view them on thehttps://worker.mturk.com网站orhttps://workersandbox.mturk.com网站.

结果=[]
点击“类型”
对于tweet中的tweet:
response=client.create_hit(
* * TaskAttributes,,
question=question_xml.replace('$content',鸣叫)
)
hit_type_id=response['hit']['hit type id']
结果。附加(
'tweet': tweet,,
“hit_id”:响应[“hit”][“hit id”]
})

打印(“You can view the HITs here:")
打印(mturk_环境[“预览”]+“?groupid=”.format(点击类型)

获取结果

Depending on the task,结果将在几分钟到几小时内提供。In Jupyter we can run the the following to retrieve the status of each HIT and the responses that have been provided by Workers.因为我们只是更新结果数组,我们可以尽可能频繁地运行它,直到点击完成以获得任务的状态。

对于结果数组中的每个项,我们执行以下步骤:

  1. 获取命中的当前状态并将其存储在结果数组中。
  2. 获取每个项目已完成的工作分配列表,并将已完成的工作分配计数存储到结果数组中。
  3. Loop through each Assignment and capture the details of the Assignment and the results to an array of answers.
  4. 批准每项任务,以便将0.05美元的奖励分配给工人。
  5. Store the answers in the results array and compute an average response for the item.
对于结果中的项:

获取命中的状态
hit=client.get_hit(hit id=item['hit_id'])
项目['status']=点击['hit']['hit status']
获取已提交作业的列表
assignments list=client.list_assignments_for_hit(
hit id=项目[‘hit_id’],,
AssignmentStatuses=['Submitted','Approved'],,
MaxResults=10
)
工作分配=工作分配列表[“工作分配”]
item['assignments_submitted_count'] = len(assignments)
answers = []
对于分配中的分配:

检索每个分配的属性
worker_id=分配['worker id']
assignment_id = assignment['AssignmentId']

从XML中检索工作人员提交的值
answer_dict=xmltodict.parse(赋值[“answer”])
answer=answer'dict['questionformanswers']['answer']['freetext']
answers.append(int(answer))。

批准分配(如果尚未批准)
如果分配['assignmentstatus']='已提交':
客户端。批准分配(
assignmentID=分配ID,,
overriderejection=false
)

添加已为此项目检索到的答案
item['answers'] = answers
如果len(答案)>0:
项目['avg_answer']=总和(答案)/len(答案)
打印(json.dumps(结果,indent=2))

在任务结束时,我们将得到一个完整的结果数组,然后您可以使用它来进一步培训模型或流程。

[
{
“鸣叫:"在科学课上…呃…愚蠢的计划……,,
“点击“ID”:"3SU800BH87Y9GXNK9PUO0R56NK3UQ6",,
“地位:"可审查”,,
“assignments_submitted_count":5,,
“答案”:
2个,,
2个,,
1,,
4,,

],,
“平均答案:2.2
,,
{
“鸣叫:"嗯,早餐吃什么?……蜂蜜吐司”,,
“点击“ID”:"3ylpj8oxx9ju8wugxyyhv35la2x4j“,,
“地位:"可审查”,,
“assignments_submitted_count":5,,
“答案”:
7,,
5个,,
8,,
7,,

],,
“平均答案:6.6条
,,
{
“鸣叫:"在家工作X”,,
“点击“ID”:"3VZYA8PITP447PS6RQS1D9M8BZD502",,
“地位:"可审查”,,
“assignments_submitted_count":5,,
“答案”:
7,,
5个,,
8,,
5个,,
5个
],,
“平均答案: 6.0
,,
{
“鸣叫:"离开镇上几天。会想念我的女儿的”,,
“点击“ID”:"3uliz0h1vb4eedon9w1re5igrj515英寸,,
“地位:"可审查”,,
“assignments_submitted_count":5,,
“答案”:
8,,
4,,
5个,,
5个,,

],,
“平均答案:5.6
}
]