nltk Tree.fromstring():期望得到'end-of-string',但实际上得到了')',当节点为')'时,

uoifb46i  于 2个月前  发布在  其他
关注(0)|答案(4)|浏览(36)

问题:
s = '(S ))'
Tree.fromstring(s)
ValueError: Tree.read(): expected u'end-of-string' but got ')' at index 4.
"(S ))"
........^s = '(S ()'
Tree.fromstring(s)
ValueError: Tree.read(): expected u')' but got u'end-of-string' at index 5.
"(S ()"
.......^
解决方案:
允许转义字符'('和')'。

nbysray5

nbysray51#

我同意这个观点。

hm2xizp9

hm2xizp92#

有人找到解决这个问题的方法了吗?

xbp102n0

xbp102n03#

解析器不会将')'作为括号进行转义,而是只考虑'',然后关闭(组成)节点。
解决方法:将所有出现的')'和'('分别替换为'-LRB-'和'-RRB-':

s = '(S \))'
s = s.replace('\)', '-LRB-').replace('\(', '-RRB-') # fix
Tree.fromstring(s)
siv3szwd

siv3szwd4#

当前的正则表达式只允许非空白字符,且这些字符不等于用于指定节点和叶子的括号。@yetanotheryeti 的解决方法可能是一个好办法。也许可以在应用正则表达式之前识别、去除或标记转义的括号,然后在解析树之后重新引入。

在最佳情况下,输入中的 \) 应保持为输出中的 \),即不是像 -RRB- 这样的一个令牌。此外,最好不要像保留一些输入(如 -RRB-)作为影响程序行为的令牌那样,需要预留一些输入。我的意思是,对于不了解函数内部工作原理的用户来说,他们不应该随机地将恰好为 -RRB- 的令牌转换为 \)

我已经将此问题标记为要解决的第一个好问题。希望这能引起更多人的关注。

相关问题