如何定义不是列表的自定义插槽类型?
How do I define a custom slot type that isn't a list?
我正在使用 Alexa Skills Kit(用于 Amazon Echo)并想创建一种技能,将意图发送到 AWS Lambda 函数,该函数会通过电子邮件将内容发回给我。
示例话语如下所示:
MemoIntent take a memo {myMemo}
MemoIntent to take a memo {myMemo}
MemoIntent send a memo {myMemo}
这将允许我说类似 "Alexa, ask my secretary to take a memo, remind me to go to the store on my way home today" 的内容,然后会收到一封来自我的 Lambda 函数的电子邮件,内容为 "remind me to go to the store on my way home today."
myMemo
槽是自由格式的——此时只需一两句话就可以了,但我在文档中没有找到很多关于如何为这样的东西编写模式的帮助。我目前最好的猜测失败了:
Error: There was a problem with your request: Unknown slot name
'{myMemo}'. Occurred in sample 'MemoIntent take a memo {myMemo}' on
line 1.
我正在使用 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
或者,使用自定义插槽将允许您在定义多个示例自定义插槽值后提供插槽。在这种情况下,您将创建一个名为 myMemo 的新自定义槽,其类型为自定义槽名称,例如 MY_MEMO
。您的自定义槽值将填充潜在值(这些不是它将收到的唯一值),例如:
walk the dog
eat more bacon
go to the store on the way home
我们目前正在开发一个 AI(用于 Alexa),它应该能够回答各种各样的问题。用户能够表达复杂的问题非常重要,这些问题将在后台进行分析。如果 Alexa 由于话语和插槽类型有限而提前放弃它们,我们将无法提供此类服务。
目前我们正在试验以下方法。 (请记住,我们的实验基于德语。其他语言的表现可能有所不同。)
1.每个字的自定义插槽类型 Class
我们为以下字classes定义了自定义槽类型:
- 审讯(什么,谁,什么时候)
- 项目(网络安全、暗网、恶意软件)
- 动词(是,有,可以)
- 形容词(流行、便宜、不安全)
- 代词(他,她)
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}
3。后端 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"
}
}
}
有些词可能会丢失,有些词可能会听错。在这种情况下,我们会记住早期交流中的主题和 "fill" 缺少的单词。例如:What is {it}?
⇒ What is {Darknet}?
我们正在试验一个 广泛的 插槽类型列表列表。但这增加了听错的风险(英语中的一个很好的例子是 write 和 right,幸运的是它们没有分配给同一个词 class).所以我们改用了一种非常 狭窄 的方法。这些列表仅包含 AI 可以处理并存储在知识库中的单词。例如,项目列表不包含单词 pony 或 unicorn。我们希望这会产生更好的结果(不那么令人困惑的答案)。
没有用话语结构定义的复杂句子使用起来非常混乱。例如,如果一个句子包含 2 个以上的动词(这可能是构建时态所必需的)。但到目前为止,只要用户表现出一定程度的礼貌,我们的方法就会产生准确度很高的结果。
但最后:不幸的是,目前无法口述像备忘录这样的东西,其中包含无数不同的单词和句子结构。
我尝试了另一种方法。
我创建了一个自定义插槽类型,其中包含这样一个值列表。
wordOne
wordOne wordTwo
wordOne wordTwo wordThree
wordOne wordTwo wordThree wordFour
wordOne wordTwo wordThree wordFour wordFive
您可以根据需要使用任意长的字符串继续列表。
我的猜测是,Alexa 在尝试填充插槽时,会根据插槽类型值中 space 个分隔词的数量来定位,以匹配它听到的内容。
使用此自定义槽类型,我在单个槽中抓取整个句子取得了相当大的成功。虽然我从来没有在意图上测试过它,而不仅仅是作为话语的插槽。
但是,如果您将意图分开,它可能会起作用。也许是这样的。
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 个,那么选择正确的话语应该没有问题。
根据此处的一些评论,我发现您可以通过向自定义槽值字段添加大量随机单词列表来让 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
here
有 AMAZON.LITERAL
个插槽,它传递插槽值的已识别单词而不进行转换。但是,不推荐这样做。 您不能在配置了对话模型的技能中使用AMAZON.LITERAL
。
我正在使用 Alexa Skills Kit(用于 Amazon Echo)并想创建一种技能,将意图发送到 AWS Lambda 函数,该函数会通过电子邮件将内容发回给我。
示例话语如下所示:
MemoIntent take a memo {myMemo}
MemoIntent to take a memo {myMemo}
MemoIntent send a memo {myMemo}
这将允许我说类似 "Alexa, ask my secretary to take a memo, remind me to go to the store on my way home today" 的内容,然后会收到一封来自我的 Lambda 函数的电子邮件,内容为 "remind me to go to the store on my way home today."
myMemo
槽是自由格式的——此时只需一两句话就可以了,但我在文档中没有找到很多关于如何为这样的东西编写模式的帮助。我目前最好的猜测失败了:
Error: There was a problem with your request: Unknown slot name '{myMemo}'. Occurred in sample 'MemoIntent take a memo {myMemo}' on line 1.
我正在使用 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
或者,使用自定义插槽将允许您在定义多个示例自定义插槽值后提供插槽。在这种情况下,您将创建一个名为 myMemo 的新自定义槽,其类型为自定义槽名称,例如 MY_MEMO
。您的自定义槽值将填充潜在值(这些不是它将收到的唯一值),例如:
walk the dog
eat more bacon
go to the store on the way home
我们目前正在开发一个 AI(用于 Alexa),它应该能够回答各种各样的问题。用户能够表达复杂的问题非常重要,这些问题将在后台进行分析。如果 Alexa 由于话语和插槽类型有限而提前放弃它们,我们将无法提供此类服务。
目前我们正在试验以下方法。 (请记住,我们的实验基于德语。其他语言的表现可能有所不同。)
1.每个字的自定义插槽类型 Class
我们为以下字classes定义了自定义槽类型:
- 审讯(什么,谁,什么时候)
- 项目(网络安全、暗网、恶意软件)
- 动词(是,有,可以)
- 形容词(流行、便宜、不安全)
- 代词(他,她)
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}
3。后端 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"
}
}
}
有些词可能会丢失,有些词可能会听错。在这种情况下,我们会记住早期交流中的主题和 "fill" 缺少的单词。例如:What is {it}?
⇒ What is {Darknet}?
我们正在试验一个 广泛的 插槽类型列表列表。但这增加了听错的风险(英语中的一个很好的例子是 write 和 right,幸运的是它们没有分配给同一个词 class).所以我们改用了一种非常 狭窄 的方法。这些列表仅包含 AI 可以处理并存储在知识库中的单词。例如,项目列表不包含单词 pony 或 unicorn。我们希望这会产生更好的结果(不那么令人困惑的答案)。
没有用话语结构定义的复杂句子使用起来非常混乱。例如,如果一个句子包含 2 个以上的动词(这可能是构建时态所必需的)。但到目前为止,只要用户表现出一定程度的礼貌,我们的方法就会产生准确度很高的结果。
但最后:不幸的是,目前无法口述像备忘录这样的东西,其中包含无数不同的单词和句子结构。
我尝试了另一种方法。
我创建了一个自定义插槽类型,其中包含这样一个值列表。
wordOne
wordOne wordTwo
wordOne wordTwo wordThree
wordOne wordTwo wordThree wordFour
wordOne wordTwo wordThree wordFour wordFive
您可以根据需要使用任意长的字符串继续列表。
我的猜测是,Alexa 在尝试填充插槽时,会根据插槽类型值中 space 个分隔词的数量来定位,以匹配它听到的内容。
使用此自定义槽类型,我在单个槽中抓取整个句子取得了相当大的成功。虽然我从来没有在意图上测试过它,而不仅仅是作为话语的插槽。
但是,如果您将意图分开,它可能会起作用。也许是这样的。
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 个,那么选择正确的话语应该没有问题。
根据此处的一些评论,我发现您可以通过向自定义槽值字段添加大量随机单词列表来让 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
here
有 AMAZON.LITERAL
个插槽,它传递插槽值的已识别单词而不进行转换。但是,不推荐这样做。 您不能在配置了对话模型的技能中使用AMAZON.LITERAL
。