解压缩组块NLTK Chat太多了

时间:2017-01-19 06:30:12

标签: python regex tuples nltk chatbot

我一直在研究聊天机器人。我已经将nltk.chat广泛用于我的机器人。但我想为除默认对之外的对添加更多功能。当我尝试添加新对时,我会收到错误。

alex=Chat(pair,reflections)
File "/usr/local/lib/python2.7/dist-packages/nltk/chat/util.py", in __init__
self._pairs = [(re.compile(x, re.IGNORECASE),y) for (x,y) in pairs]
ValueError: too many values to unpack

我的代码:

pair=(
      (r'test (.*)',('a','b'))
     )

2 个答案:

答案 0 :(得分:1)

您的配对正在失去您想要的结构,例如:

pair=((((r'test (.*)', ('a','b')))))

将与此相同:

('test (.*)', ('a', 'b'))

第一个元素是'test (.*)',第二个元素是('a', 'b')

基本上只是将一个括号添加到元组结构并不意味着你正在嵌套它。为了达到你的目的,你应该明确你的元组定义。如果您将pair初始化更改为:

pair=( 
      (r'test (.*)', ('a','b')),
     )

(注意最后一个右括号前的逗号

现在你的迭代会起作用。由于第一个元素是('test (.*)', ('a', 'b')),而不仅仅是字符串test (.*)

希望这能解释错误的原因。

答案 1 :(得分:1)

接受的答案是关于问题根源的正确答案,但它遗漏了一个重要的细节:Python风格决定你use tuples only for collections in which each element has a specific role.对于无差别的集合,使用list(方括号)。您在列表pair中传递的每个元组都是一对(<regexp>, <data>),因此正确写为tuple。但pair本身只是这些元组的集合,应该写成一个列表,而不是一个元组。作为奖励,列表括号是明确的,当您的列表只有一个元素时,您不需要记住添加逗号:

# (works properly)
pair = [
      (r'test (.*)', ('a','b'))
     ]