Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Demo-Vorlage: Kennzeichnen von Absichten mit crowd-classifier
Wenn Sie eine benutzerdefinierte Vorlage auswählen, werden Sie an den Custom labeling task panel (Bereich für die benutzerdefinierte Labeling-Aufgabe) weitergeleitet. Hier haben Sie die Auswahl zwischen mehreren Starter-Vorlagen, die einige der häufigsten Aufgaben umfassen. Die Vorlagen bieten einen Ausgangspunkt für die weitere Arbeit an der Vorlagenerstellung für Ihre benutzerdefinierte Labeling-Aufgabe.
In dieser Demo arbeiten Sie mit der Vorlage Intent Detection (Absichtserkennung), bei der das crowd-classifier
-Element verwendet wird, und den AWS Lambda -Funktionen, die für die Verarbeitung Ihrer Daten vor und nach der Aufgabe erforderlich sind.
Themen
Benutzerdefinierte Vorlage für die Starter-Absichtserkennung
Dies ist die Vorlage für die Absichtserkennung, die als Ausgangspunkt zur Verfügung gestellt wird.
<script src="https://assets.crowd.aws/crowd-html-elements.js"></script> <crowd-form> <crowd-classifier name="intent" categories="{{ task.input.labels | to_json | escape }}" header="Pick the most relevant intention expressed by the below text" > <classification-target> {{ task.input.utterance }} </classification-target> <full-instructions header="Intent Detection Instructions"> <p>Select the most relevant intention expressed by the text.</p> <div> <p><strong>Example: </strong>I would like to return a pair of shoes</p> <p><strong>Intent: </strong>Return</p> </div> </full-instructions> <short-instructions> Pick the most relevant intention expressed by the text </short-instructions> </crowd-classifier> </crowd-form>
Die benutzerdefinierten Vorlagen verwenden die Liquid template language (Liquid-Vorlagensprache)taskInput
und auf die Eigenschaften dieses Objekts kann wie {{ task.input.<property name> }}
in Ihrer Vorlage zugegriffen werden.
Ihre benutzerdefinierte Vorlage für die Absichtserkennung
In der Startvorlage befinden sich zwei Variablen: die task.input.labels
-Eigenschaft im öffnenden Tag des crowd-classifier
-Elements und die task.input.utterance
im classification-target
-Inhalt der Region.
Wenn Sie nicht verschiedene Sätze von Kennzeichnungen mit unterschiedlichen Äußerungen anbieten müssen, spart die Vermeidung einer Variablen und die einfache Verwendung von Text Verarbeitungszeit und es bieten sich weniger Fehlermöglichkeiten. Bei der in dieser Demo verwendeten Vorlage wird diese Variable zwar entfernt, es werden aber Variablen und Filter wie to_json
im crowd-bounding-box
Demo-Artikel ausführlicher erläutert.
Gestaltung der Elemente
Zwei Stellen dieser benutzerdefinierten Elemente, die manchmal übersehen werden, sind die – <full-instructions>
und <short-instructions>
-Regionen. Gute Anweisungen führen zu guten Ergebnissen.
In den Elementen, die diese Bereiche beinhalten, erscheint die <short-instructions>
automatisch im Bereich „Instructions” (Anweisungen) links auf dem Bildschirm des Workers. Die <full-instructions>
ist über den Link „View full instructions” (Vollständige Anweisungen anzeigen) in der Nähe des oberen Randes dieses Bereichs verlinkt. Wenn Sie auf den Link klicken, öffnet sich ein modales Fenster mit ausführlicheren Anweisungen.
Sie können nicht nur verwenden HTMLCSS, und JavaScript in diesen Abschnitten werden Sie dazu ermutigt, wenn Sie glauben, aussagekräftige Anweisungen und Beispiele bereitstellen zu können, die den Mitarbeitern helfen, Ihre Aufgaben schneller und genauer zu erledigen.
Beispiel Probieren Sie ein Beispiel aus mit JSFiddle
Probieren Sie eine Beispielaufgabe für <crowd-classifier>
Beispiel : Benutzerdefinierte Abschlussvorlage für die Absichtserkennung
Hierzu wird die Beispielaufgabe <crowd-classifier>
<classification-target>
. Wenn Sie versuchen, bei einer Reihe von verschiedenen Label-Jobs ein einheitliches CSS Design beizubehalten, können Sie ein externes Stylesheet einbinden, indem Sie ein <link rel...>
Element verwenden, genauso wie Sie es in jedem anderen Dokument tun würden. HTML
<script src="https://assets.crowd.aws/crowd-html-elements.js"></script> <crowd-form> <crowd-classifier name="intent" categories="['buy', 'eat', 'watch', 'browse', 'leave']" header="Pick the most relevant intent expressed by the text below" > <classification-target> {{ task.input.source }} </classification-target> <full-instructions header="Emotion Classification Instructions"> <p>In the statements and questions provided in this exercise, what category of action is the speaker interested in doing?</p> <table> <tr> <th>Example Utterance</th> <th>Good Choice</th> </tr> <tr> <td>When is the Seahawks game on?</td> <td> eat<br> <greenbg>watch</greenbg> <botchoice>browse</botchoice> </td> </tr> <tr> <th>Example Utterance</th> <th>Bad Choice</th> </tr> <tr> <td>When is the Seahawks game on?</td> <td> buy<br> <greenbg>eat</greenbg> <botchoice>watch</botchoice> </td> </tr> </table> </full-instructions> <short-instructions> What is the speaker expressing they would like to do next? </short-instructions> </crowd-classifier> </crowd-form> <style> greenbg { background: #feee23; display: block; } table { *border-collapse: collapse; /* IE7 and lower */ border-spacing: 0; } th, tfoot, .fakehead { background-color: #8888ee; color: #f3f3f3; font-weight: 700; } th, td, tfoot { border: 1px solid blue; } th:first-child { border-radius: 6px 0 0 0; } th:last-child { border-radius: 0 6px 0 0; } th:only-child{ border-radius: 6px 6px 0 0; } tfoot:first-child { border-radius: 0 0 6px 0; } tfoot:last-child { border-radius: 0 0 0 6px; } tfoot:only-child{ border-radius: 6px 6px; } td { padding-left: 15px ; padding-right: 15px ; } botchoice { display: block; height: 17px; width: 490px; overflow: hidden; position: relative; background: #fff; padding-bottom: 20px; } botchoice:after { position: absolute; bottom: 0; left: 0; height: 100%; width: 100%; content: ""; background: linear-gradient(to top, rgba(255,255,255, 1) 55%, rgba(255,255,255, 0) 100% ); pointer-events: none; /* so the text is still selectable */ } </style>
Beispiel : Ihre Manifestdatei
Wenn Sie Ihre Manifestdatei manuell für eine solche Textklassifikationsaufgabe vorbereiten, müssen Ihre Daten wie folgt formatiert werden.
{"source": "Roses are red"} {"source": "Violets are Blue"} {"source": "Ground Truth is the best"} {"source": "And so are you"}
Dies unterscheidet sich von der für die Demo „Demo-Vorlage: Kommentieren von Bildern mit crowd-bounding-box” verwendeten Manifestdatei dadurch, dass source-ref
statt source
als Eigenschaftsname verwendet wurde. Die Verwendung von source-ref
bezeichnet S3 URIs für Bilder oder andere Dateien, in die konvertiert werden müssen. HTTP Andernfalls sollte source
so wie bei den obigen Textzeichenfolgen verwendet werden.
Ihre Lambda-Funktion zur Vorverarbeitung
Geben Sie im Rahmen der Auftragseinrichtung den Namen an, ARN der aufgerufen werden kann AWS Lambda , um Ihre Manifesteinträge zu verarbeiten und an die Template-Engine weiterzuleiten.
Bei dieser Lambda-Funktion muss eine der folgenden vier Zeichenfolgen Bestandteil des Funktionsnamens sein: SageMaker
, Sagemaker
, sagemaker
oder LabelingFunction
.
Dies gilt sowohl für Ihre Lambdas zur Vorverarbeitung und Nachbereitung.
Wenn Sie bei Verwendung der Konsole über Lambdas verfügen, die im Besitz Ihres Kontos sind, wird eine Dropdown-Liste der Funktionen zur Auswahl bereitgestellt, die die Namensanforderungen erfüllen.
In diesem sehr einfachen Beispiel, in dem Sie nur eine Variable haben, ist es in erster Linie eine Pass-Through-Funktion. Hier ist ein Beispiel für die Vorabkennzeichnung von Lambda mit Python 3.7.
import json def lambda_handler(event, context): return { "taskInput": event['dataObject'] }
Die Eigenschaft dataObject
des event
enthält die Eigenschaften aus einem Datenobjekt in Ihrem Manifest.
In dieser Demo, bei der eine Variable einfach übergeben wird, lassen Sie dies einfach als taskInput
-Wert durchlaufen. Wenn Sie dem event['dataObject']
Objekt Eigenschaften mit diesen Werten hinzufügen, stehen sie Ihrer HTML Vorlage als Liquid-Variablen mit dem Format zur Verfügung{{
task.input.
.<property name>
}}
Ihre Lambda-Funktion zur Nachbereitung
Stellen Sie im Rahmen der Auftragseinrichtung eine Lambda-Funktion bereit, die ARN aufgerufen werden kann, um die Formulardaten zu verarbeiten, wenn ein Worker eine Aufgabe erledigt. Dies kann so einfach oder komplex sein wie Sie möchten. Wenn Sie die Antwortkonsolidierung und Bewertung beim Dateneingang ausführen möchten, können Sie die Bewertungs- und/oder Konsolidierungsalgorithmen Ihrer Wahl anwenden. Wenn Sie die Rohdaten für eine Offline-Verarbeitung speichern möchten, ist dies eine Option.
Festlegen von Berechtigungen für Ihre Lambda-Funktion zur Nachbereitung
Die Anmerkungsdaten befinden sich in einer Datei, die durch die s3Uri
-Zeichenfolge im payload
-Objekt ausgewiesen wird. Um die Anmerkungen bei Eingang zu verarbeiten, auch für eine einfache Pass-Through-Funktion, müssen Sie S3ReadOnly
-Zugriff für Lambda zuweisen, damit Anmerkungsdateien gelesen werden können.
Scrollen Sie auf der Konsolenseite für das Erstellen Ihres Lambdas zum Bereich Execution role (Ausführungsrolle). Wählen Sie Create a new role from one or more templates (Erstellen Sie eine neue Rolle aus einer oder mehreren Vorlagen) aus. Geben Sie der Rolle einen Namen. Wählen Sie aus der Dropdown-Liste Policy templates (Richtlinienvorlagen) die Option Amazon S3 object read-only permissions (Leseberechtigungen für Amazon S3-Objekte) aus. Speichern Sie das Lambda und die Rolle wird gespeichert und ausgewählt.
Das folgende Beispiel ist für Python 3.7.
import json import boto3 from urllib.parse import urlparse def lambda_handler(event, context): consolidated_labels = [] parsed_url = urlparse(event['payload']['s3Uri']); s3 = boto3.client('s3') textFile = s3.get_object(Bucket = parsed_url.netloc, Key = parsed_url.path[1:]) filecont = textFile['Body'].read() annotations = json.loads(filecont); for dataset in annotations: for annotation in dataset['annotations']: new_annotation = json.loads(annotation['annotationData']['content']) label = { 'datasetObjectId': dataset['datasetObjectId'], 'consolidatedAnnotation' : { 'content': { event['labelAttributeName']: { 'workerId': annotation['workerId'], 'result': new_annotation, 'labeledContent': dataset['dataObject'] } } } } consolidated_labels.append(label) return consolidated_labels
Die Ausgabe Ihres Kennzeichnungsauftrags
Die Nachbearbeitung für Lambda empfängt häufig Stapel mit Aufgabenergebnissen im Ereignisobjekt. Dieser Stapel ist das payload
-Objekt, das Lambda durchlaufen sollte.
Sie finden die Ausgabe des Auftrags in einem Ordner, der nach Ihrem Kennzeichnungsauftrag im von Ihnen angegebenen S3-Ziel-Bucket benannt wurde. Er befindet sich in einem Unterordner mit dem Namen manifests
.
Für einen Absichtserkennungsauftrag sieht die Ausgabe, die Sie im Ausgabemanifest finden, in etwa wie die Demo unten aus. Das Beispiel wurde bereinigt und für bessere Lesbarkeit mit weiteren Abständen versehen. Der tatsächliche Ausgabetext wird für das maschinelle Lesen stärker komprimiert.
Beispiel : JSON in Ihrem Ausgabemanifest
[ { "datasetObjectId":"<Number representing item's place in the manifest>", "consolidatedAnnotation": { "content": { "<name of labeling job>": { "workerId":"private.us-east-1.
XXXXXXXXXXXXXXXXXXXXXX
", "result": { "intent": { "label":"<label chosen by worker>" } }, "labeledContent": { "content":"<text content that was labeled>" } } } } }, "datasetObjectId":"<Number representing item's place in the manifest>", "consolidatedAnnotation": { "content": { "<name of labeling job>": { "workerId":"private.us-east-1.6UDLPKQZHYWJQSCA4MBJBB7FWE", "result": { "intent": { "label": "<label chosen by worker>" } }, "labeledContent": { "content": "<text content that was labeled>" } } } } }, ... ... ... ]
Dies sollte Ihnen dabei helfen, Ihre eigene benutzerdefinierte Vorlage zu erstellen und zu verwenden.