起初我以为这是不可能的。。。但写了一半我找到了解决办法。然而,这个解决方案相当混乱,所以我留下了一个稍微好一点的解决方案。在
nltk允许您提供自定义正则表达式,这样您就可以编写一个正则表达式来匹配转义括号。正则表达式([^\s\(\)\\]+(\\(?=\()\([^\s\(\)\\]+\\(?=\))\))*[\\]*)+将匹配由反斜杠(\)转义的括号。但是,这将在每个叶中包含转义反斜杠,因此必须编写一个叶函数来删除这些反斜杠。以下代码将正确解析它:from nltk import Tree
s = '(S (NP (PRP They)) (VP like\(d\) (NP (PRP it)) (NP (DT a) (NN lot))) (. .))'
tree = Tree.fromstring(s, leaf_pattern=r"([^\s\(\)\\]+(\\(?=\()\([^\s\(\)\\]+\\(?=\))\))*[\\]*)+", read_leaf=lambda x: x.replace("\\(", "(").replace("\\)", ")"))
print(tree)
它输出:
^{pr2}$
原始答案
也许您可以要求nltk匹配另一个括号:from nltk import Tree
s = '[S [NP [PRP They]] [VP like(d) [NP [PRP it]] [NP [DT a] [NN lot]]] [. .]]'
tree = Tree.fromstring(s, brackets='[]')
print(tree)
打印出来的是:
^{pr2}$
您可以通过使用pformat方法(调用print时在内部调用)来获得不同的括号:print(tree.pformat(parens='[]'))
打印出来的是:[S
[NP [PRP They]]
[VP like(d) [NP [PRP it]] [NP [DT a] [NN lot]]]
[. .]]