Rivescript: использование триггеров ключевых слов в условных ответах - PullRequest
0 голосов
/ 08 февраля 2019

Я работаю над чат-ботом с Rivescript и пытаюсь использовать триггеры ключевых слов в условных ответах.

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

[*] опционально игнорировать части сообщения ...

Это прекрасно работает в начальном приглашении + [*] you [*], но когда я пытаюсь использовать этот методзахватить любой ответ, содержащий yes или no как часть условного ответа, который, кажется, нарушает его?Я не получаю код ошибки, но он просто по умолчанию - So, back to the matter at hand... в качестве ответа.

  + [*] you [*]
  - Oh, so we're talking about me now?

  + *
  % oh so we are talking about me now
  * <star> == [*] no [*]  => Whatever...
  * <star> == [*] yes [*] => This should be fun.{topic=myself}
  - So, back to the matter at hand...

Если бы это сработало, я бы ожидал, что разговор пойдет, например:

User: What do you do?
Bot: Oh, so we're talking about me now?
User: Yes, I suppose so
Bot: This should be fun.

Итак, есть ли способ использовать условные ответы без явного пользовательский ввод?А скорее тот, который просто содержит определенный ответ?Я полагаю, что это проблема с использованием * в двух случаях, как <star> и [*], но не можете найти решение в рамках?Может я что-то упустил?Я также пытался использовать *yes* и *no*.

Обновление:

Возможно, это проблема с условным оператором, который я использую?Может быть, == не является правильным методом для сравнения двух значений, когда я просто пытаюсь выяснить, содержится ли одно в другом ?С тех пор я нашел Рабочий проект , но и здесь мне не повезло ...

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

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

+ [*] you [*]
- So you are talking about me now?

+ [*] (yes|no) [*]
% so you are talking about me now
* <star> == yes => yes answer
* <star> == no => no answer
- default, shouldn't happen answer

Почему-то, я думаю,Я предполагал, что не могу использовать чередование триггеров в условном триггере - в конце концов, было более элегантное решение!

Я приму этот ответ сейчас и оставлю это маленькое путешествие для всех, кто может бороться.

0 голосов
/ 10 февраля 2019

ОК, поэтому я нашел решение, использующее объектные макросы - но оно не очень элегантно.

Это решение возвращает полный ответ пользователя (со всеми словами, сделанными строчными буквами - с lowercase - разделенными вмассив) в макрос объекта test в переменной args.Элементы в этом массиве перечисляются, чтобы увидеть, соответствует ли какой-либо из них элементу в массивах positives или negatives (которые, по сути, являются дублированными заменами, уже присутствующими в «мозге» rivescript).

Если есть совпадение, переменная action обновляется до yes или no, и цикл прерывается; если совпадение не найдено, тогда переменная action остается undefined.Эта переменная action затем возвращается к условному ответу и оценивается rivescript, чтобы увидеть, соответствует ли оно какому-либо из условий.

> object test javascript
    let positives = ['yes', 'yeah', 'yep', 'yup', 'yh', 'ya', 'y', 'sure'];
    let negatives = ['no', 'nope', 'na', 'nah', 'pass'];
    var action = 'undefined';
    for (var i = 0; i < args.length; i++) {
      if (positives.indexOf(args[i]) !== -1) {
        action = 'yes'
        break;
      } else if (negatives.indexOf(args[i]) !== -1){
        action = 'no'
        break;
      } else {

      }
    }
    return action;
< object

// In the topic/main section

+ [*] you [*]
- Oh, so we're talking about me now?

+ *
% oh so we are talking about me now
* <call>test <lowercase></call> == no        => Whatever...
* <call>test <lowercase></call> == yes       => This should be fun.{topic=myself}
* <call>test <lowercase></call> == undefined => So, back to the matter at hand...
- So, back to the matter at hand...

Кажется, что это работает довольно хорошо, но я уверен, что должно быть лучшее решение, даже если оно заключается только в очистке самого макроса объекта (возможно, есть способ внести замены вмакрос объекта ??).

Я принимаю этот ответ, но если у кого-то есть альтернативные предложения / решения, я все равно буду рад их услышать.

...