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