Introducción al Análisis de Lenguaje Natural basado en Corpus

11º Jornadas de Ciencias de la Computación

16, 17 y 18 de Octubre de 2013 - Rosario, Argentina

Resumen

El Procesamiento de Lenguaje Natural (PLN) es el área que estudia algoritmos que procesan lenguaje humano. Las tareas de PLN van desde el reconocimiento del habla hasta la extracción de información semántica, pasando por la segmentación de palabras y oraciones, y el análisis sintáctico, entre otras. A mediados de los 90, la introducción del uso de corpus anotados y de modelos estadísticos produjo una revolución en la performance de los sistemas de PLN.

En esta charla daré una introducción al PLN basado en corpus, con especial énfasis en la tarea de análisis sintáctico. Para ello introduciré conceptos de gramáticas probabilísticas, algoritmos de estimación basada en corpus, y algoritmos de análisis sintáctico (parsing) de oraciones.

Ejemplos en NLTK

Dependencias:

  • python-nltk
  • python-tk

Arrancar:

$ python
>>> import nltk

CFGs

Definir una gramática libre de contexto:

>>> grammar = nltk.parse_cfg("""
S -> NP VP
NP -> Det Noun | Noun Adj
VP -> Verb NP
Det -> 'el'
Noun -> 'gato' | 'pescado'
Verb -> 'come'
Adj -> 'crudo'
""")

Crear un parser y parsear:

>>> parser = nltk.ChartParser(grammar)
>>> t = parser.parse('el gato come pescado crudo'.split())
>>> print t
>>> t.draw()
>>> print parser.parse('el pescado come gato crudo'.split())
>>> print parser.parse('gato crudo come el gato'.split())

PCFGs

Definir una gramática probabilística:

>>> grammar = nltk.parse_pcfg("""
S -> NP VP				[1.0]
NP -> Det Noun 			[0.6] 
NP -> Noun Adj 			[0.4]
VP -> Verb NP				[1.0]
Det -> 'el'				[1.0]
Noun -> 'gato' 			[0.9]
Noun -> 'pescado' 			[0.1]
Verb -> 'come'			[1.0]
Adj -> 'crudo'			[1.0]
""")

Crear un parser probabilístico y parsear:

>>> parser = nltk.ViterbiParser(grammar)
>>> print parser.parse('el gato come pescado crudo'.split())
>>> print parser.parse('el pescado come gato crudo'.split())
>>> print parser.parse('el gato come el gato'.split())

Inducción de PCFGs

Descargar:

Cargar corpus:

>>> import ancora
>>> path = 'ancora/ancora-2.0/'
>>> corpus = ancora.AncoraCorpusReader(path)

Leer una oración:

>>> t = corpus.parsed_sents()[0]
>>> t.draw()
>>> t.productions()

Listar producciones utilizadas en el corpus:

>>> prods = []
>>> for t in corpus.parsed_sents():
...     prods += t.productions()

O bien:

>>> prods = sum((t.productions() for t in corpus.parsed_sents()), [])

Inducir una gramática probabilística:

>>> S = nltk.Nonterminal('sentence')
>>> grammar = nltk.induce_pcfg(S, prods)

Consultar la gramática:

>>> help(grammar)
>>> prods2 = grammar.productions(lhs=nltk.Nonterminal('ncms000'))

Crear un parser probabilístico y parsear:

>>> parser = nltk.ViterbiParser(grammar)
>>> t = parser.parse('El gato come pescado crudo .'.split())
>>> print t
>>> t.draw()
>>> t.prob()