2016-05-17 13 views
7

Sono nuovo di Python e del mondo della PNL. Il recente annuncio di Google Syntaxnet mi ha incuriosito. Tuttavia sto avendo un sacco di problemi a capire la documentazione in giro sia syntaxnet e strumenti correlati (NLTK, etc.)SyntaxNet che crea il verbo dell'albero al root

Il mio obiettivo: dato un input come "Wilbur calciato la palla" Vorrei estrarre il verbo radice (calciato) e l'oggetto che riguarda "la palla".

Mi sono imbattuto in "spacy.io" e this visualization sembra incapsulare quello che sto cercando di realizzare: tag POS una stringa, e caricarlo in una sorta di struttura ad albero in modo che possa iniziare al verbo di root e attraversare il condanna, frase.

Ho giocato con syntaxnet/demo.sh e come suggerito in this thread ho commentato le ultime due righe per ottenere l'output di conll.

ho quindi caricato questo ingresso in uno script python (kludged insieme io, probabilmente non corretta):

import nltk 
from nltk.corpus import ConllCorpusReader 
columntypes = ['ignore', 'words', 'ignore', 'ignore', 'pos'] 
corp = ConllCorpusReader('/Users/dgourlay/development/nlp','input.conll', columntypes) 

vedo che ho accesso a corp.tagged_words(), ma nessuna relazione tra le parole. Ora sono bloccato! Come posso caricare questo corpus in una struttura di tipo ad albero?

Qualsiasi aiuto è molto apprezzato!

+0

Per me sembra che tu abbia perso la parte di parsing. Una volta preordinati i dati, cioè il tokenize del testo non elaborato, il tag POS e convertendolo in formato conll, è necessario passarlo al parser (SyntaxNet nel tuo caso). Quindi puoi fare qualsiasi tipo di estrazione, che vuoi, sull'output del parser. – Riyaz

risposta

2

Quello che stai cercando di fare è trovare una dipendenza, ovvero dobj. Non sono ancora abbastanza familiare con SyntaxNet/Parsey per dirti esattamente come estrarre tale dipendenza dal suo output, ma credo che questo answer potrebbe aiutarti. In breve, puoi configurare Parsey per usare la sintassi di ConLL per l'output, analizzarlo in qualunque cosa trovi facile da attraversare, quindi cercare la dipendenza ROOT per trovare le verbi e le dipendenze * obj per trovare i suoi oggetti.

+1

Grazie. Suppongo che la parte in cui sono bloccato stia analizzando l'output di ConLL. Come puoi vedere nel mio esempio sopra, l'ho caricato usando ConllCorpusReader, ma non riesco a capire come attraversarlo come un albero dal verbo della radice. –

3

Questo potrebbe essere stato meglio come commento, ma non ho ancora la reputazione richiesta.

Non ho usato il ConllCorpusreader prima (considereresti di caricare il file che stai caricando in un file e fornire un collegamento? Sarebbe molto più facile da testare), ma ho scritto un post sul blog che potrebbe aiutarti Aspetto di parsing dell'albero: here.

In particolare, probabilmente si vuole ridurre a ogni frase. Chapter 7 of the NLTK book ha qualche informazione in più su questo, ma questo è l'esempio dal mio blog:

# This grammar is described in the paper by S. N. Kim, 
# T. Baldwin, and M.-Y. Kan. 
# Evaluating n-gram based evaluation metrics for automatic 
# keyphrase extraction. 
# Technical report, University of Melbourne, Melbourne 2010. 
grammar = r""" 
NBAR: 
    # Nouns and Adjectives, terminated with Nouns 
    {<NN.*|JJ>*<NN.*>} 

NP: 
    {<NBAR>} 
    # Above, connected with in/of/etc... 
    {<NBAR><IN><NBAR>} 
""" 

chunker = nltk.RegexpParser(grammar) 
tree = chunker.parse(postoks) 

Nota: Si potrebbe anche usare un contesto libero Grammar (coperto in Chapter 8).

Ogni frase chunked (o analizzata) (o in questo esempio, frase di nomi, in base alla grammatica di cui sopra) sarà una sottostruttura. Per accedere a queste sottostrutture, possiamo usare questa funzione:

def leaves(tree): 
    """Finds NP (nounphrase) leaf nodes of a chunk tree.""" 
    for subtree in tree.subtrees(filter = lambda t: t.node=='NP'): 
    yield subtree.leaves() 

Ciascuno degli oggetti fruttati sarà un elenco di coppie di parole-tag. Da lì puoi trovare il verbo.

Successivamente, è possibile giocare con la grammatica sopra o il parser. I verbi dividono le frasi nominali (vedere this diagram in Chapter 7), quindi è probabile che tu possa semplicemente accedere al primo NP dopo un VBD.

Ci scusiamo per la soluzione non specifica del problema, ma si spera che sia un utile punto di partenza. Se carichi il/i file/i prendo un'altra inquadratura :)

0

Se hai analizzato il testo non elaborato nel formato di conll usando qualunque parser, puoi seguire i passaggi per attraversare i dipendenti di un nodo che sei interessati a:

  1. costruire una matrice di adiacenza dalla frase uscita conll
  2. look per il nodo che ti interessa (verbo nel tuo caso) ed estrarre i suoi dipendenti dalla matrice di adiacenza (indici)
  3. per ogni aspetto dipendente per la sua etichetta di dipendenza nell'ottava colonna nel formato conll.

PS: Posso fornire il codice, ma sarebbe meglio se lo si può codificare da soli.

Problemi correlati