public void Execute(AnalysisExecutionContext context) { _context = context; if (context.Results.Count <= 0) { context.OnExecutionProgress("MechanicalTurk", new AnalysisExecutionProgressEventArgs(AnalysisExecutionStatus.Canceled, 0, 0, 0)); return; } MechanicalTurkSettings settings = context.CustomField as MechanicalTurkSettings; if (settings == null) { settings = new MechanicalTurkSettings(null, 3, new decimal(0.10), 300, 1800, 75); } string key = context.Key; string secret = context.Secret; MTurkConfig config = new MTurkConfig(_serviceURL, key, secret); SimpleClient client = new SimpleClient(config); List <QualificationRequirement> requirements = new List <QualificationRequirement>(); QualificationRequirement sucRequirement = new QualificationRequirement(); sucRequirement.QualificationTypeId = MTurkSystemQualificationTypes.ApprovalRateQualification; sucRequirement.IntegerValueSpecified = true; sucRequirement.IntegerValue = settings.PercentOfSuccess; sucRequirement.Comparator = Comparator.GreaterThanOrEqualTo; requirements.Add(sucRequirement); if (settings.Locale != null) { QualificationRequirement qualReq = new QualificationRequirement(); qualReq.LocaleValue = new Locale() { Country = settings.Locale }; qualReq.Comparator = Comparator.EqualTo; qualReq.QualificationTypeId = MTurkSystemQualificationTypes.LocaleQualification; requirements.Add(qualReq); } string hitType = string.Empty; try { if (context.UseDebugMode) { TimeSpan time = TimeSpan.Zero; hitType = BenchmarkHelper.Invoke(new InvokeBenchmarkHandler(delegate(object state) { return(hitType = client.RegisterHITType("Sentiment analysis", "Judge the sentiment expressed by the following text.", settings.TimeToApprove, settings.TimeToFinish, settings.Reward, "sentiment nlp", requirements)); }), null, out time) as string; Console.WriteLine("MechanicalTurk: HIT type for sentiment analysis has been created. HIT type ID is: {0} Execution time is: {1}", hitType, time.TotalMilliseconds); } else { hitType = client.RegisterHITType("Sentiment analysis", "Judge the sentiment expressed by the following text.", settings.TimeToApprove, settings.TimeToFinish, settings.Reward, "sentiment, nlp", requirements); } NotificationSpecification notification = new NotificationSpecification(); notification.Transport = NotificationTransport.Email; notification.EventType = new EventType[] { EventType.AssignmentReturned }; notification.Destination = settings.Email; notification.Version = "2006-05-05"; if (settings.Email != null) { client.SetHITTypeNotification(hitType, notification, true); } else { notification.Destination = "*****@*****.**"; client.SetHITTypeNotification(hitType, notification, false); } } catch (Exception ex) { AnalysisExecutionProgressEventArgs ea = new AnalysisExecutionProgressEventArgs(AnalysisExecutionStatus.Failed, context.Results.Count, 0, 0); ea.Reason = ex.Message; context.OnExecutionProgress("MechanicalTurk", ea); if (ea.Cancel) { return; } } string questionFile = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "SentimentTemplate.xml"); string template = File.ReadAllText(questionFile); QuestionForm formTemplate = QuestionUtil.DeserializeQuestionForm(template); int processed = 0; int failed = 0; foreach (KeyValuePair <string, ResultSet> document in context.Results) { formTemplate.Question[0].QuestionIdentifier = document.Key; formTemplate.Question[0].QuestionContent.Items[0] = Encoding.UTF8.GetString(Encoding.Default.GetBytes(document.Value.Source)); string question = QuestionUtil.SerializeQuestionForm(formTemplate); HIT hit = new HIT(); hit.Expiration = DateTime.Now.AddDays(1); hit.ExpirationSpecified = true; hit.HITGroupId = "SentimentAnalysis"; hit.HITTypeId = hitType; hit.MaxAssignments = settings.Assignments; hit.MaxAssignmentsSpecified = true; hit.Question = question; HIT serverHit = null; try { processed++; if (context.UseDebugMode) { TimeSpan time = TimeSpan.Zero; serverHit = BenchmarkHelper.Invoke(new InvokeBenchmarkHandler(delegate(object state) { return(client.CreateHIT(hit)); }), null, out time) as HIT; Console.WriteLine("MechanicalTurk: HIT {0} has been sent to Mechanical turk for processing. Execution time is: {1}", serverHit.HITId, time.TotalMilliseconds); } else { serverHit = client.CreateHIT(hit); } document.Value.AddOutput("MechanicalTurk", settings.Assignments, serverHit.HITId); AnalysisExecutionProgressEventArgs e = new AnalysisExecutionProgressEventArgs(AnalysisExecutionStatus.Processed, context.Results.Count, processed, failed); context.OnExecutionProgress("MechanicalTurk", e); if (e.Cancel) { break; } } catch (Exception ex) { failed++; document.Value.AddOutput("MechanicalTurk", 0, "failed"); AnalysisExecutionProgressEventArgs ea = new AnalysisExecutionProgressEventArgs(AnalysisExecutionStatus.Failed, context.Results.Count, processed, failed); ea.Reason = ex.Message; context.OnExecutionProgress("MechanicalTurk", ea); if (ea.Cancel) { break; } } } context.OnExecutionProgress("MechanicalTurk", new AnalysisExecutionProgressEventArgs(AnalysisExecutionStatus.Success, context.Results.Count, processed, failed)); }
public HIT CreateExternalHIT(string url, Dictionary <string, object> HitParams) { String HitType = Default_HitType; String title = (string)HitParams["Title"]; String description = (string)HitParams["TaskDescription"]; String keywords = Default_KeyWords; if (HitParams.ContainsKey("KeyWords")) { keywords = (string)HitParams["KeyWords"]; } /**************************External Question******************/ ExternalQuestion myExtQuestion = new ExternalQuestion(); myExtQuestion.ExternalURL = url; if (HitParams.ContainsKey("FrameHeight")) { myExtQuestion.FrameHeight = HitParams["FrameHeight"].ToString(); } else { myExtQuestion.FrameHeight = Default_FrameHeight.ToString(); } /*********************************************************/ decimal reward = Default_Reward; if (HitParams.ContainsKey("Reward")) { reward = Convert.ToDecimal((double)HitParams["Reward"]); } long assignmentDuration = Default_assignmentDurationInSeconds; if (HitParams.ContainsKey("AssignmentDuration")) { assignmentDuration = (long)Convert.ToInt64(HitParams["AssignmentDuration"]); } long autoApporvalTime = Default_autoApprovalDelayInSeconds; if (HitParams.ContainsKey("AutoApprovalTime")) { autoApporvalTime = (long)Convert.ToInt64(HitParams["AutoApprovalTime"]); } long lifeTime = Default_lifetimeInSeconds; if (HitParams.ContainsKey("AssignmentLifeTime")) { lifeTime = (long)Convert.ToInt64(HitParams["AssignmentLifeTime"]); } int maxAssignments = Default_MaxAssignments; if (HitParams.ContainsKey("MaxHITs")) { maxAssignments = (int)HitParams["MaxHITs"]; } String requesterAnnotation = Default_requesterAnnotation; if (HitParams.ContainsKey("RequesterAnnotation")) { requesterAnnotation = (string)HitParams["RequesterAnnotation"]; } /***************Qualifications***************************************/ List <QualificationRequirement> qualReqs = new List <QualificationRequirement>(); if (HitParams.ContainsKey("Country")) { //setting the qualification requirements QualificationRequirement qualReq = new QualificationRequirement(); qualReq.QualificationTypeId = MTurkSystemQualificationTypes.LocaleQualification; // locale system qual identifier Locale country = new Locale(); country.Country = "US"; qualReq.LocaleValue = country; qualReq.Comparator = Comparator.EqualTo; qualReqs.Add(qualReq); } if (HitParams.ContainsKey("Masters")) { QualificationRequirement qualReq1 = new QualificationRequirement(); if (sandBox) { qualReq1.QualificationTypeId = "2ARFPLSP75KLA8M8DH1HTEQVJT3SY6"; // masters } else { qualReq1.QualificationTypeId = "2F1QJWKUDD8XADTFD2Q0G6UTO95ALH"; // masters } qualReq1.Comparator = Comparator.Exists; qualReqs.Add(qualReq1); } /*if ((string)HitParams["PercentApproved"] == "Masters") * { * QualificationRequirement qualReq1 = new QualificationRequirement(); * qualReq1.QualificationTypeId = "2F1QJWKUDD8XADTFD2Q0G6UTO95ALH"; // masters * qualReq1.Comparator = Comparator.Exists; * qualReqs.Add(qualReq1); * }*/ /****************************************************************/ String[] responseGroup = Default_ResponseGroup; if (HitParams.ContainsKey("ResponseGroup")) { responseGroup = (string[])HitParams["ResponseGroup"]; } /************************Now create a HIT *****************************/ HIT h = client.CreateHIT(HitType, title, description, keywords, myExtQuestion, reward, assignmentDuration, // 1 hour autoApporvalTime, // 15 days lifeTime, // 3 days, maxAssignments, requesterAnnotation, qualReqs, responseGroup); Console.WriteLine("Created HIT: {0} ({1})", h.HITId, client.GetPreviewURL(h.HITTypeId)); return(h); }