web-dev-qa-db-ja.com

リストではないカスタムスロットタイプを定義するにはどうすればよいですか?

Alexa Skills Kit(Amazon Echo用)で遊んでいるときに、AWS Lambda関数にインテントを送信するスキルを作成します。

サンプルの発話は次のようになります。

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

これにより、「アレクサ、秘書にメモを取ってもらい、今日家に帰る途中で店に行くように思い出させてください」と言ってから、Lambda関数から「行くように思い出させて」というメールを受け取ることができます。今日家に帰る途中の店。」

myMemoスロットは自由形式です-この時点では1つまたは2つの文で十分ですが、このようなスキーマを作成する方法についてのドキュメントにはあまり役立ちません。現時点で私の最高の推測は失敗します:

エラー:リクエストに問題がありました:不明なスロット名 '{myMemo}'。 1行目のサンプル 'MemoIntent take a memo {myMemo}'で発生しました。

私はAmazon.LITERALスロットタイプを使用していますが、これはドキュメントでは推奨されていませんが、他の方法についての提案も提供していません。さらに、私が言ったように、それは失敗します。

失敗するスキーマは次のとおりです。

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

リテラルは、公式ドキュメントに記載されているように、サンプルの発話でトレーニングを提供する必要があるという点で他のスロットタイプとは異なります。 https://developer.Amazon.com/public/solutions/Alexa/alexa-skills-kit/docs/Alexa-skills-kit-interaction-model-reference

サンプルの発話構文

サンプルの発話は、ユーザーが定義した意図にユーザーが話すことができるフレーズをマップします。次の形式を使用して、プレーンテキストファイルに行として書き込まれます。

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}

上記の形式は、Amazon.LITERALを除くすべてのスロットタイプに適用されることに注意してください。 Amazon.LITERALの場合、サンプルスロット値も指定する必要があります:

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

または、カスタムスロットを使用すると、多数のサンプルカスタムスロット値を定義した後にスロットを提供できます。このシナリオでは、MY_MEMOなどのタイプのカスタムスロット名を使用して、myMemoという新しいカスタムスロットを作成します。カスタムスロットの値には、次のような潜在的な値が入力されます(受信する値はこれらだけではありません)。

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

現在、さまざまな質問に答えることができるAI(Alexa用)を開発しています。ユーザーがバックエンドで分析される複雑な質問を表現できることが非常に重要です。発話やスロットの種類が限られているために、Alexaが早期にそれらを削除した場合、そのようなサービスを提供することはできません。

現時点では、次のアプローチを試しています。 (実験はドイツ語に基づいていることに注意してください。他の言語は異なる動作をする可能性があります。)

1。Wordクラスごとのカスタムスロットタイプ

次のWordクラスに対してカスタムスロットタイプを定義しました:

  • 尋問(何、誰、いつ)
  • アイテム(サイバーセキュリティ、ダークネット、マルウェア)
  • 動詞(is、has、can)
  • 形容詞(一般的、安価、安全でない)
  • 代名詞(彼、彼女)

2。文構造の発話のサンプル

次に、サンプルの発話を含む文に対して、可能な構造を定義しました:

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}

。バックエンドでのNLP分析

次に、バックエンドで送信された単語のNLP分析を行います。受信したデータは次のようになります。

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

いくつかの単語は失われ、他のいくつかは誤解されるかもしれません。この場合、以前の交換のトピックを記憶し、不足している単語をこれらで「埋める」。例えば: What is {it}?What is {Darknet}?

スロットタイプのリストのbroadリストを試していました。しかし、これは何かを聞き損ねるリスクを高めます(英語の良い例はwriteright、幸いなことに同じWordクラスに割り当てられていません)。そこで、非常にnarrowアプローチに切り替えました。リストにはAIで処理できる単語のみが含まれ、ナレッジベースに保存されます。たとえば、アイテムのリストには単語ponyまたはUnicorn。これにより、より良い結果が得られると思われます(わかりにくい答え)。

発話構造で定義されていない複雑な文は、操作するのが非常に複雑です。たとえば、文に2つ以上の動詞が含まれている場合(時制を構築するために必要な場合があります)。ただし、これまでのところ、ユーザーがある程度の礼儀正しく振る舞う限り、このアプローチは高いレベルの精度で結果を導きます。

しかし最後に:残念ながら、現時点では、メモのようなものを無限の量の異なる単語や文構造で口述することはできません。

4
Marc Ruef

ここでのコメントのいくつかによれば、カスタムスロット値フィールドに単語の大きなランダムリストを追加することで、Alexaに自由形式の単語またはフレーズを認識させることができることがわかりました。

実行して鉱山を生成しました。

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

次に、これらの値をコピーして貼り付けます。

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

Amazon.SearchQuery

Amazon.SearchQueryスロットタイプを使用すると、検索クエリを構成する予測不可能な入力をキャプチャできます。

例:

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

Amazon.SearchQueryの詳細 ここ

Amazon.LITERALスロットがあり、変換なしでスロット値に認識された単語を渡します。しかし、推奨されていません。 ダイアログモデルで設定されたスキルではAmazon.LITERALを使用できません。

1
Cicil Thomas

私はこれに別のアプローチを試みました。

このような値のリストを持つCustom Slot Typeを作成しました。

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

必要な長さの文字列でリストを継続できます。

私の推測では、Alexaは、スロットを埋めようとするときに、スロットタイプの値に含まれるスペースで区切られた単語の量を、聞いたものと一致するように方向付けます。

このカスタムスロットタイプを使用して、1つのスロットで文全体を取得することにかなり成功しました。発話としてスロットだけではなく、インテントでテストしたことはありませんが。

しかし、意図を分離すればうまくいくかもしれません。たぶんこのようなものです。

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

ただし、注意する必要があります。他の意図に対して十分なサンプル発話がない場合、意図を混乱させる可能性があります。

StartMemoIntentを使用して、少なくとも7〜8個の十分なサンプル発話を入力すれば、正しい発話を問題なく実行できます。

1
A.Kraus