it-swarm.com.de

Wie definiere ich einen benutzerdefinierten Slot-Typ, der keine Liste ist?

Ich spiele mit dem Alexa Skills Kit (für das Amazon Echo) herum und möchte eine Fertigkeit erstellen, die die Absicht an eine AWS Lambda-Funktion schickt, die mir etwas per E-Mail sendet.

Muster-Äußerungen würden ungefähr so ​​aussehen:

MemoIntent take a memo {myMemo}
MemoIntent to take a memo {myMemo}
MemoIntent send a memo {myMemo}

Dies würde mir erlauben, etwas zu sagen wie "Alexa, bitte meine Sekretärin, ein Memo mitzunehmen, erinnere mich daran, heute auf dem Heimweg in den Laden zu gehen" und würde dann eine E-Mail von meiner Lambda-Funktion mit der Aufforderung erhalten, "Erinnere mich daran, zu gehen." der Laden auf meinem Heimweg heute. "

Der myMemo-Slot ist Freiform - zu diesem Zeitpunkt reicht ein oder zwei Sätze, aber in der Dokumentation finde ich keine Hilfe, wie man das Schema für so etwas schreibt. Meine derzeitige Vermutung scheitert an einem:

Fehler: Bei Ihrer Anfrage ist ein Problem aufgetreten: Unbekannter Steckplatzname '{myMemo}'. In Beispiel 'MemoIntent take a memo {myMemo}' am .__ aufgetreten. Linie 1.

Ich verwende den Slot-Typ Amazon.LITERAL, den die Dokumentation abschreckt, aber er enthält auch keine Vorschläge, wie dies weitergehen soll. Und außerdem, wie ich schon erwähnt habe, versagt es.

Hier ist das Schema, das fehlschlägt:

{
    "intents": [
        {
            "intent": "MemoIntent",
            "slots": [
                {
                    "name": "myMemo",
                    "type": "Amazon.LITERAL"
                }
            ]
        }
    ]
}
30
thetaiko

Literale unterscheiden sich von anderen Slot-Typen darin, dass Sie eine Schulung in der Beispieläußerung durchführen müssen, wie in der offiziellen Dokumentation angegeben: https://developer.Amazon.com/public/solutions/Alexa/alexa-skills- kit/docs/Alexa-skills-kit-interaktionsmodellreferenz

Beispielausdrücke Syntax

Beispiel-Äußerungen bilden die Phrasen ab, die der Benutzer mit den von Ihnen definierten Absichten sprechen kann. Sie werden als Zeilen in einer Nur-Text-Datei mit folgendem Format geschrieben:

IntentName  this is a sample utterance with no slots
IntentName  this is a sample utterance containing a {SlotName}
IntentName  this is a sample utterance containing a {SlotName} and {AnotherSlotName}

Beachten Sie, dass das obige Format für alle Slot-Typen außer Amazon.LITERAL gilt. Für Amazon.LITERAL müssen Sie auch einen Beispielwert für den Slot angeben:

IntentName  this is a sample utterance containing a {slot value|SlotName} using LITERAL

Bei Verwendung von benutzerdefinierten Slots können Sie den Slot alternativ angeben, nachdem Sie zahlreiche Werte für benutzerdefinierte Beispielslots definiert haben. In diesem Szenario würden Sie einen neuen benutzerdefinierten Steckplatz namens myMemo mit einem Typ des benutzerdefinierten Steckplatznamens erstellen, z. B. MY_MEMO. Ihr benutzerdefinierter Slot-Wert wird mit potenziellen Werten aufgefüllt (dies sind nicht die einzigen Werte, die er erhält), z.

walk the dog
eat more bacon
go to the store on the way home
24

Wir entwickeln derzeit eine KI (für Alexa), die eine Vielzahl von Fragen beantworten kann. Es ist sehr wichtig, dass Benutzer komplexe Fragen formulieren können, die im Backend analysiert werden sollen. Wenn Alexa sie aufgrund begrenzter Äußerungen und Slot-Typen frühzeitig fallen lässt, können wir einen solchen Service nicht anbieten.

Im Moment experimentieren wir mit dem folgenden Ansatz. (Denken Sie daran, dass unser Experiment auf Deutsch basiert. Andere Sprachen verhalten sich möglicherweise anders.)

1. Benutzerdefinierte Slot-Typen pro Wortklasse

Wir haben benutzerdefinierte Slot-Typen für die folgenden Word-Klassen definiert:

  • befragung (was, wer, wann)
  • artikel (Internetsicherheit, Darknet, Malware)
  • verb (ist, hat, kann)
  • adjektiv (beliebt, preiswert, unsicher)
  • pronomen (das, er, sie)

2. Stichprobenausdrücke für die Satzstruktur

Dann haben wir mögliche Strukturen für Sätze mit Beispieläußerungen definiert:

QuestionIntent {Interrogation}
QuestionIntent {Item}
QuestionIntent {Verb}
QuestionIntent {Adjective}
QuestionIntent {Interrogation} {Verb} {Item}
QuestionIntent {Interrogation} {Verb} {Item} {Adjective}
QuestionIntent {Interrogation} {Verb} {Pronoun} {Item}
QuestionIntent {Interrogation} {Verb} {Pronoun} {Pronoun} {Item}
QuestionIntent {Interrogation} {Verb} {Pronoun} {Item} {Preposition} {Item}
QuestionIntent {Interrogation} {Verb} {Adjective} {Item}
QuestionIntent {Interrogation} {Verb} {Pronoun} {Adjective} {Item}
QuestionIntent {Interrogation} {Item} {Verb}
QuestionIntent {Interrogation} {Item} {Verb} {Adjective}
QuestionIntent {Interrogation} {Item} {Verb} {Pronoun} {Adjective}
QuestionIntent {Item} {Verb} {Interrogation}
QuestionIntent {Verb} {Item} {Verb}
QuestionIntent {Verb} {Adjective} {Item} {Verb}

3. NLP-Analyse im Backend

Anschließend führen wir eine NLP-Analyse der im Backend eingereichten Wörter durch. Die empfangenen Daten sehen folgendermaßen aus:

"intent": {
      "name": "QuestionIntent",
      "slots": {
        "Item": {
          "name": "Item",
          "value": "darknet"
        },
        "Preposition": {
          "name": "Preposition"
        },
        "Adjective": {
          "name": "Adjective"
        },
        "Verb": {
          "name": "Verb",
          "value": "is"
        },
        "Interrogation": {
          "name": "Interrogation",
          "value": "what"
        },
        "Pronoun": {
          "name": "Pronoun",
          "value": "the"
        }
      }
    }

Einige Wörter könnten verloren gehen, andere könnten vermisst werden. In diesem Fall erinnern wir uns an Themen aus früheren Austauschen und "füllen" die fehlenden Wörter damit. Zum Beispiel: What is {it}?What is {Darknet}?

Wir experimentierten mit einer breit Liste von Listen für Slot-Typen. Dies erhöht jedoch das Risiko, etwas falsch zu verstehen (ein gutes Beispiel in Englisch ist write und right, zum Glück werden sie nicht derselben Word-Klasse zugeordnet. Also haben wir zu einem sehr schmalen Ansatz gewechselt. Die Listen enthalten nur Wörter, die von der KI bearbeitet werden können und in der Wissensbasis gespeichert sind. Beispielsweise enthält die Liste der Elemente nicht die Wörter Pony oder Unicorn. Wir erwarten, dass dies zu besseren Ergebnissen führt (weniger verwirrende Antworten).

Komplexe Sätze, die nicht mit einer Äußerungsstruktur definiert sind, sind sehr verwirrend für die Arbeit. Zum Beispiel, wenn ein Satz mehr als 2 Verben enthält (was zum Aufbau der Zeit erforderlich sein kann). Bisher führt unser Ansatz jedoch zu Ergebnissen mit einer guten Genauigkeit, solange sich der Benutzer mit einer gewissen Höflichkeit verhält.

Aber am Ende: Leider ist es momentan nicht möglich, so etwas wie ein Memo mit unendlich vielen verschiedenen Wörtern und Satzstrukturen zu diktieren.

4
Marc Ruef

Nach einigen Kommentaren hier habe ich herausgefunden, dass Sie Alexa dazu bringen können, Wörter oder Ausdrücke in freier Form zu erkennen, indem Sie eine große Liste von Wörtern in das Feld für benutzerdefinierte Slot-Werte einfügen.

Ich habe meine durch Laufen erzeugt;

from nltk.corpus import words
import json

words_list = words.words()[:100]

values = []
for Word in words_list: 
    value = {}
    value['id'] = None
    value['name'] = {}
    value['name']['value'] = Word
    value['name']['synonyms'] = []
    values.append(value)

print(json.dumps(values))

Kopieren Sie dann das Einfügen dieser Werte in;

{
  "languageModel": {
    "types": [
      {
        "name": "phrase",
        "values": [values you get from above]
...
1
Jonathan

Amazon.SearchQuery 

Mit dem Slot-Typ Amazon.SearchQuery können Sie weniger vorhersehbare Eingaben erfassen, aus denen die Suchabfrage besteht.

Ex:

{
  "intents": [
    {
      "name": "SearchIntent",
      "slots": [
        {
          "name": "Query",
          "type": "Amazon.SearchQuery"
        },
        {
          "name": "CityList",
          "type": "Amazon.US_CITY"
        }
      ],
      "samples": [
        "search for {Query} near me",
        "find out {Query}",
        "search for {Query}",
        "give me details about {CityList}"
      ]
    }
  ]
}

Mehr zu Amazon.SearchQueryhier

Es gibt einen Amazon.LITERAL-Slot, der die erkannten Wörter für den Slot-Wert ohne Konvertierung übergibt. Aber es ist nicht zu empfehlen. Sie können Amazon.LITERAL nicht in einer Fertigkeit verwenden, die mit einem Dialogmodell konfiguriert ist.

1
Cicil Thomas

Ich habe einen anderen Ansatz versucht.

Ich habe einen Custom Slot Type mit einer Liste solcher Werte erstellt.

wordOne
wordOne wordTwo
wordOne wordTwo wordThree
wordOne wordTwo wordThree wordFour
wordOne wordTwo wordThree wordFour wordFive

Sie können die Liste mit beliebig langen Zeichenfolgen fortsetzen.

Meine Vermutung war, dass Alexa sich beim Ausfüllen der Slots an der Menge der durch Leerzeichen getrennten Wörter in einem Wert eines Slot-Typs orientiert, um sich an das Gehörte anzupassen.

Ich hatte ziemlich viel Erfolg damit, ganze Sätze in einem einzigen Slot mit diesem benutzerdefinierten Slot-Typ zu packen. Obwohl ich es noch nie in mehr als nur dem Slot als Äußerung getestet habe.

Wenn Sie Ihre Absicht jedoch trennen, könnte es funktionieren. Vielleicht so etwas.

StartMemoIntent take a memo
StartMemoIntent to take a memo
StartMemoIntent send a memo
StartMemoIntent record a memo
StartMemoIntent listen to my memo
RecordMemoIntent {memo}

Sie müssen jedoch vorsichtig sein, es kann die Absichten durcheinander bringen, wenn Sie nicht genügend Probenäußerungen für Ihre anderen Absichten haben.

Wenn Sie mit dem StartMemoIntent genügend Probenäußerungen von mindestens 7-8 eingeben, sollte es keine Probleme geben, die richtige zu verwenden.

1
A.Kraus