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
os.path.join("^%s" % directory, reg_path, "")
=> '^aclImdb\train\(?P<label>neg|pos)\'
- 这就是程序看到的内容
'^aclImdb\train\(?P<label>neg|pos)\'
- 正则表达式见:
^
+ aclImdb
+ tab + rain
+ (
(这是转义字符这导致了错误 unbalanced parenthesis
) + ...
+ ) (这是一个 close-group 字符,它的开放伙伴是 转义) + ...
在 *nix
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 爱好者(例如我自己)不必手动应用补丁他们依赖的贡献库。
代码:- 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系统(路径分隔符为
/
)
- 使用Google Colab使用
出了什么问题?
转义字符和正则表达式
在 第 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
os.path.join("^%s" % directory, reg_path, "")
=>'^aclImdb\train\(?P<label>neg|pos)\'
- 这就是程序看到的内容
'^aclImdb\train\(?P<label>neg|pos)\'
- 正则表达式见:
^
+aclImdb
+ tab +rain
+(
(这是转义字符这导致了错误unbalanced parenthesis
) +...
+ ) (这是一个 close-group 字符,它的开放伙伴是 转义) +...
在 *nix
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 爱好者(例如我自己)不必手动应用补丁他们依赖的贡献库。