Watson Conversation: условие сопоставления ввода с массивом контекста

Взяв пример приборной панели автомобиля, я изменил начальный узел @genre на @genre:classical. Я также добавил список в контекст

"choices":["Beethoven","Mahler 9","Brahms 3rd"]

и ответ Ватсона "I have 3 selections". Условие на следующем узле $choices.contains(input.text). Ответ «Найдено совпадение» предназначен только для тестирования. Это выглядит так:

введите здесь описание изображения

Когда я проверяю это в инструменте API и набираю «Бетховен», появляются как «Найдено совпадение», так и «Отличный выбор!...». То же самое для двух других вариантов, но только если я ввожу точный вариант, например, «Малер 9». Ввод «Малер» или «Малер» не дает совпадения. Я прочитал документацию SpEL, но не нашел способа в однострочном условии проанализировать список в поисках частичных совпадений.

Итак, мой вопрос: существует ли выражение условия, которое соответствовало бы частичному вводу пользователя, например, «Малер»? Я буду использовать Java SDK для кодирования сервера приложений, поэтому в качестве альтернативы мне было интересно, могу ли я добавить временную @entity только для этой последовательности вместо использования списка контекста, а затем удалить его, когда разговор будет завершен? Или есть способ создать более сложное условие в MessageRequest и распознает ли его Watson? Или это просто не правильный способ сделать это? Любые указатели, примеры или документы высоко ценятся.


person LWK69    schedule 25.09.2016    source источник


Ответы (1)


Итак, мой вопрос: есть ли выражение условия, которое будет соответствовать частичному вводу пользователя

Вы не можете добавлять временные объекты или намерения. Поскольку их добавление заставляет Watson начать обучение (даже если бы вы могли это сделать с помощью кода).

Однако вы можете создавать довольно сложные регулярные выражения и передавать их как переменную контекста.

Например, ваш расширенный узел может иметь:

{
  "output": {
    "text": "Please ask me a question."
  },
  "context": {
    "rx": "fish|[0-9]+"
  }
}

Тогда в вашем состоянии вы бы написали.

input.text.matches(context.rx)

Затем это сработает, если человек упомянет число или слово «рыба». Таким образом, вы можете создать частичную проверку пользовательского ввода таким образом.

person Simon O'Doherty    schedule 26.09.2016
comment
Спасибо, Саймон. Я не думал, что вы можете добавить сущности или намерения, но решил, что все равно упомяну об этом. Regex не является одной из моих сильных сторон, но ваш пример дает мне достаточно подсказок, чтобы попробовать некоторые решения. - person LWK69; 26.09.2016
comment
Только что попробовал, и это определенно должно сработать! Спасибо еще раз. - person LWK69; 26.09.2016
comment
Саймон, к вашему сведению. Последние пару недель я работал над POC, а затем интегрировал его в свой веб-сайт вместе с STT и TTS. Он отлично работал для тех терминов, у которых есть намерения и сущности, но я боролся с двумя узлами, у которых есть предложенное вами условие. Помимо того факта, что STT регулярно возвращает мусор (другая проблема), оказалось, что результат STT включал пробел в конце слова или фразы. Очевидно, что это не соответствует фразе регулярного выражения. Как только я, наконец, понял это (часы спустя) и обрезал входной текст для MessageRequest, я получил правильный ответ. - person LWK69; 09.10.2016