How should I deal with error:-- unbalanced parenthesis at position 32

How should I deal with error:-- unbalanced parenthesis at position 32

代码:- train_validation_split = tfds.Split.TRAIN.subsplit([6, 4])

   (train_data, validation_data), test_data = tfds.load(
   name="imdb_reviews", 
   split=(train_validation_split, tfds.Split.TEST),
   as_supervised=True)

1).错误 = 位置 32 的括号不平衡。

2).我在加载 imdb 数据集时遇到此错误。

3). Image of Code with Error

tldr;

  • 是Windows路径分隔符的问题。 (为什么 Windows 这样做?阅读有关 here 的更多信息)

  • 解析:

    • 使用Google Colab使用tensorflow_datasets(推荐)
    • 使用*nix-like系统(路径分隔符为/

出了什么问题?

转义字符正则表达式

第 156 行 来自 what_ever_python/Lib/site-packages/tensorflow_datasets/text/imdb.py

reg_path = "(?P<label>neg|pos)" if labeled else "unsup"
reg = re.compile(os.path.join("^%s" % directory, reg_path, ""))
  • 开Windows

    1. os.path.join("^%s" % directory, reg_path, "") => '^aclImdb\train\(?P<label>neg|pos)\'
    2. 这就是程序看到的内容 '^aclImdb\train\(?P<label>neg|pos)\'
    3. 正则表达式见:^ + aclImdb + tab + rain + ( (这是转义字符这导致了错误 unbalanced parenthesis) + ... + ) (这是一个 close-group 字符,它的开放伙伴是 转义) + ...
  • 在 *nix

    1. os.path.join("^%s" % directory, reg_path, "") => '^aclImdb/train/(?P<label>neg|pos)/' 没有任何内容被 转义.

我来晚了 post,但看起来你在关注 one of the Tensorflow Beta tutorials

根据 shioko 的回答,tensorflow_datasets 库在处理 Windows 路径分隔符时存在错误,尤其是在 imdb.py 数据集加载器中。然而,我要指出的是,这不是 os.path.join() 本身的问题,也不应该这样推卸责任。这个功能不需要被诽谤,因为正如他们所说,只是在做它的工作。我的建议是继续使用您当前的开发环境(尤其是如果您拥有强大的 GPU!),但请按照以下说明修复 tensorflow_datasets 中的错误。

真正的问题在于 Windows 路径分隔符和正则表达式之间的交互,正则表达式将这些分隔符视为转义序列。有点啰嗦,但这里的基本建议如下:为了停止将转义序列视为转义序列,您必须转义转义序列。反斜杠是一个常见的转义序列,因此它已成为其流行的牺牲品。有时它必须逃脱。有时它必须逃脱很多。有时它必须转义很多 "^file:\\\\c:\\foo\\bar\\baz.txt$" 级别。

因此,我向 tensorflow_datasets 维护者(或愿意自己修补 tensorflow_datasets/text/imdb.py 的人)推荐的解决方案是在调用 join 之前通过 re.escape() 传递路径分隔符,使用代码看起来像下面这样:

reg = re.compile(re.escape(os.path.sep).join(["^%s" % re.escape(directory), reg_path, ""]))

那应该替换 imdb.py 的第 159/160 行附近以 reg = 开头的语句。我没有使用 os.path.join(),因为它并不完全适合这个问题,但我正在使用它的兄弟 os.path.sep。我也不会完全注销 os.path.join(),因为它还有很多擅长的地方,比如在 non-regex 相关场景中加入路径组件。

请注意,我也在 re.escape() 访问源目录。这对于避免整个其他 class 错误非常有用,其中路径名的元素被视为例如通配符。我可能只是将此更改作为拉取请求提交给 tensorflow_datasets 库,这应该有望让其他在 Windows 机器上遵循 Tensorflow 官方教程的 ML 爱好者(例如我自己)不必手动应用补丁他们依赖的贡献库。