5

¿Cuál es la mejor manera de almacenar y buscar en una base de datos de árboles de estructuras de oraciones en lenguaje natural?Buscando estructura de oraciones de lenguaje natural

Usando OpenNLP's English Treebank Parser, puedo obtener análisis de estructuras de oraciones bastante confiables para oraciones arbitrarias. Lo que me gustaría hacer es crear una herramienta que pueda extraer todas las cadenas de documentos de mi código fuente, generar estos árboles para todas las oraciones en las cadenas de documentos, almacenar estos árboles y su nombre de función asociado en una base de datos, y luego permitir un usuario para buscar en la base de datos usando consultas de lenguaje natural.

Por lo tanto, dada la sentencia "This uploads files to a remote machine." para la función upload_files(), tendría el árbol: "¿Cómo puedo subir archivos"

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

Si alguien entró en la consulta, lo que equivale al árbol:

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

¿cómo puedo almacenar y consultar estos árboles en una base de datos SQL?

He escrito una secuencia de comandos de prueba de concepto simple que puede realizar esta búsqueda utilizando una combinación de expresiones regulares y análisis de gráficos de red, pero no estoy seguro de cómo implementar esto de forma escalable.

Y sí, me doy cuenta de que mi ejemplo sería trivial de recuperar con una simple búsqueda por palabra clave. La idea que trato de probar es cómo podría aprovechar la estructura gramatical, para poder eliminar las entradas con palabras clave similares, pero con una estructura de oración diferente. Por ejemplo, con la consulta anterior, no me gustaría recuperar la entrada asociada con la frase "Checks a remote machine to find a user that uploads files." que tiene palabras clave similares, pero obviamente describe un comportamiento completamente diferente.

Respuesta

2

Bases de datos relacionales no pueden almacenar el conocimiento de una manera natural, lo que realmente necesita es una base de conocimiento o ontología (aunque puede ser construido en la parte superior de la base de datos relacional). Contiene datos en tripletes <subject, predicate, object>, por lo que su frase se almacenará como <upload_file(), upload, file>. Hay muchas herramientas y métodos para buscar dentro de tales KB (por ejemplo, Prolog es un lenguaje que fue diseñado para hacerlo). Por lo tanto, todo lo que tiene que hacer es traducir frases de lenguaje natural para KB gráfico de trillizos/ontología, traducir consulta del usuario a trillizos incompletas (su pregunta se verá como <?, upload, file>) o consultas conjuntivas y luego buscar en su KB . OpenNLP lo ayudará con la traducción, y el resto depende de la técnica concreta y las tecnologías que decida utilizar.

+0

Esta es una idea interesante, aunque creo que usar una ontología web semántica sería un poco más complicado de lo que indica. No sería tan simple como un solo triple plano. El sujeto, el predicado y el objeto podrían ser cada uno un triple anidado, que aún tendría que etiquetarse con la parte de voz. – Cerin

+0

@Cerin: en ontología ya trabajas con datos "limpios", es decir, con hechos, no con palabras. Además, los triples en ontología no se pueden anidar, pero pueden componer subgrafos bastante grandes, eso es cierto. Lo más difícil será traducir oraciones a los hechos, pero de todos modos necesitará traducirlos a algo para realizar una búsqueda eficiente, entonces, ¿por qué no traducirlos en estructuras, que son bien conocidos y descritos en miles de documentos? Puede crear manualmente una ontología inicial con los triples básicos del área de dominio y luego usarla para mapear nuevos hechos y agrandarse. – ffriend

+0

Veo su punto, pero esto puede no ser práctico. Los datos nunca estarán perfectamente "limpios". OpenNLP genera varios análisis etiquetados con una medida de certeza, por lo que cada subgráfico en la ontología tendrá que almacenar y razonar sobre esta incertidumbre. Tampoco tendré una distinción clara entre hechos y palabras/oraciones. Solo quiero utilizar la estructura gramatical para mejorar la búsqueda. Intentar interpretar la semántica también está un poco fuera de alcance. – Cerin

2

Estoy de acuerdo con ffriend que necesita tomar un enfoque diferente que se basa en el trabajo existente sobre las bases de conocimiento y la búsqueda del lenguaje natural. Almacenar árboles de análisis sintácticos sin contexto en una base de datos relacional no es el problema, pero va a ser muy difícil hacer una comparación significativa de los árboles de análisis sintáctico como parte de una búsqueda. Cuando estás interesado aprovechando un poco de conocimiento sobre las relaciones gramaticales, los árboles de análisis son realmente muy complicados. Si simplifica el análisis en tripletas de dependencia, puede hacer que el problema de búsqueda sea mucho más fácil y obtener las relaciones gramaticales que le interesaron en primer lugar. Por ejemplo, puede usar el Stanford dependency parser, que genera un análisis sintáctico sin contexto y luego extrae los triples de dependencia del mismo.Se produce una salida como ésta para "Esta función carga archivos a una máquina remota":

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) 

En su base de datos, puede almacenar un subconjunto simplificado de estos triples asociados a la función, por ejemplo:

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

Cuando las personas buscan, puede encontrar la función que tiene las tripletas más superpuestas o algo similar, donde probablemente también desee ponderar las diferentes relaciones de dependencia o permitir coincidencias parciales, etc. Probablemente también quiera reducir las palabras en el triples a lemmas, tal vez POS dependiendo de lo que necesita.

Hay muchas personas que han trabajado en la búsqueda del lenguaje natural (como Powerset), así que asegúrese de buscar los enfoques existentes. Mi enfoque propuesto aquí es realmente mínimo y puedo pensar en un montón de ejemplos en los que tendrá problemas, pero creo que algo parecido podría funcionar razonablemente bien para un dominio restringido.

1

Ésta no es una respuesta completa, pero si desea realizar consultas lingüísticamente sofisticados en sus árboles, la mejor apuesta es pre-proceso de su salida del analizador y buscarla con tgrep2:

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

Trgrep/tgrep2 son, hasta donde yo sé, los paquetes más flexibles y completos para buscar árboles de análisis sintáctico. Esta no es una solución basada en MySQL como usted solicitó, pero pensé que podría estar interesado en conocer esta opción.

Tgrep2 le permite hacer preguntas sobre padres, descendientes y hermanos, mientras que otras soluciones no conservan la estructura de árbol completa del análisis ni permiten consultas tan sofisticadas.

Cuestiones relacionadas