5

Qual è il modo migliore per archiviare e cercare un database di alberi della struttura delle frasi in linguaggio naturale?Ricerca della struttura della frase in linguaggio naturale

Utilizzando OpenNLP's Treebank Parser inglese, posso ottenere analisi della struttura della frase abbastanza affidabili per frasi arbitrarie. Quello che mi piacerebbe fare è creare uno strumento in grado di estrarre tutte le stringhe doc dal mio codice sorgente, generare questi alberi per tutte le frasi nelle stringhe doc, archiviare questi alberi e il loro nome funzione associato in un database, e quindi consentire un utente per cercare nel database utilizzando query in linguaggio naturale.

Quindi, data la pena "This uploads files to a remote machine." per la funzione upload_files(), avrei l'albero: "Come è possibile caricare i file"

(TOP 
    (S 
    (NP (DT This)) 
    (VP 
     (VBZ uploads) 
     (NP (NNS files)) 
     (PP (TO to) (NP (DT a) (JJ remote) (NN machine)))) 
    (. .))) 

Se qualcuno è entrato la query, pari al l'albero:

(TOP 
    (SBARQ 
    (WHADVP (WRB How)) 
    (SQ (MD can) (NP (PRP I)) (VP (VB upload) (NP (NNS files)))) 
    (. ?))) 

come memorizzare e interrogare questi alberi in un database SQL?

Ho scritto un semplice script proof-of-concept che può eseguire questa ricerca utilizzando un mix di espressioni regolari e analisi del grafico di rete, ma non sono sicuro di come implementarlo in modo scalabile.

E sì, mi rendo conto che il mio esempio sarebbe banale da recuperare utilizzando una semplice ricerca per parole chiave. L'idea che sto cercando di testare è come sfruttare la struttura grammaticale, così posso inserire voci con parole chiave simili, ma una struttura di frasi diversa. Ad esempio, con la query precedente, non vorrei recuperare la voce associata alla frase "Checks a remote machine to find a user that uploads files." che ha parole chiave simili, ma sta ovviamente descrivendo un comportamento completamente diverso.

risposta

2

database relazionali non può immagazzinare la conoscenza in modo naturale, quello che realmente serve è una base di conoscenze o ontologia (anche se può essere costruito sulla parte superiore del database relazionale). Conserva i dati nelle terzine <subject, predicate, object>, quindi la frase verrà memorizzata come <upload_file(), upload, file>. Esistono molti strumenti e metodi per cercare all'interno di tali KB (ad esempio, Prolog è un linguaggio progettato per farlo). Quindi, tutto quello che dovete fare è quello di tradurre frasi di linguaggio naturale per KB triplette/ontologia grafico, tradurre query dell'utente per triplette incomplete (la tua domanda sarà simile <?, upload, file>) o query congiuntive e quindi cercare sul tuo KB . OpenNLP ti aiuterà a tradurre e il resto dipende dalla tecnica e dalle tecnologie concrete che decidi di utilizzare.

+0

Questa è un'idea interessante, anche se penso che l'utilizzo di un'ontologia web semantica sarebbe un po 'più complicato di quanto affermi. Non sarebbe semplice come una singola tripla piatta. L'oggetto, il predicato e l'oggetto potrebbero essere ciascuno un triplo nidificato, che dovrebbe comunque essere taggato con la parte del discorso. – Cerin

+0

@Cerin: in ontologia lavori già con i dati "puliti", cioè con i fatti, non con le parole. Anche le tripli in ontologia non possono essere annidate, ma possono comporre sottografi abbastanza grandi, è vero. La cosa più difficile sarà tradurre le frasi in fatti, ma in ogni caso dovrai tradurle in qualcosa per eseguire una ricerca efficiente, quindi perché non tradurle in una struttura, che è ben nota e descritta in migliaia di articoli? È possibile creare manualmente un'ontologia iniziale con le triplette di base dall'area del dominio e quindi utilizzarla per mappare nuovi fatti e ingrandirsi. – ffriend

+0

Vedo il tuo punto, ma potrebbe non essere pratico. I dati non saranno mai perfettamente "puliti". OpenNLP restituisce parecchie analisi marcate con una misura di certezza, quindi ogni sottografo nell'ontologia dovrà memorizzare e ragionare su questa incertezza. Né avrò mai una chiara distinzione tra fatti e parole/frasi. Voglio solo usare la struttura grammaticale per migliorare la ricerca. Anche il tentativo di interpretare la semantica è un po 'fuori portata. – Cerin

2

Sono d'accordo con ffriend che è necessario adottare un approccio diverso che si basa sul lavoro esistente su basi di conoscenza e ricerca del linguaggio naturale. La memorizzazione di alberi di analisi senza contesto in un database relazionale non è un problema, ma sarà molto difficile effettuare un confronto significativo degli alberi di analisi come parte di una ricerca. Quando sei interessato a sfruttare una piccola conoscenza delle relazioni grammaticali, gli alberi di analisi sono davvero troppo complicati. Se si semplifica il parsing in triple delle dipendenze, è possibile rendere il problema di ricerca molto più semplice e ottenere in primo luogo le relazioni grammaticali che ti interessavano. Ad esempio, è possibile utilizzare lo Stanford dependency parser, che genera un analisi senza contesto e quindi estrae le dipendenze da esso.Si produce un output come questo per "Questa funzione carica i file di un computer remoto":

det(function-2, This-1) 
nsubj(uploads-3, function-2) 
dobj(uploads-3, files-4) 
det(machine-8, a-6) 
amod(machine-8, remote-7) 
prep_to(uploads-3, machine-8) 

nel database, è possibile memorizzare un sottoinsieme semplificato di queste triple associate alla funzione, ad esempio:

upload_file(): subj(uploads, function) 
upload_file(): obj(uploads, file) 
upload_file(): prep(uploads, machine) 

Quando le persone cercano, puoi trovare la funzione che ha le triplette più sovrapposte o qualcosa del genere, in cui probabilmente vuoi anche pesare le diverse relazioni di dipendenza o consentire corrispondenze parziali, ecc. Probabilmente vuoi anche ridurre le parole nel triplica ai lemmi, forse POS a seconda di ciò che ti serve.

Ci sono molte persone che hanno lavorato alla ricerca in lingua naturale (come Powerset), quindi assicurati di cercare gli approcci esistenti. Il mio approccio proposto qui è davvero minimo e posso pensare a un sacco di esempi in cui avrà problemi, ma penso che qualcosa in questo senso potrebbe funzionare abbastanza bene per un dominio limitato.

1

Questa non è una risposta completa, ma se si desidera eseguire query linguisticamente sofisticate sui vostri alberi, la cosa migliore è di pre-processo l'output parser e cercalo con tgrep2:

http://www.stanford.edu/dept/linguistics/corpora/cas-tut-tgrep.html

Trgrep/tgrep2 sono, per quanto ne so, i pacchetti più flessibili e completi per la ricerca di alberi di analisi. Questa non è una soluzione basata su MySQL come richiesto, ma ho pensato che potrebbe interessarti sapere questa opzione.

Tgrep2 consente di porre domande su genitori, discendenti e fratelli, mentre altre soluzioni non manterrebbero l'intera struttura ad albero dell'analisi o consentiranno query sofisticate.

Problemi correlati