def getHITType(): # Changing this will add another hit type and might mess up later fetches... # Only change if you know what you are doing... _mtc = MTurkConnection(host=_host) _title = "Guess the Closest Part of a Person!" _description = "Help us find out which body part of a person is closest to the camera that took the picture." _keywords = "person, people, image, images, object, objects, depth, comparisons, human3.6m" _reward = _mtc.get_price_as_price(0.1) _duration = 60 * 15 _approval_delay = 60 * 60 * 24 * 10 _qualifications = Qualifications() _qualifications.add( PercentAssignmentsApprovedRequirement('GreaterThanOrEqualTo', 98, required_to_preview=True)) _qualifications.add( NumberHitsApprovedRequirement('GreaterThanOrEqualTo', 100, required_to_preview=True)) _qualifications.add( LocaleRequirement('EqualTo', 'US', required_to_preview=True)) return _mtc.register_hit_type(title=_title, description=_description, reward=_reward, duration=_duration, keywords=_keywords, approval_delay=_approval_delay, qual_req=_qualifications)
class Production(Config): DEBUG = False DEVELOPMENT = False TESTING = False MTURK_HOST = 'mechanicalturk.amazonaws.com' MTURK_EXTERNAL_SUBMIT = 'https://www.mturk.com/mturk/externalSubmit' QUALIFICATIONS = Qualifications([ NumberHitsApprovedRequirement('GreaterThan', 500), PercentAssignmentsApprovedRequirement('GreaterThan', 95), LocaleRequirement('EqualTo', 'US') ]) CELERYBEAT_SCHEDULE = { 'delete_temp_files': { 'task': 'delete_temp_files', 'schedule': timedelta(seconds=86400), 'args': () }, 'run_gather': { 'task': 'run_gather', 'schedule': timedelta(seconds=60), 'args': () }, } TACKBP_NW_09_CORPUS_URL = 'https://s3-us-west-2.amazonaws.com/tac-kbp-2009/sentences.meta-sentencesonly-no-liu-et-al-naacl2016-test-set-270k'
def getHITType(): # Changing this will add another hit type and might mess up later fetches... # Only change if you know what you are doing... _mtc = MTurkConnection(host=_host) _title = "Select Person-Object Interactions in Images" _description = "Please click on all the objects (or other people) that the highlighted person is interacting with." _reward = _mtc.get_price_as_price(0.10) _duration = 60 * 10 _keywords = "person, people, image, images, object, objects, actions, interactions" _approval_delay = 60 * 60 * 24 * 5 _qualifications = Qualifications() _qualifications.add( PercentAssignmentsApprovedRequirement('GreaterThanOrEqualTo', 98, required_to_preview=True)) _qualifications.add( NumberHitsApprovedRequirement('GreaterThanOrEqualTo', 100, required_to_preview=True)) _qualifications.add( LocaleRequirement('EqualTo', 'US', required_to_preview=True)) return _mtc.register_hit_type(title=_title, description=_description, reward=_reward, duration=_duration, keywords=_keywords, approval_delay=_approval_delay, qual_req=_qualifications)
def send_task(self): if self.osm_from is not None and self.osm_to is not None and self.reference is not None: title = 'Find the corresponding product' description = ('Select the most appropriate answer') keywords = 'images, selecting, products, matching, match, selection' self.save_task() question = ExternalQuestion( 'http://www.dalliz.com/mturk/key/%s' % (self.key), 1106) qualifications = Qualifications() qualifications.add( PercentAssignmentsApprovedRequirement('GreaterThanOrEqualTo', 95)) #--------------- CREATE THE HIT ------------------- a = self.mtc.create_hit( question=question, title=title, description=description, keywords=keywords, reward=0.01, max_assignments=10, approval_delay=datetime.timedelta(seconds=3600 * 24 * 30), # auto-approve timeout duration=datetime.timedelta(seconds=3600 * 24 * 30))
def configure_hit(self, hit_config): # configure question_url based on the id experimentPortalURL = hit_config['ad_location'] frameheight = 600 mturkQuestion = ExternalQuestion(experimentPortalURL, frameheight) # Qualification: quals = Qualifications() approve_requirement = hit_config['approve_requirement'] quals.add( PercentAssignmentsApprovedRequirement("GreaterThanOrEqualTo", approve_requirement)) if hit_config['us_only']: quals.add(LocaleRequirement("EqualTo", "US")) # Specify all the HIT parameters self.paramdict = dict(hit_type=None, question=mturkQuestion, lifetime=hit_config['lifetime'], max_assignments=hit_config['max_assignments'], title=hit_config['title'], description=hit_config['description'], keywords=hit_config['keywords'], reward=hit_config['reward'], duration=hit_config['duration'], approval_delay=None, questions=None, qualifications=quals)
def build_hit_qualifications(self, approve_requirement, restrict_to_usa, blacklist): """Translate restrictions/qualifications to boto Qualifications objects @blacklist is a list of names for Qualifications workers must not already hold in order to see and accept the HIT. """ quals = Qualifications() quals.add( PercentAssignmentsApprovedRequirement("GreaterThanOrEqualTo", approve_requirement)) if restrict_to_usa: quals.add(LocaleRequirement("EqualTo", "US")) if blacklist is not None: for item in blacklist: qtype = self.get_qualification_type_by_name(item) if qtype: quals.add( Requirement(qtype['id'], "DoesNotExist", required_to_preview=True)) return quals
def _mturk_system_qualifications(qualification): requirements = [] for item in qualification.items.all(): if item.expression['attribute'] not in [ 'location', 'approval_rate', 'total_tasks' ]: continue requirement = None if item.expression['attribute'] == 'location': op = OP_IN if item.expression['operator'] == 'in' else OP_NOT_IN requirement = MultiLocaleRequirement(op, [ val.strip() for val in item.expression['value'] if val is not None and val != '' ]) elif item.expression['attribute'] == 'approval_rate': op = OP_GT if item.expression['operator'] == 'gt' else OP_LT requirement = PercentAssignmentsApprovedRequirement( op, item.expression['value']) elif item.expression['attribute'] == 'total_tasks': op = OP_GT if item.expression['operator'] == 'gt' else OP_LT requirement = NumberHitsApprovedRequirement( op, item.expression['value']) requirements.append(requirement) return requirements
def configure_hit(self): # Configure portal experimentPortalURL = self.config.get('HIT Configuration', 'question_url') frameheight = 600 mturkQuestion = ExternalQuestion(experimentPortalURL, frameheight) # Qualification: quals = Qualifications() approve_requirement = self.config.get('HIT Configuration', 'Approve_Requirement') quals.add( PercentAssignmentsApprovedRequirement("GreaterThanOrEqualTo", approve_requirement)) if self.config.getboolean('HIT Configuration', 'US_only'): quals.add(LocaleRequirement("EqualTo", "US")) # Specify all the HIT parameters self.paramdict = dict( hit_type = None, question = mturkQuestion, lifetime = datetime.timedelta(hours=self.config.getfloat('HIT Configuration', 'HIT_lifetime')), max_assignments = self.config.getint('HIT Configuration', 'max_assignments'), title = self.config.get('HIT Configuration', 'title'), description = self.config.get('HIT Configuration', 'description'), keywords = self.config.get('HIT Configuration', 'keywords'), reward = self.config.getfloat('HIT Configuration', 'reward'), duration = datetime.timedelta(hours=self.config.getfloat('HIT Configuration', 'duration')), approval_delay = None, questions = None, qualifications = quals )
def configure_hit(self, hit_config): ''' Configure HIT ''' # configure question_url based on the id experiment_portal_url = hit_config['ad_location'] frame_height = 600 mturk_question = ExternalQuestion(experiment_portal_url, frame_height) # Qualification: quals = Qualifications() approve_requirement = hit_config['approve_requirement'] quals.add( PercentAssignmentsApprovedRequirement("GreaterThanOrEqualTo", approve_requirement)) if hit_config['us_only']: quals.add(LocaleRequirement("EqualTo", "US")) # Create a HIT type for this HIT. hit_type = self.mtc.register_hit_type(hit_config['title'], hit_config['description'], hit_config['reward'], hit_config['duration'], keywords=hit_config['keywords'], approval_delay=None, qual_req=quals)[0] # Check the config file to see if notifications are wanted. config = PsiturkConfig() config.load_config() try: url = config.get('Server Parameters', 'notification_url') all_event_types = [ "AssignmentAccepted", "AssignmentAbandoned", "AssignmentReturned", "AssignmentSubmitted", "HITReviewable", "HITExpired", ] self.mtc.set_rest_notification(hit_type.HITTypeId, url, event_types=all_event_types) except: pass # Specify all the HIT parameters self.param_dict = dict(hit_type=hit_type.HITTypeId, question=mturk_question, lifetime=hit_config['lifetime'], max_assignments=hit_config['max_assignments'], questions=None, response_groups=[ 'Minimal', 'HITDetail', 'HITQuestion', 'HITAssignmentSummary' ])
def create_hit(hit_options): """ Create a new HIT on AMT. `hit_options` is a dictionary that can contain: * `title`: The title that will show up in AMT's HIT listings * `description`: The description that will show up in AMT's HIT listings * `reward`: A float containing the number of cents to pay for each assignment * `duration`: The expected amount of time a worker should spend on each assignment, in minutes * `num_responses`: The number of responses to get for the HIT * `frame_height`: The height of the iframe in which workers will see the assignment * `use_https`: whether or not to load assignment in AMT's iframe using HTTPS. Strongly recommended to be True By default, options are loaded from `settings.AMT_DEFAULT_HIT_OPTIONS`. """ options = settings.AMT_DEFAULT_HIT_OPTIONS options.update(hit_options) scheme = 'https' if options['use_https'] else 'http' from interface import AMT_INTERFACE path = AMT_INTERFACE.get_assignment_url() url = (scheme + '://' + settings.PUBLIC_IP + ':8000' + path if settings.HAVE_PUBLIC_IP else scheme + '://' + settings.AMT_CALLBACK_HOST + path) question = ExternalQuestion(external_url=url, frame_height=options['frame_height']) qualifications = Qualifications(requirements=[ PercentAssignmentsApprovedRequirement( 'GreaterThanOrEqualTo', 85, required_to_preview=True), ]) conn = get_amt_connection(options['sandbox']) try: create_response = conn.create_hit( question=question, title=options['title'], description=options['description'], reward=Price(amount=options['reward']), duration=timedelta(minutes=options['duration']), max_assignments=options['num_responses'], approval_delay=3600, qualifications=qualifications) except MTurkRequestError: logger.debug(traceback.format_exc()) raise AMTException(""" Could not reach Amazon Mechanical Turk. Check that you are using https mode, and defined a valid assignment. Details of the exception have been logged to the ampcrowd server. """) return create_response[0].HITId
def publish_hit(credentials, isSandbox, ename, num_hits, lvlset, adminToken, db, mode, no_ifs, individual, with_new_var_powerup, mc=None, email=None, maxlvls=None, colSwap=False, replay=False): title = "Play a Math Puzzle Game For Science!" max_assignments = 1 keywords = "game, math, programming" description = \ """ NOTE: PLEASE DON'T ACCEPT MORE THAN ONE HIT AT A TIME! First finish your current HIT before looking for others!\n """ + \ """Help us evaluate our verification game InvGen! Each level is structured as a math puzzle, where you try to come up with correct expressions. Your work directly helps with the verification of programs! This HIT involves playing at least two non-tutorial levels of our game. Played it before? Come play again! You will bypass the tutorial and get new levels! New player? Come try it out! We aim to pay about $10/hr. More specifically: (a) $1.50 for the HIT, which involves playing the game for at least 2 non-tutorial levels (b) $1.50 bonus for doing the tutorial, which you only do the first time (c) $0.75 bonus for each non-tutorial level you pass beyond two.""" mastersQualType = "2ARFPLSP75KLA8M8DH1HTEQVJT3SY6" if isSandbox else \ "2F1QJWKUDD8XADTFD2Q0G6UTO95ALH" quals = [] if isSandbox else\ [ NumberHitsApprovedRequirement("GreaterThanOrEqualTo", 1000), PercentAssignmentsApprovedRequirement("GreaterThanOrEqualTo", 97), Requirement(mastersQualType, "Exists") ] if mc is None: mc = connect(credentials, isSandbox) balance = mc.get_account_balance() print("Balance:", balance[0]) exp = Experiment(ename, True) print("Running under experiment", ename) for i in range(num_hits): port = get_unused_port() srid = exp.create_unique_server_run_id() p = start_server(port, ename, srid, lvlset, adminToken, db, email, maxlvls, colSwap, replay) print("Started server run", srid, "on port", port, "with pid", p.pid) start_url =\ "https://zoidberg.ucsd.edu:{0}/mturk_landing.html?mode=" + mode if (no_ifs): start_url += "&noifs" if individual: start_url += "&individual=1" if with_new_var_powerup: start_url += "&nvpower=1" q = ExternalQuestion(start_url.format(port), 1024) kind = "ExternalQuestion" r = mc.create_hit(question=q, lifetime=timedelta(7), max_assignments=max_assignments, title=title, description=description, keywords=keywords, reward=HIT_REWARD, duration=timedelta(0, 45*60), qualifications=Qualifications(quals)) assert len(r) == 1 print("Created", kind, "HIT", r[0].HITId) exp.add_session(ServerRun(srid, r[0].HITId, p.pid, port)) return exp
def test(): q = ExternalQuestion(external_url="http://websort.net/s/F3481C", frame_height=800) conn = MTurkConnection(host='mechanicalturk.sandbox.amazonaws.com') keywords=['boto', 'test', 'doctest'] qualifications = Qualifications() qualifications.add(PercentAssignmentsApprovedRequirement(comparator="GreaterThan", integer_value="95")) create_hit_rs = conn.create_hit(question=q, lifetime=60*65, max_assignments=2, title="Boto External Question Test", keywords=keywords, reward = 0.05, duration=60*6, approval_delay=60*60, annotation='An annotation from boto external question test', qualifications=qualifications) assert(create_hit_rs.status == True) print create_hit_rs.HITTypeId
def create_hit(url=None, title=None, description=None, keywords=None, reward_amount=None, max_assignments=None, duration_in_minutes=None, lifetime_in_days=None, approval_delay_in_days=None, qualification_percent_approved=None, qualification_hits_approved=None): url = url or "https://squadtest.herokuapp.com/" title = title or "Compare 100 sets of 2 Instagram posts to guess which performed better (<10 minutes)" description = description or "This HIT will take at most 15 minutes (usually much less). If you have a problem with the HIT, message us so we can fix it!" keywords = keywords or [ "easy", "survey", "study", "bonus", "image", "images", "compare", "comparisons", "collection", "data", "research", "listings", "simple", "photo", "answer", "opinion", "question" ] frame_height = 800 reward_amount = reward_amount or 1 max_assignments = max_assignments or 200 duration_in_minutes = duration_in_minutes or 20 duration = datetime.timedelta(minutes=duration_in_minutes) lifetime_in_days = lifetime_in_days or 3 lifetime = datetime.timedelta(days=3) approval_delay_in_days = approval_delay_in_days or 5 approval_delay = datetime.timedelta(days=approval_delay_in_days) qualification_percent_approved = qualification_percent_approved or 95 q1 = PercentAssignmentsApprovedRequirement('GreaterThan', qualification_percent_approved) qualification_hits_approved = qualification_hits_approved or 500 q2 = NumberHitsApprovedRequirement('GreaterThan', qualification_hits_approved) qualifications = Qualifications([q1, q2]) questionform = ExternalQuestion(url, frame_height) result = connection.create_hit(title=title, description=description, keywords=keywords, max_assignments=max_assignments, question=questionform, reward=Price(amount=reward_amount), response_groups=('Minimal', 'HITDetail', 'HITQuestion', 'HITAssignmentSummary'), lifetime=lifetime, duration=duration, approval_delay=approval_delay, qualifications=qualifications) print result
def build_hit_qualifications(self, approve_requirement, restrict_to_usa): """Translate restrictions/qualifications to boto Qualifications objects""" quals = Qualifications() quals.add( PercentAssignmentsApprovedRequirement("GreaterThanOrEqualTo", approve_requirement)) if restrict_to_usa: quals.add(LocaleRequirement("EqualTo", "US")) return quals
def get_qualifications(self): requirements = [] approved_hits = NumberHitsApprovedRequirement('GreaterThan', self.min_hits) percentage_approved = PercentAssignmentsApprovedRequirement( 'GreaterThanOrEqualTo', 97) locale = MultiLocaleRequirement('In', self.countries) requirements.append(locale) requirements.append(approved_hits) requirements.append(percentage_approved) return Qualifications(requirements)
def register_hit(self, configuration=None): """ Register a hit on Mechanical Turk according to `hit_params`. This will provide you with a HITTypeId. Parameters ---------- configuration : dict Returns ------- str The HITTypeId which is how you refer to your newly registered hit with Amazon """ if configuration is None: configuration = app.config qualifications = Qualifications() if self.debug: qualifications.add( NumberHitsApprovedRequirement('GreaterThanOrEqualTo', 0)) qualifications.add( PercentAssignmentsApprovedRequirement('GreaterThanOrEqualTo', 0)) else: qualifications.add( NumberHitsApprovedRequirement( 'GreaterThanOrEqualTo', configuration['MTURK_NUMBER_HITS_APPROVED_REQUIREMENT'])) qualifications.add( PercentAssignmentsApprovedRequirement( 'GreaterThanOrEqualTo', configuration[ 'MTURK_PERCENT_ASSIGNMENTS_APPROVED_REQUIREMENT'])) hit_type = self.connection.register_hit_type( configuration['MTURK_TITLE'], configuration['MTURK_DESCRIPTION'], Price(configuration['MTURK_REWARD']), configuration['MTURK_ASSIGNMENT_DURATION_IN_SECONDS'], configuration['MTURK_KEYWORDS'], configuration['MTURK_AUTO_APPROVAL_DELAY_IN_SECONDS'], qualifications) return hit_type[0].HITTypeId
def get_requirement(qualification_type_id): """ Function to set the requirements. This is optional. :return: list """ qualifications = Qualifications() qualifications.add( PercentAssignmentsApprovedRequirement(comparator="GreaterThan", integer_value="90")) qualifications.add(LocaleRequirement("EqualTo", "US")) # qualifications.add(Requirement(qualification_type_id=qualification_type_id, comparator="EqualTo", integer_value="1")) return qualifications
def get_qualifications(prod): qualifications = Qualifications() if args.prod: qualifications.add( PercentAssignmentsApprovedRequirement(comparator="GreaterThan", integer_value=str(95))) qualifications.add( NumberHitsApprovedRequirement(comparator="GreaterThan", integer_value=str(500))) # these location constraints are potentially useful # qualifications.add(LocaleRequirement(comparator="NotEqualTo", locale="your country code", required_to_preview=True)) # qualifications.add(LocaleRequirement(comparator="EqualTo", locale="your country code", required_to_preview=True)) return qualifications
def createQualifications(sandbox): qualifications = Qualifications() if sandbox: MastersQualID = '2F1KVCNHMVHV8E9PBUB2A4J79LU20F' else: MastersQualID = '2NDP2L92HECWY8NS8H3CK0CP5L9GHO' #qualifications.add(Requirement(MastersQualID,'DoesNotExist',required_to_preview=True)) qualifications.add( PercentAssignmentsApprovedRequirement('GreaterThanOrEqualTo', 90, True)) qualifications.add( NumberHitsApprovedRequirement('GreaterThanOrEqualTo', 100, True)) return qualifications
def createQualifications(sandbox, qualificationIDs): qualifications = Qualifications() for qualification_id in qualificationIDs[:8]: qualifications.add( Requirement(qualification_id, 'DoesNotExist', required_to_preview=True)) qualifications.add( PercentAssignmentsApprovedRequirement('GreaterThanOrEqualTo', 90, True)) qualifications.add( NumberHitsApprovedRequirement('GreaterThanOrEqualTo', 100, True)) #100 return qualifications
def build_qualifications(locales=None): """ Creates a single qualification that workers have a > 95% acceptance rate. :return: boto qualification obj. """ qualifications = Qualifications() requirements = [ PercentAssignmentsApprovedRequirement(comparator="GreaterThan", integer_value="95") ] if locales: loc_req = LocaleRequirement(comparator='In', locale=locales) requirements.append(loc_req) _ = [qualifications.add(req) for req in requirements] return qualifications
def update_hit(settings): global hit hit_quals = Qualifications() old_hit_type_id = hit["type_id"] settings_quals = settings["qualifications"] ## TODO: master worker, custom quals, utility for creating qualifications? if (settings_quals): if settings_quals["location"]: hit_quals.add( LocaleRequirement("EqualTo", settings_quals["location"])) if settings_quals["approval_percentage"]: hit_quals.add( PercentAssignmentsApprovedRequirement( "GreaterThanOrEqualTo", settings_quals["approval_percentage"])) request_settings = dict( title=settings["title"], description=settings["description"], keywords=settings["keywords"], reward=settings["reward"], approval_delay=timedelta(seconds=settings["auto_approval_delay"]), duration=timedelta(seconds=settings["assignment_duration"]), qual_req=hit_quals) try: new_hit_type_id = mtc.register_hit_type( **request_settings)[0].HITTypeId if new_hit_type_id == old_hit_type_id: prints("Settings haven't changed; not updating") sys.exit(1) change_existing_hit_type_result = mtc.change_hit_type_of_hit( hit["id"], new_hit_type_id) except MTurkRequestError as e: print("Error\n") pp(e.__dict__) hit_modes[mode]["type_id"] = new_hit_type_id ## write new_hit_type_id to hit_modes.json with open("hit_modes.json", 'w') as f: json.dump(hit_modes, f, indent=4, separators=(',', ': ')) prints("Updated from type:", old_hit_type_id, "to type:", new_hit_type_id)
def add_session_qualifications(qualifications, session): """Add all qualifications relevant to a session. Create the qualifications as necessary.""" qualifications.add( PercentAssignmentsApprovedRequirement(comparator="GreaterThan", integer_value="90")) force_create = False for q in session.mturk_qualification.all(): if q.mt_qual_id is None or q.mt_qual_id == "" or force_create: create_qualification_internal(session, q) req = Requirement(qualification_type_id=q.mt_qual_id, comparator=q.comparator, integer_value=q.value, required_to_preview=False) qualifications.add(req) return qualifications
def createSeveralHits(numberOfSubjects): # HOST = 'mechanicalturk.sandbox.amazonaws.com' # HOST = 'mechanicalturk.amazonaws.com' global connection global layoutID url = 'THE LINK TO THE STUDY' title = "TITLE OF THE STUDY" description = "DESCRIPTION OF THE STUDY" keywords = ["KEYWORDS"] amount = 0.4 # game = ExternalQuestion(url, frame_height) remaining = numberOfSubjects create_hit_result = None timestr = time.strftime("%Y%m%d-%H%M%S") myfile=open("./HITIDs/"+timestr + '.txt', 'w') # Saves all the created hits under HITIDS. The name of the file is based on the date and time of creation. ####Setting Worker Requirements: workerRequirements=Qualifications() req1= PercentAssignmentsApprovedRequirement(comparator = "GreaterThan", integer_value = "96",required_to_preview=True) workerRequirements.add(req1) req2= LocaleRequirement(comparator = "EqualTo",locale ="US",required_to_preview=True) workerRequirements.add(req2) req3=NumberHitsApprovedRequirement(comparator = "GreaterThan", integer_value = "50",required_to_preview=True) workerRequirements.add(req3) while remaining>0: no_assignments = min(9, remaining) create_hit_result = connection.create_hit( title=title, description=description, keywords=keywords, max_assignments=no_assignments, hit_layout=layoutID, lifetime=6*60*60, duration=3*60*60, approval_delay=3*60*60*24, reward=Price(amount=amount), qualifications=workerRequirements) remaining -= no_assignments myfile.write(create_hit_result[0].HITId+"\n") print "No. Assignments: ", no_assignments print "Results:", create_hit_result print "hit ID:", create_hit_result[0].HITId
def submit_hit(self, urls, title, description, keywords=None, duration=datetime.timedelta(seconds=300), amount=0.0, response_groups=('Minimal', 'HITDetail'), num_assignments=5): quals = Qualifications() #mturk workers with high apporval in the US. approve_requirement = 95 quals.add( PercentAssignmentsApprovedRequirement("GreaterThanOrEqualTo", approve_requirement)) quals.add(LocaleRequirement("EqualTo", "US")) hit_type = self.mturk.register_hit_type( title, description, boto.mturk.price.Price(amount=amount), duration, keywords, qual_req=quals, approval_delay=datetime.timedelta(seconds=100000)) for requirement in quals.requirements: requirement.required_to_preview = True for url in urls: try: questionform = boto.mturk.question.ExternalQuestion( url, self.frame_height) create_hit_result = self.mturk.create_hit( hit_type=hit_type[0].HITTypeId, question=questionform, max_assignments=num_assignments, response_groups=('Minimal', 'HITDetail'), qualifications=quals, lifetime=datetime.timedelta(days=90)) assert create_hit_result.status except: print "Could not finish making hits. Check that you have enough money in the account!"
def qualification_to_boto(*args): """ Convert a qualification to the format required by boto """ if len(args) == 2: name = args[0] value = args[1] elif len(args) == 1: name = args[0].name value = args[0].value else: raise ValueError("Invalid arguments") from mturk.models import MtQualification try: q = MtQualification.objects.get(slug=name) return Requirement(qualification_type_id=q.id, comparator="EqualTo", integer_value=value) except MtQualification.DoesNotExist: pass if name == 'num_approved': return NumberHitsApprovedRequirement(comparator='GreaterThanOrEqualTo', integer_value=value) elif name == 'perc_abandoned': return PercentAssignmentsAbandonedRequirement( comparator='LessThanOrEqualTo', integer_value=value) elif name == 'perc_approved': return PercentAssignmentsApprovedRequirement( comparator='GreaterThanOrEqualTo', integer_value=value) elif name == 'perc_rejected': return PercentAssignmentsRejectedRequirement( comparator='LessThanOrEqualTo', integer_value=value) elif name == 'perc_returned': return PercentAssignmentsReturnedRequirement( comparator='LessThanOrEqualTo', integer_value=value) elif name == 'perc_submitted': return PercentAssignmentsSubmittedRequirement( comparator='GreaterThanOrEqualTo', integer_value=value) else: raise ValueError("Unknown name: %s" % name)
def __init__(self, host, n=10): mturkparams = dict( aws_access_key_id=config.get('AWS Access', 'aws_access_key_id'), aws_secret_access_key=config.get('AWS Access', 'aws_secret_access_key'), host=host) self.mtc = MTurkConnection(**mturkparams) # Configure portal experimentPortalURL = config.get('HIT Configuration', 'question_url') frameheight = 600 mturkQuestion = ExternalQuestion(experimentPortalURL, frameheight) # Qualification: quals = Qualifications() approve_requirement = config.getint('HIT Configuration', 'Approve_Requirement') quals.add( PercentAssignmentsApprovedRequirement("GreaterThanOrEqualTo", approve_requirement)) if config.getboolean('HIT Configuration', 'US_only'): quals.add(LocaleRequirement("EqualTo", "US")) # Specify all the HIT parameters self.paramdict = dict( hit_type=None, question=mturkQuestion, lifetime=datetime.timedelta( hours=config.getfloat('HIT Configuration', 'HIT_lifetime')), max_assignments=config.getint('HIT Configuration', 'max_assignments'), title=config.get('HIT Configuration', 'title'), description=config.get('HIT Configuration', 'description'), keywords=config.get('HIT Configuration', 'keywords'), reward=config.getfloat('HIT Configuration', 'reward'), duration=datetime.timedelta( hours=config.getfloat('HIT Configuration', 'duration')), approval_delay=None, questions=None, qualifications=quals)
'tests', 'tests.demo', ] mturk_hit_settings = { 'keywords': ['easy', 'bonus', 'choice', 'study'], 'title': 'Title for your experiment', 'description': 'Description for your experiment', 'frame_height': 500, 'preview_template': 'global/MTurkPreview.html', 'minutes_allotted_per_assignment': 60, 'expiration_hours': 7*24, # 7 days # to prevent retakes 'grant_qualification_id': 'YOUR_QUALIFICATION_ID_HERE', 'qualification_requirements': [ LocaleRequirement("EqualTo", "US"), PercentAssignmentsApprovedRequirement("GreaterThanOrEqualTo", 50), NumberHitsApprovedRequirement("GreaterThanOrEqualTo", 5), # Requirement('YOUR_QUALIFICATION_ID_HERE', 'DoesNotExist'), ] } SESSION_CONFIG_DEFAULTS = { 'real_world_currency_per_point': 0.01, 'participation_fee': 10.00, 'doc': "", 'mturk_hit_settings': mturk_hit_settings, } SESSION_CONFIGS = [
def generate_hits(mtc_type, subset, begin_index, args): from boto.mturk.connection import MTurkConnection from boto.mturk.question import QuestionContent, Question, QuestionForm, Overview, AnswerSpecification, SelectionAnswer, FormattedContent, FreeTextAnswer from boto.mturk.qualification import PercentAssignmentsApprovedRequirement, Qualifications, Requirement mtc = mtk_utils.get_mtc(mtc_type) title = 'Give your opinion of aesthetics level about images' description = ('View images and give us your opinion of aesthetics level about the images') keywords = 'image, aesthetic, aesthetics, rating, opinions' ratings =[('Very ugly','-2'), ('Ugly','-1'), ('Neutral','0'), ('Beautiful','1'), ('Very beautiful, I would like to take such beautiful photo too.','2')] #--------------- BUILD OVERVIEW ------------------- overview = Overview() overview.append_field('Title', 'Give your opinion about aesthetics level on those images') #--------------- BUILD QUESTIONs ------------------- questions = [] if (args.m != 'qua'): utils.write_file(subset, args.o + '.index_' + str(begin_index) + '.txt') if (args.m == 'qua_init' and begin_index > 0): return for image_url in subset: qc = QuestionContent() qc.append_field('Title','How beautiful the image to you?') qc.append(FormattedContent('<img src="' + image_url + '" alt="image" />')) fta = SelectionAnswer(min=1, max=1,style='dropdown', selections=ratings, type='text', other=False) q = Question(identifier='aesthetics', content=qc, answer_spec=AnswerSpecification(fta), is_required=True) questions.append(q) #--------------- BUILD THE QUESTION FORM ------------------- question_form = QuestionForm() question_form.append(overview) for question in questions: question_form.append(question) # BUILD QUALIFICATION qualifications = Qualifications() req = PercentAssignmentsApprovedRequirement(comparator = "GreaterThan", integer_value = "95") qualifications.add(req) if (args.m == 'qua'): if (args.q != None): qua_req = Requirement(qualification_type_id = args.q, comparator = 'EqualTo', integer_value = '1') qualifications.add(qua_req) else: print("Please give qualification type id in 'qua' mode.") sys.exit(0) #--------------- CREATE THE HIT ------------------- hit = mtc.create_hit(questions = question_form, qualifications = qualifications, max_assignments = 10 * 2, title = title, description = description, keywords = keywords, duration = 60 * 30 * 2, reward = 0.2 * 2) if (args.m == 'qua_init'): print("Create qualification type for HIT id: " + hit[0].HITId) quatype = mtc.create_qualification_type(name = hit[0].HITId, description = "Temporary qualification for HIT " + hit[0].HITId, status = 'Active') print("Qualification type id: " + quatype[0].QualificationTypeId)
if DEV_ENVIROMENT_BOOLEAN: AMAZON_HOST = "https://workersandbox.mturk.com/mturk/externalSubmit" else: AMAZON_HOST = "https://www.mturk.com/mturk/externalSubmit" connection = MTurkConnection(aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY, host=AMAZON_HOST) #frame_height in pixels frame_height = 800 #Here, I create two sample qualifications qualifications = Qualifications() qualifications.add( PercentAssignmentsApprovedRequirement(comparator="GreaterThan", integer_value="90")) qualifications.add( NumberHitsApprovedRequirement(comparator="GreaterThan", integer_value="100")) #This url will be the url of your application, with appropriate GET parameters url = "google.com" questionform = ExternalQuestion(url, frame_height) create_hit_result = connection.create_hit( title="Insert the title of your HIT", description="Insert your description here", keywords=["add", "some", "keywords"], #duration is in seconds duration=60 * 60, #max_assignments will set the amount of independent copies of the task (turkers can only see one) max_assignments=15,