Kit de herramientas de lenguaje natural: análisis

Análisis y su relevancia en PNL

La palabra 'Parsing' cuyo origen es de palabra latina ‘pars’ (lo que significa ‘part’), se utiliza para extraer el significado exacto o el significado del diccionario del texto. También se denomina análisis sintáctico o análisis de sintaxis. Al comparar las reglas de la gramática formal, el análisis de sintaxis verifica el significado del texto. La oración como "Dame un helado caliente", por ejemplo, sería rechazada por el analizador sintáctico o el analizador sintáctico.

En este sentido, podemos definir parsing o análisis sintáctico o análisis de sintaxis de la siguiente manera:

Puede definirse como el proceso de analizar las cadenas de símbolos en el lenguaje natural conforme a las reglas de la gramática formal.

Podemos comprender la relevancia del análisis sintáctico en PNL con la ayuda de los siguientes puntos:

  • El analizador se utiliza para informar cualquier error de sintaxis.

  • Ayuda a recuperarse de errores que ocurren comúnmente para que el procesamiento del resto del programa pueda continuar.

  • El árbol de análisis se crea con la ayuda de un analizador.

  • El analizador se utiliza para crear una tabla de símbolos, que juega un papel importante en la PNL.

  • El analizador también se utiliza para producir representaciones intermedias (IR).

Análisis profundo frente a análisis superficial

Análisis profundo Análisis superficial
En el análisis profundo, la estrategia de búsqueda dará una estructura sintáctica completa a una oración. Es la tarea de analizar una parte limitada de la información sintáctica de la tarea dada.
Es adecuado para aplicaciones complejas de PNL. Se puede utilizar para aplicaciones de PNL menos complejas.
Los sistemas de diálogo y el resumen son ejemplos de aplicaciones de PNL en las que se utiliza el análisis profundo. La extracción de información y la minería de texto son ejemplos de aplicaciones de PNL en las que se utiliza el análisis profundo.
También se llama análisis completo. También se llama fragmentación.

Varios tipos de analizadores

Como se discutió, un analizador es básicamente una interpretación procedimental de la gramática. Encuentra un árbol óptimo para la oración dada después de buscar en el espacio de una variedad de árboles. Veamos algunos de los analizadores disponibles a continuación:

Analizador sintáctico de descenso recursivo

El análisis sintáctico de descenso recursivo es una de las formas más sencillas de análisis sintáctico. A continuación se presentan algunos puntos importantes sobre el analizador de descenso recursivo:

  • Sigue un proceso de arriba hacia abajo.

  • Intenta verificar que la sintaxis del flujo de entrada sea correcta o no.

  • Lee la oración de entrada de izquierda a derecha.

  • Una operación necesaria para el analizador sintáctico descendente recursivo es leer caracteres del flujo de entrada y relacionarlos con los terminales de la gramática.

Analizador de cambio-reducción

A continuación se presentan algunos puntos importantes sobre el analizador sintáctico shift-reduce:

  • Sigue un proceso simple de abajo hacia arriba.

  • Intenta encontrar una secuencia de palabras y frases que correspondan al lado derecho de una producción gramatical y las reemplaza con el lado izquierdo de la producción.

  • El intento anterior de encontrar una secuencia de palabras continúa hasta que se reduce la oración completa.

  • En otras palabras simples, el analizador shift-reduce comienza con el símbolo de entrada e intenta construir el árbol del analizador hasta el símbolo de inicio.

Analizador de gráficos

A continuación se presentan algunos puntos importantes sobre el analizador de gráficos:

  • Es principalmente útil o adecuado para gramáticas ambiguas, incluidas gramáticas de lenguajes naturales.

  • Aplica programación dinámica a los problemas de análisis.

  • Debido a la programación dinámica, los resultados hipotéticos parciales se almacenan en una estructura denominada "gráfico".

  • El 'gráfico' también se puede reutilizar.

Analizador de expresiones regulares

El análisis de expresiones regulares es una de las técnicas de análisis más utilizadas. A continuación se presentan algunos puntos importantes sobre el analizador Regexp:

  • Como su nombre lo indica, utiliza una expresión regular definida en forma de gramática en la parte superior de una cadena con etiqueta POS.

  • Básicamente usa estas expresiones regulares para analizar las oraciones de entrada y generar un árbol de análisis a partir de esto.

Ejemplo

A continuación se muestra un ejemplo funcional de Regexp Parser:

import nltk
sentence = [
   ("a", "DT"),
   ("clever", "JJ"),
   ("fox","NN"),
   ("was","VBP"),
   ("jumping","VBP"),
   ("over","IN"),
   ("the","DT"),
   ("wall","NN")
]
grammar = "NP:{<DT>?<JJ>*<NN>}" 
Reg_parser = nltk.RegexpParser(grammar)
Reg_parser.parse(sentence)
Output = Reg_parser.parse(sentence)
Output.draw()

Salida

Análisis de dependencias

Análisis de dependencias (DP), un mecanismo de análisis moderno, cuyo concepto principal es que cada unidad lingüística, es decir, palabras, se relaciona entre sí mediante un vínculo directo. Estos enlaces directos son en realidad‘dependencies’en lingüística. Por ejemplo, el siguiente diagrama muestra la gramática de dependencia para la oración“John can hit the ball”.

Paquete NLTK

Hemos seguido las dos formas de realizar análisis de dependencia con NLTK:

Analizador probabilístico de dependencia proyectiva

Esta es la primera forma en que podemos realizar el análisis de dependencias con NLTK. Pero este analizador tiene la restricción de entrenamiento con un conjunto limitado de datos de entrenamiento.

Analizador de Stanford

Esta es otra forma en que podemos hacer análisis de dependencia con NLTK. El analizador de Stanford es un analizador de dependencias de última generación. NLTK tiene un envoltorio alrededor. Para usarlo, necesitamos descargar las siguientes dos cosas:

El analizador Stanford CoreNLP .

Modelo de idioma para el idioma deseado. Por ejemplo, modelo de idioma inglés.

Ejemplo

Una vez que descargó el modelo, podemos usarlo a través de NLTK de la siguiente manera:

from nltk.parse.stanford import StanfordDependencyParser
path_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser.jar'
path_models_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser-3.4.1-models.jar'
dep_parser = StanfordDependencyParser(
   path_to_jar = path_jar, path_to_models_jar = path_models_jar
)
result = dep_parser.raw_parse('I shot an elephant in my sleep')
depndency = result.next()
list(dependency.triples())

Salida

[
   ((u'shot', u'VBD'), u'nsubj', (u'I', u'PRP')),
   ((u'shot', u'VBD'), u'dobj', (u'elephant', u'NN')),
   ((u'elephant', u'NN'), u'det', (u'an', u'DT')),
   ((u'shot', u'VBD'), u'prep', (u'in', u'IN')),
   ((u'in', u'IN'), u'pobj', (u'sleep', u'NN')),
   ((u'sleep', u'NN'), u'poss', (u'my', u'PRP$'))
]