1

我在这里定义了一个字典

var dict = {'English 101?': 'Room 205', 'English 102?': 'Room 309',
  'Math 301': 'Room 705', 'Math 302': 'Room 704'};

当用户询问“英语 101 在哪里”时,我希望机器人回复“在 205 房间”。

我通过以下方式对其进行硬编码:

var builder = require('botbuilder');
var helloBot = new builder.TextBot();
var dialog = new builder.CommandDialog();


dialog.matches('^Where is English 101?', builder.DialogAction.send('In     Room 205'));
dialog.matches('^Where is English 102?', builder.DialogAction.send('In     Room 309'));
dialog.matches('^Where is Math 301?', builder.DialogAction.send('In    Room 705'));
dialog.matches('^Where is Math 302?', builder.DialogAction.send('In     Room 704'));

dialog.onDefault(builder.DialogAction.send("I'm sorry. I didn't    understand."));

helloBot.listenStdin();

我不想对每个问题进行硬编码,而是将一些正则表达式传递给 dialog.matches() 函数的第一个参数并将其用作键,Bot 应该能够从字典中获取值并发送回用户

我尝试了以下方法,但没有奏效:

var str = ""
dialog.matches(str = ? , builder.DialogAction.send(dict[str.slice(9)]))

我怎样才能将标准输入传递给“str”并从字典中获取值?

4

2 回答 2

1

您想使用意图或触发动作匹配。

对于意图,首先,初始化你的意图:

var intents = new builder.IntentDialog();

然后将意图对话框传递给您的机器人:

bot.dialog('/', intents);

然后您可以使用正则表达式构建匹配项:

intents.matches(/English 101/i, (session) => {
    //
});

您还需要确保有一些东西可以处理没有匹配的消息:

intents.onDefault([
    (session, args, next) => {
        //Do something by default
}]);

另一种方法是triggerAction在对话框上使用 a (也使用正则表达式):

bot.dialog("/English", (sess, args, next) => {
        //Handle English 101
    }).triggerAction({
        matches: /English 101/i
});

无论使用哪种方式,您都可以使用标准的 JavaScript 正则表达式来捕获用户数据,并提供适当的对话框。

您也可以查找 just /where is/i,然后使用 获取会话中的消息session.message.text,然后对其进行解析以获取目标。

理想情况下,您的机器人非常适合使用 LUIS。您可以为类位置创建单个意图,并为类创建单个实体。然后,您可以使用各种短语训练您的 LUIS 应用,同时用实体令牌替换确切的类名。然后,当 LUIS 符合您的意图时,该实体将可用,您可以使用它来访问您的字典并获取位置。我最近写了一篇关于这个的帖子,如果你有兴趣的话。

(注意:这是用 TypeScript 编写的,但你明白了要点。)

于 2017-07-03T14:05:53.140 回答
0

根据此处的文档,您应该在matches方法中简单地使用 Javascript 正则表达式格式。

于 2016-12-02T03:15:47.430 回答