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.
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
@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
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