我一直在研究聊天机器人。我已经将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'))
)
答案 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'))
]