Modello demo: intenti di etichettatura con crowd-classifier - Amazon SageMaker

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Modello demo: intenti di etichettatura con crowd-classifier

Se scegli di utilizzare un modello personalizzato, viene visualizzato il pannello Custom labeling task (Attività di etichettatura personalizzata), in cui puoi scegliere tra più modelli iniziali che rappresentano alcune delle attività più comuni e che forniscono un punto di partenza da utilizzare nella creazione del modello di attività di etichettatura personalizzata.

Questa dimostrazione utilizza il modello Intent Detection (Rilevamento intenti), che usa l'elemento crowd-classifier e le funzioni AWS Lambda necessarie per l'elaborazione dei dati prima e dopo l'attività.

Modello di rilevamento intenti personalizzato iniziale

Questo è il modello di rilevamento intenti fornito come punto di partenza.

<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>

I modelli personalizzati utilizzano il linguaggio modello Liquid e ciascuno degli elementi tra parentesi graffe doppie è una variabile. La funzione AWS Lambda di pre-annotazione dovrebbe fornire un oggetto denominato taskInput e le proprietà di quell'oggetto sono accessibili come nel {{ task.input.<property name> }} modello.

Modello di rilevamento intenti personalizzato

Nel modello iniziale sono presenti due variabili: la proprietà task.input.labels nel tag di apertura dell'elemento crowd-classifier e task.input.utterance nel contenuto della Regione classification-target.

A meno che non sia necessario offrire diversi set di etichette con diverse enunciazioni, evitare una variabile e utilizzare solo testo consente di risparmiare tempo di elaborazione e ridurre la possibilità di errore. Il modello utilizzato in questa dimostrazione rimuoverà tale variabile, ma variabili e filtri come to_json sono descritti in maggiore dettaglio nell'articolo relativo alla dimostrazione crowd-bounding-box.

Definizione dello stile degli elementi

Due parti di questi elementi personalizzati che a volte vengono trascurati sono le Regioni <full-instructions> e <short-instructions>. Buone istruzioni generano buoni risultati.

Negli elementi che includono queste Regioni, <short-instructions> viene visualizzato automaticamente nel riquadro "Instructions" (Istruzioni) a sinistra della schermata del worker. Le <full-instructions> sono collegate dal collegamento "View full instructions" (Visualizza istruzioni complete) nella parte superiore del riquadro. Facendo clic sul collegamento viene visualizzata una finestra modale con più istruzioni dettagliate.

Non potete limitarvi a usare HTMLCSS, e JavaScript in queste sezioni vi consigliamo di farlo se ritenete di poter fornire una serie completa di istruzioni ed esempi che aiuteranno i lavoratori a completare le vostre attività con maggiore velocità e precisione.

Esempio Prova un esempio con JSFiddle

Gif example of trying out a sample with JSFiddle.

Prova un'attività <crowd-classifier> di esempio. L'esempio è reso daJSFiddle, quindi tutte le variabili del modello vengono sostituite con valori codificati. Fai clic sul link «Visualizza istruzioni complete» per visualizzare una serie di esempi con uno stile esteso. CSS Puoi creare un fork del progetto per sperimentare le tue modificheCSS, aggiungere immagini di esempio o aggiungere funzionalità estese JavaScript .

Esempio : modello di rilevamento intenti personalizzato finale

Questo utilizza l'attività <crowd-classifier> di esempio, ma con una variabile per il <classification-target>. Se state cercando di mantenere un CSS design coerente tra una serie di diversi lavori di etichettatura, potete includere un foglio di stile esterno utilizzando un <link rel...> elemento nello stesso modo in cui fareste in qualsiasi altro documento. 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>
Esempio : il file manifest

Se stai preparando il file manifest manualmente per un'attività di classificazione di testo come questa, i dati sono formattati nel modo seguente:

{"source": "Roses are red"} {"source": "Violets are Blue"} {"source": "Ground Truth is the best"} {"source": "And so are you"}

Questo si differenzia dal file manifest utilizzato per la dimostrazione Modello demo: annotazione di immagini con crowd-bounding-box in quanto source-ref è stato utilizzato come nome di proprietà anziché source. L'uso di source-ref designa S3 URIs per immagini o altri file in cui devono essere convertiti. HTTP In caso contrario, source deve essere utilizzato così com'è con le stringhe di testo precedenti.

La tua funzione Lambda di pre-annotazione

Come parte della configurazione del lavoro, fornite un nome AWS Lambda che possa essere chiamato per elaborare le voci ARN del manifesto e passarle al motore dei modelli.

Questa funzione Lambda deve avere una delle quattro stringhe seguenti come parte del nome funzione: SageMaker, Sagemaker, sagemaker o LabelingFunction.

Questo vale per le funzioni Lambda sia di pre-annotazione che di post-annotazione.

Quando utilizzi la console, se disponi di Lambda di proprietà del tuo account, verrà mostrato un elenco a discesa di funzioni che soddisfano i requisiti di denominazione tra cui scegliere.

In questo esempio di base, dove è disponibile una sola variabile, si tratta principalmente di una funzione pass-through. Di seguito è riportata una Lambda di pre-etichettatura che utilizza Python 3.7.

import json def lambda_handler(event, context): return { "taskInput": event['dataObject'] }

La proprietà dataObject di event contiene le proprietà da un oggetto dati nel manifest.

In questa dimostrazione, che è un semplice passthrough, la passi direttamente come valore taskInput. Se aggiungi proprietà con questi valori all'event['dataObject']oggetto, queste saranno disponibili per il tuo HTML modello come variabili Liquid con il formato{{ task.input.<property name> }}.

La tua funzione Lambda di post-annotazione

Come parte della configurazione del lavoro, fornisci una funzione Lambda che può essere chiamata per elaborare i dati del modulo quando un lavoratore completa un'attività. ARN Questo può essere semplice o complesso quanto vuoi. Se desideri eseguire consolidamento e punteggio della risposta quando arrivano i dati, puoi applicare gli algoritmi di punteggio o consolidamento da te scelti. Se desideri archiviare i dati non elaborati per l'elaborazione offline, puoi farlo.

Impostazione delle autorizzazioni per la funzione Lambda di post-annotazione

I dati di annotazione saranno contenuti in un file designato dalla stringa s3Uri nell'oggetto payload. Per elaborare le annotazioni quando arrivano, anche per una semplice funzione passthrough, occorre assegnare l'accesso S3ReadOnly alla Lambda, in modo che possa leggere i file di annotazione.

Nella pagina Console di creazione della Lambda, scorri fino al pannello Execution role (Ruolo esecuzione). Seleziona Create a new role from one or more templates (Crea un nuovo ruolo da uno o più modelli). Assegna un nome al ruolo. Dal menu a discesa Policy templates (Modelli policy), scegli Amazon S3 object read-only permissions (Autorizzazioni di sola lettura oggetto Amazon S3). Salva la Lambda; il ruolo verrà salvato e selezionato.

L'esempio seguente è per 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

Output del proprio processo di etichettatura

La Lambda di post-annotazione riceverà spesso batch di risultati dell'attività nell'oggetto evento. Questo batch sarà l'oggetto payload in cui Lambda esegue le iterazioni.

L'output del processo è disponibile in una cartella denominata in base al processo di etichettatura nel bucket S3 di destinazione specificato, all'interno di una sottocartella denominata manifests.

Per un'attività di rilevamento intenti, l'aspetto dell'output disponibile nel manifest di output sarà simile alla demo sottostante. L'esempio è stato ripulito e distanziato per facilitarne la lettura. L'output effettivo sarà più compresso per macchine per la lettura macchina.

Esempio : JSON nel manifesto di output
[ { "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>" } } } } }, ... ... ... ]

Questo dovrebbe aiutarti a creare e utilizzare il tuo modello personalizzato.