2017-08-05 59 views
0

我有一個包含字符串文件像解析NLTK塊串,形成樹

Tree('S', [Tree('NP', [('criminal', 'JJ'), ('lawyer', 'NN')]), Tree('NP', 
[('new', 'JJ'), ('york', 'NN')])]) 

是否有解析字符串再次產生樹結構的Python函數?我嘗試了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')])]) 

感謝。

回答

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

此解決方案適合用作文件的一次性緊急修復。 請勿將作爲常規程序。

+0

Thanks @BoarGules – user2745862