

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

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.

**Topics**
+ [Benutzerdefinierte Vorlage für die Starter-Absichtserkennung](#sms-custom-templates-step2-demo2-base-template)
+ [Ihre benutzerdefinierte Vorlage für die Absichtserkennung](#sms-custom-templates-step2-demo2-your-template)
+ [Ihre Lambda-Funktion zur Vorverarbeitung](#sms-custom-templates-step2-demo2-pre-lambda)
+ [Ihre Lambda-Funktion zur Nachbereitung](#sms-custom-templates-step2-demo2-post-lambda)
+ [Die Ausgabe Ihres Kennzeichnungsauftrags](#sms-custom-templates-step2-demo2-job-output)

## Benutzerdefinierte Vorlage für die Starter-Absichtserkennung
<a name="sms-custom-templates-step2-demo2-base-template"></a>

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)](https://shopify.github.io/liquid/) und jedes dieser Elemente zwischen doppelten geschweiften Klammern ist eine Variable. Die AWS Lambda-Funktion vor der Anmerkung sollte ein Objekt mit dem Namen bereitstellen, `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
<a name="sms-custom-templates-step2-demo2-your-template"></a>

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

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 HTML und CSS verwenden. JavaScript In diesen Abschnitten werden Sie auch dazu ermutigt, wenn Sie glauben, aussagekräftige Anweisungen und Beispiele bereitstellen zu können, die Ihren Mitarbeitern helfen, Ihre Aufgaben schneller und genauer zu erledigen. 

**Example Probieren Sie ein Beispiel aus mit JSFiddle**  
[https://jsfiddle.net/MTGT_Fiddle_Manager/bjc0y1vd/35/](https://jsfiddle.net/MTGT_Fiddle_Manager/bjc0y1vd/35/)  
 Probieren Sie eine Beispielaufgabe für [https://jsfiddle.net/MTGT_Fiddle_Manager/bjc0y1vd/35/](https://jsfiddle.net/MTGT_Fiddle_Manager/bjc0y1vd/35/) aus. Das Beispiel wird von gerendert JSFiddle, daher werden alle Template-Variablen durch hartcodierte Werte ersetzt. Klicken Sie auf den Link „View full instructions” (Vollständige Anweisungen anzeigen), um sich eine Reihe von Beispielen mit erweitertem CSS-Styling anzeigen zu lassen. Sie können das Projekt forken, um mit Ihren eigenen Änderungen am CSS zu experimentieren, Beispielbilder hinzuzufügen oder erweiterte JavaScript Funktionen hinzuzufügen.

**Example : Benutzerdefinierte Abschlussvorlage für die Absichtserkennung**  
Hierzu wird die Beispielaufgabe [https://jsfiddle.net/MTGT_Fiddle_Manager/bjc0y1vd/35/](https://jsfiddle.net/MTGT_Fiddle_Manager/bjc0y1vd/35/)verwendet, jedoch mit einer Variablen für das `<classification-target>`. Wenn Sie versuchen, ein einheitliches CSS-Design im Rahmen einer Reihe von verschiedenen Kennzeichnungsaufträgen aufrechtzuerhalten, können Sie ein externes Stylesheet mit einem `<link rel...>`-Element einbinden, wie Sie es von jedem anderen HTML-Dokument gewohnt sind.  

```
<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 : 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`](sms-custom-templates-step2-demo1.md)” 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, die in HTTP konvertiert werden müssen. Andernfalls sollte `source` so wie bei den obigen Textzeichenfolgen verwendet werden.

## Ihre Lambda-Funktion zur Vorverarbeitung
<a name="sms-custom-templates-step2-demo2-pre-lambda"></a>

Geben Sie im Rahmen der Auftragseinrichtung den ARN eines an, 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 Objekt `event['dataObject']` Eigenschaften mit diesen Werten hinzufügen, werden diese Ihrer HTML-Vorlage als Liquird-Variablen mit dem Format `{{ task.input.<property name> }}` zur Verfügung stehen.

## Ihre Lambda-Funktion zur Nachbereitung
<a name="sms-custom-templates-step2-demo2-post-lambda"></a>

Im Rahmen der Auftragseinrichtung müssen Sie den ARN einer Lambda-Funktion bereitstellen, der aufgerufen werden kann, um die Formulardaten zu verarbeiten, wenn ein Worker eine Aufgabe beendet. 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
<a name="sms-custom-templates-step2-demo2-job-output"></a>

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.

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