代码之家  ›  专栏  ›  技术社区  ›  Abu Tahir

太多无法解包元组NLTK聊天

  •  0
  • Abu Tahir  · 技术社区  · 9 年前

    我一直在开发聊天机器人。我使用 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 回复  |  直到 9 年前
        1
  •  1
  •   sisanared    9 年前

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

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

    与此相同:

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

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

    基本上,仅仅在元组结构中添加括号并不意味着要嵌套它。为了达到您的目的,您应该在元组的定义中明确。如果您更改 pair 对此进行初始化:

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

    (注意: 逗号 在最后的右括号之前)

    现在您的迭代就可以工作了。因为第一个元素是 ('test (.*)', ('a', 'b')) 而不仅仅是字符串 test (.*)

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

        2
  •  1
  •   Community Mohan Dere    9 年前

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

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