Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Plantilla de demostración: intenciones de etiquetado con crowd-classifier
Si elige una plantilla personalizada, irá a Custom labeling task panel (Panel de tareas de etiquetado personalizadas). Ahí puede elegir entre varias plantillas para principiantes que representan algunas de las tareas más frecuentes. Las plantillas proporcionan un punto de partida para trabajar en la creación de la plantilla de la tarea de etiquetado personalizada.
En esta demostración, trabajará con la plantilla Intent Detection (Detección de intentos), que utiliza el elemento crowd-classifier
y las funciones AWS Lambda necesarias para procesar los datos antes y después de la tarea.
Temas
Plantilla personalizada de detección de intentos para principiantes
Esta es la plantilla de detección de intentos que se proporciona como punto de partida.
<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>
La plantillas personalizadas utilizan el lenguaje de plantillas de LiquidtaskInput
y se puede acceder a las propiedades de ese objeto como {{ task.input.<property name> }}
en la plantilla.
La plantilla personalizada de detección de intentos
En la plantilla inicial, existen dos variables: la propiedad task.input.labels
en la etiqueta de apertura del elemento crowd-classifier
y la propiedad task.input.utterance
en el contenido de la región classification-target
.
A menos que necesite ofrecer diferentes conjuntos de etiquetas con distintos enunciados, evite el uso de una variable y utilice simplemente texto, ya que así ahorrará tiempo de procesamiento y existirá un menor riesgo de errores. La plantilla que se utiliza en esta demostración eliminará esa variable, pero las variables y los filtros como to_json
se explican con más detalle en el artículo de demostración de crowd-bounding-box
.
Estilo de los elementos
Dos partes de estos elementos personalizados que a veces se pasan por alto son las regiones <full-instructions>
y <short-instructions>
. Unas buenas instrucciones generan buenos resultados.
En los elementos que incluyen estas regiones, las <short-instructions>
aparecen automáticamente en el panel de instrucciones situado a la izquierda de la pantalla del proceso de trabajo. Se puede obtener acceso a las <full-instructions>
desde el enlace "View full instructions" (Ver instrucciones completas) situado cerca de la parte superior de ese panel. Al hacer clic en el enlace, se abre un panel modal con instrucciones más detalladas.
No solo puede utilizarla HTMLCSS, y JavaScript en estas secciones, le recomendamos que lo haga si cree que puede proporcionar un conjunto sólido de instrucciones y ejemplos que ayudarán a los trabajadores a completar sus tareas con mayor rapidez y precisión.
ejemplo Pruebe una muestra con JSFiddle
Pruebe una tarea de <crowd-classifier>
de ejemplo
ejemplo : plantilla de detección de intentos personalizada final
Aquí se utiliza la tarea de <crowd-classifier>
de ejemplo<classification-target>
. Si está intentando mantener un CSS diseño coherente entre una serie de tareas de etiquetado diferentes, puede incluir una hoja de estilos externa utilizando un <link rel...>
elemento del mismo modo que lo haría en cualquier otro 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>
ejemplo : su archivo de manifiesto
Si está preparando manualmente el archivo de manifiesto para una tarea de clasificación de texto de este tipo, dé un formato a los datos de la siguiente manera:
{"source": "Roses are red"} {"source": "Violets are Blue"} {"source": "Ground Truth is the best"} {"source": "And so are you"}
Esto difiere del archivo de manifiesto utilizado para la demostración "Plantilla de demostración: anotación de imágenes con crowd-bounding-box" en que source-ref
se utilizó como el nombre de la propiedad en lugar de source
. El uso de source-ref
designa S3 URIs para las imágenes u otros archivos a los que hay que convertir. HTTP De lo contrario, debe utilizarse source
tal cual con las cadenas de texto anteriores.
La función Lambda de preanotación
Como parte de la configuración del trabajo, proporciona una opción a ARN la AWS Lambda que se pueda llamar para procesar las entradas del manifiesto y pasarlas al motor de plantillas.
Esta función de Lambda debe tener una de las cuatro cadenas siguientes como parte del nombre de la función: SageMaker
, Sagemaker
, sagemaker
o LabelingFunction
.
Esto se aplica tanto a las Lambdas de preanotación como de postanotación.
Cuando utiliza la consola, si tiene Lambda que son propiedad de su cuenta, se proporcionará una lista desplegable de funciones que cumplen los requisitos de nomenclatura para que elija una.
En este ejemplo muy básico donde solo tiene una variable, se trata básicamente de una función de paso a través. A continuación, le mostramos una función de Lambda de etiquetado previo de ejemplo que utiliza Python 3.7.
import json def lambda_handler(event, context): return { "taskInput": event['dataObject'] }
La propiedad dataObject
de event
contiene las propiedades de un objeto de datos del manifiesto.
En esta demostración, que es un simple acceso directo, solo pasa esto directamente como el valor taskInput
. Si agregas propiedades con esos valores al event['dataObject']
objeto, estarán disponibles en tu HTML plantilla como variables de Liquid con ese formato{{
task.input.
.<property name>
}}
La función Lambda de postanotación
Como parte de la configuración ARN del trabajo, proporcione una función Lambda a la que se pueda llamar para procesar los datos del formulario cuando un trabajador complete una tarea. Esto puede ser tan sencillo o complejo como desee. Si desea realizar la consolidación y puntuación de respuestas a medida que entran los datos, puede aplicar los algoritmos de puntuación o consolidación que desee. Si desea almacenar los datos sin procesar para el procesamiento sin conexión, esto es una opción.
Establecimiento de permisos a su función lambda de postanotación
Los datos de anotaciones estarán en un archivo designado por la cadena s3Uri
en el objeto payload
. Para procesar las anotaciones a medida que están disponibles, incluso para una sencilla función de acceso directo, tiene que asignar el acceso S3ReadOnly
a su Lambda para que pueda los archivos de anotaciones.
En la página Console (Consola) de creación de su Lambda, desplácese hasta el panel Execution role (Rol de ejecución). Seleccione Create a new role from one or more templates (Crear un rol nuevo a partir de una o varias plantillas). Ponga un nombre al rol. Desde el menú desplegable Policy templates (Plantillas de políticas), elija Amazon S3 object read-only permissions (Permisos de solo lectura de objetos Amazon S3). Guarde la función de Lambda y el rol se guardará y seleccionará.
El siguiente ejemplo es para 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
Su salida de trabajo de etiquetado
La función Lambda de postanotación recibirá a menudo lotes de resultados de tareas en el objeto de evento. Este lote será el objeto payload
que Lambda deberá iterar.
Encontrará la salida del trabajo en una carpeta llamada como el trabajo de etiquetado del bucket de S3 que ha especificado. Estará en una subcarpeta llamada manifests
.
Para una tarea de detección de intentos, el resultado del manifiesto de salida tendrá un aspecto similar al de la demostración siguiente. Hemos limpiado e incluido espacios en el ejemplo para facilitar su comprensión. La salida real estará más comprimida para la lectura automática.
ejemplo : JSON en tu manifiesto de salida
[ { "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>" } } } } }, ... ... ... ]
Esto puede serle útil para crear y utilizar su propia plantilla personalizada.