Какие образцы можно добавить в пользовательский слот, чтобы он принимал любое слово или фразу?
Пользовательский слот Alexa, который принимает любое слово или фразу
Ответы (1)
Обновить
Это решение устарело с введением слотов фраз, например. AMAZON.SearchQuery
.
Из Объявления
Слоты фраз предназначены для повышения точности распознавания речи для навыков, когда вы не можете включить в слот большинство возможных значений при создании модели взаимодействия. Первый слот, доступный в этой категории, — AMAZON.SearchQuery разработан, чтобы предоставить вам улучшенную возможность собирать общую речь пользователей.
Проблема
Работая на выходных над развитием навыков городского словаря, чтобы отточить свои навыки работы с Alexa, я столкнулся с проблемой, с которой, я думаю, могут столкнуться многие разработчики навыков.
TL;DR
А именно, как вы тренируете Alexa в пользовательском слоте, чтобы она могла принимать любое значение, которое вы ей даете?
Первые попытки
Сначала я добавил около 5 слов в образцы пользовательских слотов, таких как bae, boo, ship it. Но я быстро обнаружил, что этот навык будет работать только с этими 5 словами, и я не буду получать вызовы моей лямбда-функции для слов вне этого списка.
Затем я использовал
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": []
}
}
Я скопировал и вставил их под значениями, вы можете найти весь файл в редакторе кода на странице Skills Builder.
"languageModel": {
"types": [
{
"name": "phrase", //my custom slot's name
"values": [...] //pasted the thousand words generated here
...
После сохранения и создания в пользовательском интерфейсе Skills Builder. Это позволило моему навыку фиксировать значения слотов только для одного слова. Я попытался сгенерировать 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
...
Сохранить и построить.
Вот и все! Затем ваш навык сможет распознать любое слово или фразу для вашего пользовательского слота, независимо от того, есть ли они в сгенерированном вами образце или нет!