2017-06-25 16 views
1

我從自然語言推理語料庫(SNLImultiNLI)數據來自於這種形式:如何獲得一個二進制解析在Python

'((Two (blond women)) ((are (hugging (one another))) .))' 

他們應該是一個二叉樹(有些不是很清潔)。

我想解析一些我自己的句子成這種格式。我怎麼能用NLTK或類似的方法做到這一點?

我找到了StanfordParser,但是我一直未能找到如何得到這種解析。

回答

3

任何樹都可以轉換爲保存其組成成分的二叉樹。下面是對nltk.Tree輸入工作的簡單的解決方案:

from nltk import Tree 
from functools import reduce 

def binarize(tree): 
    """ 
    Recursively turn a tree into a binary tree. 
    """ 
    if isinstance(tree, str): 
     return tree 
    elif len(tree) == 1: 
     return binarize(tree[0]) 
    else: 
     label = tree.label() 
     return reduce(lambda x, y: Tree(label, (binarize(x), binarize(y))), tree) 

如果你想普通的元組,而不是Tree,這種取代最後return聲明:

return reduce(lambda x, y: (binarize(x), binarize(y)), tree) 

例子:

>>> t = Tree.fromstring('''(ROOT (S (NP (NNP Oracle)) 
    (VP (VBD had) (VP (VBN fought) (S (VP (TO to) 
     (VP (VB keep) (NP (DT the) (NNS forms)) 
     (PP (IN from) (S (VP (VBG being) (VP (VBN released))))))))))))''') 

>>> bt = binarize(t) 

>>> print(t) 
(ROOT 
    (S 
    (NP (NNP Oracle)) 
    (VP 
     (VBD had) 
     (VP 
     (VBN fought) 
     (S 
      (VP 
      (TO to) 
      (VP 
       (VB keep) 
       (NP (DT the) (NNS forms)) 
       (PP (IN from) (S (VP (VBG being) (VP (VBN released)))))))))))) 
>>> print(bt) 
(S 
    Oracle 
    (VP 
    had 
    (VP 
     fought 
     (VP 
     to 
     (VP (VP keep (NP the forms)) (PP from (VP being released))))))) 

這將確保二進制結構,但它不一定是正確結構。大範圍的解析器生成非二進制分支,因爲一些附件選擇非常困難。 (考慮一下經典的「我用望遠鏡看女孩」,是在物體內部還是VP的一部分的「望遠鏡」的PP?)。所以繼續照顧。

+0

非常感謝您的善意幫助,alexis。 – Hanshan