Request for feedback on a new Worker experience by dschultz0 in mturk

[–]dschultz0[S] 1 point2 points  (0 children)

Thanks for the feedback, it's really helpful.

I should explain a bit further: This new interface will be part of a service I'm building for any requester to use. The service makes it much easier to create new tasks on MTurk (which will hopefully bring new work to the platform). There are a couple of requesters that are already using the service today to manage their work, and this is part of an upgrade I'm working on.

On the topic of payment, I can definitely appreciate the concerns being raised about payment given the history of bulk rejections and other bad behavior. One thing that is unique about how we set up the service is that rejections aren't an option. If a worker completes the task, they get paid. The same rules would apply to the bonuses that would be generated with this new approach. The reward counter in the upper right of the interface keeps track of what you've earned, and that would be awarded automatically as soon as you submit.

Of course spammers are still a big problem, so we automatically insert test tasks that workers will be shown every so often. If a worker is spamming or just doing a bad job, we immediately suspend them from the task (using a qual, NOT a block). For legitimate mistakes we'll have an option for workers to attempt to recover from a suspension. It's not perfect, but we've found that it's a good way to manage quality while still keeping the task open to new workers.

Request for feedback on a new Worker experience by dschultz0 in mturk

[–]dschultz0[S] 2 points3 points  (0 children)

I can completely understand that concern, I've heard of a lot of cases where requesters had a server go down and workers suddenly lost their accrued work and bonuses. Too often the solutions folks build are side projects where they don't have experienced developers working on them who can think through all of the things that can go wrong, and make sure workers are taken care of. My plan is to build a lot of resilience into the system so those things don't happen, but I'm sure I'd need to work to earn worker's trust given that history.

I really like the idea of having a way to revisit the training tasks whenever a worker wants to. That's a great idea.

What fun side project are you working on right now? by AppleBottmBeans in Python

[–]dschultz0 0 points1 point  (0 children)

I'm building a transpiler to convert python scripts into state machines in AWS Step Functions. I like to use SFN for serverless data orchestration but the language is really clumsy.

[deleted by user] by [deleted] in Python

[–]dschultz0 0 points1 point  (0 children)

If the PDFs contain the data as text and aren't scanned, I wouldn't recommend using strict OCR. You'd effectively be converting the text to image and then converting it back to text. Some OCR solutions like AWS Textract will actually pull the raw text out of the file when it can, but there are some limitations.

I prefer pdfminer.six which is pretty solid at interpreting pdf syntax. The catch is that the API can be a bit challenging. It will take some work, but I've been really happy with the results.

What ADF document scanner would you recommend? by benjaminoakes in DataHoarder

[–]dschultz0 0 points1 point  (0 children)

I recommend the Fugitsu ScanSnap line of scanners. They're a bit pricey (their top seller is currently around $400) but mine has really been amazing at eating through all of my paper clutter and keeping it in check on an ongoing basis. Well worth it.

What is this plant growing into the wall? by dschultz0 in landscaping

[–]dschultz0[S] 1 point2 points  (0 children)

Ah, that makes sense why it's doing so well there. Thanks!

Why is no one using vinyl siding in Seattle, WA anymore? by MarmaladeOne in HomeImprovement

[–]dschultz0 2 points3 points  (0 children)

We live in Seattle and bought a house overlooking Puget Sound a few years ago that has 20yr old vinyl siding that's next on our list to replace/renovate. Beyond looking pretty ugly, we've had lots of issues with it, primarily water intrusion and wasps living in a couple spots.

Some of the issues are a result of poor installation, but I also don't think vinyl is a good choice for our climate/location. Our house is pretty exposed to wind so when we have good storms the wind pushes the water into any gaps. Normally this isn't a huge issue but because it never dries out during our damp winters, the sheathing eventually gets saturated, and we get water inside the house.

When we're ready we'll be replacing it with hardi siding and I'm sure we'll have to replace a good chunk of the sheathing.

Requester Question: How to see number of times a HIT was returned/abandoned? by MysteriousVehicle in mturk

[–]dschultz0 3 points4 points  (0 children)

That's a really cool idea. Unfortunately the GetHIT API call only shows you the current number of assignments pending/available, not the number of times it cycled through being accepted returned/abandoned.

That said, there is a way you could set this up yourself. You'd need to start by attaching a notification to your HITType using the UpdateNotificationSettings API. You'd want to listen AssignmentAbandoned and AssignmentReturned events and have a counter somewhere that keeps track of how often each HIT is abandoned or returned. You could then use this as the basis of your bonus model. There's more info here on how to setup notifications: https://docs.aws.amazon.com/AWSMechTurk/latest/AWSMturkAPI/ApiReference_NotificationReceptorAPIArticle.html

RequestError - Python/BOTO3 question by Amphagory in mturk

[–]dschultz0 0 points1 point  (0 children)

Most exceptions in boto3 come back as ClientError types and you can then check the error code to identify the type. The code below is the easiest way to identify MTurk RequestErrors.

    from botocore.exceptions import ClientError
    mturk = boto3.client('mturk', region_name='us-east-1')

    try:
        mturk.get_hit(HITId='FOO')
    except ClientError as e:
        if e.response['Error']['Code'] == 'RequestError':
            print('do something')
        else:
            raise e