3

可以将哪些示例添加到自定义插槽以使其接受任何单词或短语?

4

1 回答 1

3

更新

这个解决方案已经过时,引入了短语槽,例如。AMAZON.SearchQuery.

来自公告

短语槽旨在提高在创建交互模型时无法在槽中包含大多数可能值的技能的语音识别准确性。此类别中可用的第一个插槽是 AMAZON.SearchQuery 旨在为您提供更好的能力来收集用户的通用语音。

问题

在周末致力于开发城市词典技能以完善我的 Alexa 技能后,我遇到了一个我认为很多技能开发人员可能会遇到的问题。

TL;博士

即,您如何在自定义插槽上训练 Alexa 以便能够获取您给它的任何价值?

第一次尝试

起初,我在自定义插槽示例中添加了大约 5 个单词,例如 bae、boo、ship it。但我很快发现该技能只适用于这 5 个单词,并且对于该列表之外的单词,我不会调用我的 lambda 函数。

然后我用

from nltk.corpus import words
import json, random

words_list = random.shuffle(words.words()[:1000])

words_list = [word.lower() for word in words_list]
words_list = list(set(words_list))
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))

上面的代码使用 nltk,你可以安装它pip install nltk,根据你在代码编辑器下找到的模式生成 1000 个单词,它会产生一千个这样的单词;

{
    "id": null,
    "name": {
        "value": "amblygeusia",
        "synonyms": []
    }
}

我复制并粘贴了这些值,您可以在技能生成器页面的代码编辑器下找到整个文件。

  "languageModel": {
    "types": [
      {
        "name": "phrase", //my custom slot's name
        "values": [...] //pasted the thousand words generated here
...

在 Skills Builder UI 中保存和构建之后。这仅允许我的技能捕获单个单词槽值。我尝试以相同的方式生成 10 000 个单词并将它们添加为自定义槽的示例,但无法识别两个单词和三个单词的短语,并且该技能无法获得短语的定义,例如;

装运它

解决方案;

对我有用并且效果很好的是生成两个单词样本。尽管所有示例都是两个词,但该技能随后能够识别单个词值甚至三个词值。

这是使用 nltk 执行此操作的代码;

from nltk.corpus import words
import json, random

words_list = random.shuffle(words.words()[:1000])

words_list = [word.lower() for word in words_list]

words_list = list(set(words_list))

word_pairs = []
for word in words_list:
    pair = ' '.join(random.sample(words_list, 2))
    word_pairs.append(pair)

word_pairs = list(set(word_pairs))
for pair in word_pairs:
    value = {}
    value['id'] = None
    value['name'] = {}
    value['name']['value'] = pair
    value['name']['synonyms'] = []
    values.append(value)
print(json.dumps(values))

我把它放在一个名为custom_slot_value_geneator.py并运行它的文件中;

python3 custom_slot_value_geneator.py | xclip -selection c

这会生成值并将它们复制到剪贴板。

然后我将它们复制到值下的代码编辑器中,替换旧值

  "languageModel": {
    "types": [
      {
        "name": "phrase", //my custom slot's name
        "values": [...] //pasted the thousand two word pairss generated here
...

保存并构建。

而已!然后,您的技能将能够识别您的自定义槽的任何单词或短语,无论它是否在您生成的示例中!

于 2018-02-04T20:30:13.783 回答