Пользовательский слот Alexa, который принимает любое слово или фразу

Какие образцы можно добавить в пользовательский слот, чтобы он принимал любое слово или фразу?


person Jonathan    schedule 04.02.2018    source источник


Ответы (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
...

Сохранить и построить.

Вот и все! Затем ваш навык сможет распознать любое слово или фразу для вашего пользовательского слота, независимо от того, есть ли они в сгенерированном вами образце или нет!

person Jonathan    schedule 04.02.2018