我有一个包含
等字符串的文件Tree('S', [Tree('NP', [('criminal', 'JJ'), ('lawyer', 'NN')]), Tree('NP',
[('new', 'JJ'), ('york', 'NN')])])
是否有一个python函数解析字符串以再次生成Tree结构?我尝试了Tree.fromstring函数,但它没有解析。
我生成这些字符串,如下所示
>>> import nltk
>>> from nltk import pos_tag
>>> pattern = """NP: {<DT>?<JJ>*<NN>}
... VBD: {<VBD>}
... IN: {<IN>}"""
>>> NPChunker = nltk.RegexpParser(pattern)
>>> sentence = 'criminal lawyer new york'.split()
>>> pos_tag(sentence)
[('criminal', 'JJ'), ('lawyer', 'NN'), ('new', 'JJ'), ('york', 'NN')]
>>> result = NPChunker.parse(pos_tag(sentence))
>>> result
Tree('S', [Tree('NP', [('criminal', 'JJ'), ('lawyer', 'NN')]), Tree('NP',
[('new', 'JJ'), ('york', 'NN')])])
提前致谢。
答案 0 :(得分:3)
当你这样做时
>>> result = NPChunker.parse(pos_tag(sentence))
>>> result
Tree('S', [Tree('NP', [('criminal', 'JJ'), ('lawyer', 'NN')]), Tree('NP', [('new', 'JJ'), ('york', 'NN')])])
您在内存中看到字符串表示数据结构。
在解释器提示符下键入result
时,如果在解释器提示符下键入repr(result)
,则获得的内容与您获得的内容相同。您似乎已将此字符串表示保存在文件中。这是不幸的,因为Tree.fromstring()
不接受这种表示。
要将可接受的版本保存到文件,您需要写出树的str()
(而不是repr()
)。你可以在这里看到差异:
>>> result
Tree('S', [Tree('NP', [('criminal', 'JJ'), ('lawyer', 'NN')]), Tree('NP', [('new', 'JJ'), ('york', 'NN')])])
>>> str(result)
'(S (NP criminal/JJ lawyer/NN) (NP new/JJ york/NN))'
Tree.fromstring()
期待这些格式中的第二种。
要验证这是否符合您的要求:
>>> result2 = nltk.Tree.fromstring(str(result))
>>> result2
Tree('S', [Tree('NP', ['criminal/JJ', 'lawyer/NN']), Tree('NP', ['new/JJ', 'york/NN'])])
但这是为了未来。您需要修复您拥有的文件。执行以下操作:
>>> from nltk import Tree
>>> input_string = "Tree('S', [Tree('NP', [('criminal', 'JJ'), ('lawyer', 'NN')]), Tree('NP', [('new', 'JJ'), ('york', 'NN')])])"
我在此处进行内联作业,但当然您将从文本文件中阅读input_string
。
>>> parsed_tree = eval(input_string)
>>> type(parsed_tree)
<class 'nltk.tree.Tree'>
>>> str(parsed_tree)
'(S (NP criminal/JJ lawyer/NN) (NP new/JJ york/NN))'
此解决方案适合用作文件的一次性紧急修复。 不要作为常规程序来做。