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"
}
]
}
]
}
リテラルは、公式ドキュメントに記載されているように、サンプルの発話でトレーニングを提供する必要があるという点で他のスロットタイプとは異なります。 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
現在、さまざまな質問に答えることができるAI(Alexa用)を開発しています。ユーザーがバックエンドで分析される複雑な質問を表現できることが非常に重要です。発話やスロットの種類が限られているために、Alexaが早期にそれらを削除した場合、そのようなサービスを提供することはできません。
現時点では、次のアプローチを試しています。 (実験はドイツ語に基づいていることに注意してください。他の言語は異なる動作をする可能性があります。)
1。Wordクラスごとのカスタムスロットタイプ
次のWordクラスに対してカスタムスロットタイプを定義しました:
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リストを試していました。しかし、これは何かを聞き損ねるリスクを高めます(英語の良い例はwriteとright、幸いなことに同じWordクラスに割り当てられていません)。そこで、非常にnarrowアプローチに切り替えました。リストにはAIで処理できる単語のみが含まれ、ナレッジベースに保存されます。たとえば、アイテムのリストには単語ponyまたはUnicorn。これにより、より良い結果が得られると思われます(わかりにくい答え)。
発話構造で定義されていない複雑な文は、操作するのが非常に複雑です。たとえば、文に2つ以上の動詞が含まれている場合(時制を構築するために必要な場合があります)。ただし、これまでのところ、ユーザーがある程度の礼儀正しく振る舞う限り、このアプローチは高いレベルの精度で結果を導きます。
しかし最後に:残念ながら、現時点では、メモのようなものを無限の量の異なる単語や文構造で口述することはできません。
ここでのコメントのいくつかによれば、カスタムスロット値フィールドに単語の大きなランダムリストを追加することで、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]
...
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
を使用できません。
私はこれに別のアプローチを試みました。
このような値のリストを持つ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個の十分なサンプル発話を入力すれば、正しい発話を問題なく実行できます。