

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`
<a name="sms-custom-templates-step2-demo2"></a>

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

**Topics**
+ [Modello di rilevamento intenti personalizzato iniziale](#sms-custom-templates-step2-demo2-base-template)
+ [Modello di rilevamento intenti personalizzato](#sms-custom-templates-step2-demo2-your-template)
+ [La tua funzione Lambda di pre-annotazione](#sms-custom-templates-step2-demo2-pre-lambda)
+ [La tua funzione Lambda di post-annotazione](#sms-custom-templates-step2-demo2-post-lambda)
+ [Output del proprio processo di etichettatura](#sms-custom-templates-step2-demo2-job-output)

## Modello di rilevamento intenti personalizzato iniziale
<a name="sms-custom-templates-step2-demo2-base-template"></a>

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](https://shopify.github.io/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
<a name="sms-custom-templates-step2-demo2-your-template"></a>

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
<a name="sms-custom-templates-step2-demo2-instructions"></a>

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 usare solo HTML e CSS, e JavaScript in queste sezioni siete incoraggiati a 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. 

**Example Prova un esempio con JSFiddle**  
[https://jsfiddle.net/MTGT_Fiddle_Manager/bjc0y1vd/35/](https://jsfiddle.net/MTGT_Fiddle_Manager/bjc0y1vd/35/)  
 Prova un'[attività `<crowd-classifier>` di esempio](https://jsfiddle.net/MTGT_Fiddle_Manager/bjc0y1vd/35/). L'esempio è reso da JSFiddle, quindi tutte le variabili del modello vengono sostituite con valori codificati. Fai clic sul collegamento "View full instructions" (Visualizza istruzioni complete) per visualizzare un set di esempi con stile CSS esteso. Potete eseguire un fork del progetto per sperimentare le vostre modifiche al CSS, aggiungere immagini di esempio o aggiungere funzionalità estese. JavaScript 

**Example : modello di rilevamento intenti personalizzato finale**  
Questo utilizza l'[attività `<crowd-classifier>` di esempio](https://jsfiddle.net/MTGT_Fiddle_Manager/bjc0y1vd/35/), ma con una variabile per il `<classification-target>`. Se cerchi di mantenere un design CSS uniforme tra una serie di processi di etichettatura diversi, puoi includere un foglio di stile esterno utilizzando un elemento `<link rel...>` così come faresti 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>
```

**Example : 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`](sms-custom-templates-step2-demo1.md) 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 che devono essere convertiti in HTTP. In caso contrario, `source` deve essere utilizzato così com'è con le stringhe di testo precedenti.

## La tua funzione Lambda di pre-annotazione
<a name="sms-custom-templates-step2-demo2-pre-lambda"></a>

Come parte della configurazione del lavoro, fornisci l'ARN di AWS Lambda un file che può essere chiamato per elaborare le voci 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 tali valori all'oggetto `event['dataObject']`, saranno disponibili per il modello HTML come variabili Liquid con il formato `{{ task.input.<property name> }}`.

## La tua funzione Lambda di post-annotazione
<a name="sms-custom-templates-step2-demo2-post-lambda"></a>

Durante la configurazione del processo, specifica l'ARN di una funzione Lambda che può essere chiamata per elaborare i dati del modulo quando un worker completa un'attività. 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
<a name="sms-custom-templates-step2-demo2-job-output"></a>

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.

**Example : JSON nel manifest 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.