解析nltk块字符串以形成树

时间:2017-08-05 09:14:10

标签: python parsing tree nlp nltk

我有一个包含

等字符串的文件
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')])])

提前致谢。

1 个答案:

答案 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))'

此解决方案适合用作文件的一次性紧急修复。 不要作为常规程序来做。