2017-03-16 4 views
6

Ich habe einen Satz John sah einen auffälligen Hut im Laden
Wie stellt man dies als Abhängigkeitsbaum wie unten dargestellt?Dependency Parsing Baum in Spacy

(S 
     (NP (NNP John)) 
     (VP 
     (VBD saw) 
     (NP (DT a) (JJ flashy) (NN hat)) 
     (PP (IN at) (NP (DT the) (NN store))))) 

habe ich dieses Skript von here

import spacy 
from nltk import Tree 
en_nlp = spacy.load('en') 

doc = en_nlp("John saw a flashy hat at the store") 

def to_nltk_tree(node): 
    if node.n_lefts + node.n_rights > 0: 
     return Tree(node.orth_, [to_nltk_tree(child) for child in node.children]) 
    else: 
     return node.orth_ 


[to_nltk_tree(sent.root).pretty_print() for sent in doc.sents] 

mir die folgenden bekommen, aber ich bin auf der Suche nach einem Baum (NLTK) Format.

 saw     
    ____|_______________  
|  |   at 
|  |   | 
|  hat  store 
|  ___|____  | 
John a  flashy the 

Antwort

3

Textdarstellungen beiseite, was Sie versuchen zu erreichen ist aus einem Abhängigkeitsgraphen einen Wähler Baum zu erhalten. Ihr Beispiel der gewünschten Ausgabe ist ein klassischer Wahlkreisbaum (wie in der Grammatik der Phrasenstruktur, im Gegensatz zur Abhängigkeitsgrammatik).

Während die Umwandlung von Wahlkreisbäumen in Abhängigkeitsgraphen mehr oder weniger eine automatisierte Aufgabe ist (zum Beispiel http://www.mathcs.emory.edu/~choi/doc/clear-dependency-2012.pdf), ist die andere Richtung nicht. Es gab Arbeiten dazu, sehen Sie sich das PAD-Projekt https://github.com/ikekonglp/PAD und das Papier an, das den zugrundeliegenden Algorithmus beschreibt: http://homes.cs.washington.edu/~nasmith/papers/kong+rush+smith.naacl15.pdf.

Sie auch, wenn Sie wirklich einen Wähler Parse müssen überdenken möchten, hier ist ein gutes Argument: https://linguistics.stackexchange.com/questions/7280/why-is-constituency-needed-since-dependency-gets-the-job-done-more-easily-and-e

3

Um einen NLTK-Stil Baum für Spacy Abhängigkeit Parsen neu zu erstellen, versuchen Sie die draw Methode von nltk.tree mit statt pretty_print:

import spacy 
from nltk.tree import Tree 

spacy_nlp = spacy.load("en") 

def nltk_spacy_tree(sent): 
    """ 
    Visualize the SpaCy dependency tree with nltk.tree 
    """ 
    doc = spacy_nlp(sent) 
    def token_format(token): 
     return "_".join([token.orth_, token.tag_, token.dep_]) 

    def to_nltk_tree(node): 
     if node.n_lefts + node.n_rights > 0: 
      return Tree(token_format(node), 
         [to_nltk_tree(child) 
         for child in node.children] 
        ) 
     else: 
      return token_format(node) 

    tree = [to_nltk_tree(sent.root) for sent in doc.sents] 
    # The first item in the list is the full tree 
    tree[0].draw() 

Beachten Sie, dass, weil spacy nur noch die Abhängigkeit Parsing und Tagging bei dem Wort und Substantiv-Satz-Ebene unterstützt, spacy Bäume nicht so tief strukturiert wie diejenigen sein, werden Sie von bekommen, für zum Beispiel der Stanford Parser, den Sie al so visualisieren als Baum:

from nltk.tree import Tree 
from nltk.parse.stanford import StanfordParser 

# Note: Download Stanford jar dependencies first 
# See https://stackoverflow.com/questions/13883277/stanford-parser-and-nltk 
stanford_parser = StanfordParser(
    model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz" 
) 

def nltk_stanford_tree(sent): 
    """ 
    Visualize the Stanford dependency tree with nltk.tree 
    """ 
    parse = stanford_parser.raw_parse(sent) 
    tree = list(parse) 
    # The first item in the list is the full tree 
    tree[0].draw() 

Nun, wenn wir beide laufen, nltk_spacy_tree("John saw a flashy hat at the store.")this image produzieren und nltk_stanford_tree("John saw a flashy hat at the store.")this one produzieren wird.