【问题标题】:How to tailor an NLTK chatbot's response using macro variables (Python)如何使用宏变量 (Python) 定制 NLTK 聊天机器人的响应
【发布时间】:2018-03-14 15:44:10
【问题描述】:

我一直在使用 Python 中的 NLTK 包,特别是 nltk.chat.util。 通过定义我的pairs 例如,我已经能够创建一些简单的聊天机器人。如果你说“嗨”,聊天机器人会回复“嗨”或“你好”:

pairs = (  
          (r'Hi',
             ("Hey",
              "Hello")
          )
        )

这里一个有用的特性是你可以使用通配符和宏变量,例如:

pairs = (  
          (r'My name is (.*)',
             ("Hey %1",
              "Hello %1")
          )
        )

因此,如果我说“我的名字是 Grace”,它会返回“Hey Grace”或“Hello Grace”。

我想要做的是一些很酷的宏变量。我的目标是让聊天机器人根据我输入的内容向我读取文件的某一行。我想要的代码是:

ExpP = open("ExpensePolicy.txt", "r")

pairs = (
          (r'Read me line (.*) of the expenses policy',
             (ExpP.readline(%1),
              "No")
          )
        ) 

但是当%1 从引号中取出时,它不再将其识别为变量。此外,当它在函数内的引号内时,它只是将其视为字符串"%1"。

我尝试做的另一件事是更改宏变量的第一个字母。因此,如果有人输入“你很有趣”,其中“有趣”是%1,我希望聊天机器人返回“你很有趣”(例如)。我尝试使用%1.replace(%1[:1], "p"),但同样不喜欢使用%1。

有没有什么方法可以将nltk.chat.util中的宏变量的使用与其他命令/函数结合起来?

谢谢!

【问题讨论】:

    标签: python chat nltk chatbot


    【解决方案1】:

    这是我的两分钱。 我已经通过使用 eval() 使其工作,这样:

    pairs = [
      [r"how is the weather in (.*)", ["In %1 it's a sunny day", eval("dynResponse('%1')")]]
    ]
    
    def dynResponse(val):
     return "Hello " + val
    

    但是:

    1. 请记住,这种方法是完全不安全的,因为 eval 会评估所有可能来自 http 请求的内容。

    2. 使用 eval 不是处理这类事情的优雅方式。最好使用 NLTK 内置机制来成对实现动态值(今天,由于我的无知,我不知道)。

    很高兴加入这个有趣的话题! 再见。

    【讨论】:

      猜你喜欢
      • 2020-01-11
      • 1970-01-01
      • 2018-10-15
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      • 2015-04-13
      • 1970-01-01
      相关资源
      最近更新 更多