web-dev-qa-db-fra.com

Comment définir un type d'emplacement personnalisé qui n'est pas une liste?

Je m'amuse avec le Alexa Skills Kit (pour Amazon Echo) et souhaite créer une compétence qui transmettrait l'intention à une fonction AWS Lambda qui ne ferait que m'envoyer un courrier électronique.

Les expressions de l'échantillon ressemblent à ceci:

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

Cela me permettrait de dire quelque chose comme: "Alexa, demande à ma secrétaire de prendre une note de service, rappelle-moi d'aller au magasin en rentrant chez moi aujourd'hui" et recevra ensuite un courrier électronique de ma fonction Lambda disant le magasin sur mon retour à la maison aujourd'hui. "

L'emplacement myMemo est une forme libre - à ce stade, une phrase ou deux suffiront, mais je ne trouve pas beaucoup d'aide dans la documentation pour savoir comment écrire le schéma pour quelque chose comme ceci. Ma meilleure estimation pour le moment échoue avec un:

Erreur: Il y avait un problème avec votre demande: nom de logement inconnu '{myMemo}'. Survenu dans l'exemple 'MemoIntent prend un mémo {myMemo}' sur ligne 1.

J'utilise le type de logement Amazon.LITERAL, ce que déconseille la documentation, mais il ne contient aucune suggestion sur la manière de procéder. Et en plus, comme je l'ai mentionné, cela échoue.

Voici le schéma qui échoue:

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

Les littéraux sont différents des autres types d’emplacements en ce sens que vous devez fournir une formation à l’exemple d’énoncé, comme indiqué dans la documentation officielle: https://developer.Amazon.com/public/solutions/Alexa/alexa-skills- kit/docs/Alexa-skills-kit-interaction-model-reference

Exemple de syntaxe des expressions

Des exemples d'énoncés permettent de mapper les phrases que l'utilisateur peut exprimer conformément aux intentions que vous avez définies. Ils sont écrits sous forme de lignes dans un fichier texte brut, au format suivant:

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}

Notez que le format ci-dessus s'applique à tous les types d'emplacement, à l'exception d'Amazon.LITERAL. Pour Amazon.LITERAL, vous devez également spécifier un exemple de valeur de slot:

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

Sinon, l’utilisation des emplacements personnalisés vous permettra de fournir l’emplacement après avoir défini de nombreux exemples de valeurs d’emplacement personnalisées. Dans ce scénario, vous créez un nouvel emplacement personnalisé appelé myMemo avec un type du nom de l'emplacement personnalisé, tel que MY_MEMO. La valeur de votre emplacement personnalisé serait renseignée avec des valeurs potentielles (celles-ci ne seront pas les seules à recevoir), telles que:

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

Nous développons actuellement une intelligence artificielle (pour Alexa) qui devrait pouvoir répondre à une grande variété de questions. Il est très important que les utilisateurs soient capables de formuler des questions complexes qui doivent être analysées dans le backend. Si Alexa les abandonne rapidement à cause d'énoncés limités et de types d'emplacement, nous ne pouvons pas fournir un tel service.

Pour le moment, nous expérimentons l'approche suivante. (N'oubliez pas que notre expérience repose sur l'allemand. D'autres langues peuvent se comporter différemment.)

1. Types d'emplacement personnalisés par classe de mots

Nous avons défini types d'emplacement personnalisés pour les classes Word suivantes:

  • interrogatoire (quoi, qui, quand)
  • élément (cybersécurité, darknet, malware)
  • verbe (est, a, peut)
  • adjectif (populaire, peu coûteux, peu sûr)
  • pronom (le, il, elle)

2. Exemples de phrases pour la structure de la phrase

Ensuite, nous avons défini structures possibles pour les phrases avec exemples de prononciation:

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. Analyse de la PNL dans le backend

Ensuite, nous faisons une analyse PNL des mots soumis dans le backend. Les données reçues ressemblent à ceci:

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

Certains mots peuvent être perdus, d'autres peuvent être mal compris. Dans ce cas, nous nous souvenons des sujets des échanges précédents et "remplissons" les mots manquants avec ceux-ci. Par exemple: What is {it}?What is {Darknet}?

Nous essayions avec une liste large de listes de types d’emplacements. Mais cela augmente le risque de mal comprendre quelque chose (un bon exemple en anglais est write et right, heureusement ils ne sont pas affectés à la même classe Word). Nous sommes donc passés à une approche très étroit. Les listes ne contiennent que des mots qui peuvent être gérés par l'IA et sont stockés dans la base de connaissances. Par exemple, la liste des éléments ne contient pas les mots pony ou Unicorn. Nous nous attendons à ce que cela donne de meilleurs résultats (réponses moins déroutantes).

Les phrases complexes qui ne sont pas définies avec une structure d'énoncés sont très difficiles à utiliser. Par exemple, si une phrase contient plus de 2 verbes (ce qui peut être nécessaire pour construire le temps). Mais jusqu'à présent, notre approche aboutit à des résultats avec un bon niveau de précision, à condition que l'utilisateur se comporte avec un certain degré de politesse.

Mais au final: Malheureusement, pour le moment, il n’est pas possible de dicter quelque chose comme un mémo avec une quantité infinie de mots différents et de structures de phrases différentes.

4
Marc Ruef

Selon certains commentaires, j'ai découvert que vous pouvez faire en sorte qu'Alexa reconnaisse des mots ou des expressions de forme libre en ajoutant une grande liste de mots au hasard dans le champ des valeurs de créneau personnalisé.

J'ai généré le mien en courant;

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

Puis copiez en collant ces valeurs dans;

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

Amazon.SearchQuery 

Le type d'emplacement Amazon.SearchQuery vous permet de capturer une entrée moins prévisible qui constitue la requête de recherche.

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}"
      ]
    }
  ]
}

Plus sur Amazon.SearchQueryici

Il y a un emplacement Amazon.LITERAL qui transmet les mots reconnus pour la valeur de l'emplacement sans conversion. Mais, ce n'est pas recommandé. Vous ne pouvez pas utiliser Amazon.LITERAL dans une compétence configurée avec un modèle de dialogue.

1
Cicil Thomas

J'ai essayé une autre approche à cela.

J'ai créé un Type de logement personnalisé avec une liste de valeurs comme celle-ci.

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

Vous pouvez continuer la liste avec des chaînes aussi longues que nécessaire.

J'imaginais qu'Alexa, en essayant de remplir des créneaux, orientait la quantité de mots séparés par une valeur d'un type de créneau, pour correspondre à ce qu'il avait entendu.

J'ai eu un certain succès en saisissant des phrases entières dans un seul emplacement avec ce type d'emplacement personnalisé. Bien que je ne l'ai jamais testé sur des intentions avec plus que la fente comme énoncé.

Mais si vous séparez votre intention, cela pourrait fonctionner. Peut-être quelque chose comme ça.

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

Vous devez cependant faire attention, cela peut brouiller les intentions si vous n'avez pas assez d'énoncés d'échantillon pour vos autres intentions.

Si vous mettez suffisamment d’échantillons d’échantillons, au moins 7 à 8, avec StartMemoIntent, vous ne devriez pas avoir de difficulté à choisir le bon.

1
A.Kraus