Lectores de corpus y corpora personalizados
¿Qué es un corpus?
Un corpus es una gran colección, en formato estructurado, de textos legibles por máquina que han sido producidos en un entorno comunicativo natural. La palabra Corpora es el plural de Corpus. Corpus se puede derivar de muchas formas como sigue:
- Del texto que originalmente era electrónico
- De las transcripciones del lenguaje hablado
- Desde el reconocimiento óptico de caracteres, etc.
La representatividad del corpus, el balance del corpus, el muestreo, el tamaño del corpus son los elementos que juegan un papel importante en el diseño del corpus. Algunos de los corpus más populares para tareas de PNL son TreeBank, PropBank, VarbNet y WordNet.
¿Cómo construir un corpus personalizado?
Al descargar NLTK, también instalamos el paquete de datos NLTK. Entonces, ya tenemos el paquete de datos NLTK instalado en nuestra computadora. Si hablamos de Windows, asumiremos que este paquete de datos está instalado enC:\natural_language_toolkit_data y si hablamos de Linux, Unix y Mac OS X, asumiremos que este paquete de datos está instalado en /usr/share/natural_language_toolkit_data.
En la siguiente receta de Python, crearemos corpus personalizados que deben estar dentro de una de las rutas definidas por NLTK. Es así porque NLTK puede encontrarlo. Para evitar conflictos con el paquete de datos oficial NLTK, permítanos crear un directorio natural_language_toolkit_data personalizado en nuestro directorio de inicio.
import os, os.path
path = os.path.expanduser('~/natural_language_toolkit_data')
if not os.path.exists(path):
os.mkdir(path)
os.path.exists(path)
Salida
True
Ahora, comprobemos si tenemos el directorio natural_language_toolkit_data en nuestro directorio de inicio o no -
import nltk.data
path in nltk.data.path
Salida
True
Como tenemos la salida Verdadero, significa que tenemos nltk_data directorio en nuestro directorio de inicio.
Ahora crearemos un archivo de lista de palabras, llamado wordfile.txt y ponerlo en una carpeta, llamada corpus en nltk_data directorio (~/nltk_data/corpus/wordfile.txt) y lo cargará usando nltk.data.load -
import nltk.data
nltk.data.load(‘corpus/wordfile.txt’, format = ‘raw’)
Salida
b’tutorialspoint\n’
Lectores de corpus
NLTK proporciona varias clases de CorpusReader. Los vamos a cubrir en las siguientes recetas de Python.
Crear corpus de listas de palabras
NLTK tiene WordListCorpusReaderclase que proporciona acceso al archivo que contiene una lista de palabras. Para la siguiente receta de Python, necesitamos crear un archivo de lista de palabras que puede ser CSV o un archivo de texto normal. Por ejemplo, hemos creado un archivo llamado 'lista' que contiene los siguientes datos:
tutorialspoint
Online
Free
Tutorials
Ahora creemos una instancia WordListCorpusReader clase que produce la lista de palabras de nuestro archivo creado ‘list’.
from nltk.corpus.reader import WordListCorpusReader
reader_corpus = WordListCorpusReader('.', ['list'])
reader_corpus.words()
Salida
['tutorialspoint', 'Online', 'Free', 'Tutorials']
Creación de corpus de palabras con etiquetas POS
NLTK tiene TaggedCorpusReaderclass con la ayuda de la cual podemos crear un corpus de palabras etiquetadas POS. En realidad, el etiquetado de POS es el proceso de identificar la etiqueta de la parte del discurso de una palabra.
Uno de los formatos más simples para un corpus etiquetado es de la forma 'palabra / etiqueta' como el siguiente extracto del corpus marrón:
The/at-tl expense/nn and/cc time/nn involved/vbn are/ber
astronomical/jj ./.
En el extracto anterior, cada palabra tiene una etiqueta que denota su POS. Por ejemplo,vb se refiere a un verbo.
Ahora creemos una instancia TaggedCorpusReaderclase que produce palabras etiquetadas POS forman el archivo ‘list.pos’, que tiene el extracto anterior.
from nltk.corpus.reader import TaggedCorpusReader
reader_corpus = TaggedCorpusReader('.', r'.*\.pos')
reader_corpus.tagged_words()
Salida
[('The', 'AT-TL'), ('expense', 'NN'), ('and', 'CC'), ...]
Crear corpus de frases fragmentadas
NLTK tiene ChnkedCorpusReaderclass con la ayuda de la cual podemos crear un corpus de frases fragmentadas. En realidad, un fragmento es una frase corta en una oración.
Por ejemplo, tenemos el siguiente extracto del etiquetado treebank corpus -
[Earlier/JJR staff-reduction/NN moves/NNS] have/VBP trimmed/VBN about/
IN [300/CD jobs/NNS] ,/, [the/DT spokesman/NN] said/VBD ./.
En el extracto anterior, cada fragmento es un sintagma nominal, pero las palabras que no están entre corchetes son parte del árbol de oraciones y no parte de ningún subárbol de sintagma nominal.
Ahora creemos una instancia ChunkedCorpusReader clase que produce una frase fragmentada del archivo ‘list.chunk’, que tiene el extracto anterior.
from nltk.corpus.reader import ChunkedCorpusReader
reader_corpus = TaggedCorpusReader('.', r'.*\.chunk')
reader_corpus.chunked_words()
Salida
[
Tree('NP', [('Earlier', 'JJR'), ('staff-reduction', 'NN'), ('moves', 'NNS')]),
('have', 'VBP'), ...
]
Creación de corpus de texto categorizado
NLTK tiene CategorizedPlaintextCorpusReaderclass con la ayuda de la cual podemos crear un corpus de texto categorizado. Es muy útil en caso de que tengamos un gran corpus de texto y queramos clasificarlo en secciones separadas.
Por ejemplo, el cuerpo marrón tiene varias categorías diferentes. Descubrámoslos con la ayuda del siguiente código de Python:
from nltk.corpus import brown^M
brown.categories()
Salida
[
'adventure', 'belles_lettres', 'editorial', 'fiction', 'government',
'hobbies', 'humor', 'learned', 'lore', 'mystery', 'news', 'religion',
'reviews', 'romance', 'science_fiction'
]
Una de las formas más fáciles de clasificar un corpus es tener un archivo para cada categoría. Por ejemplo, veamos los dos extractos delmovie_reviews corpus -
movie_pos.txt
La delgada línea roja es defectuosa pero provoca.
movie_neg.txt
Una producción brillante y de gran presupuesto no puede compensar la falta de espontaneidad que impregna su programa de televisión.
Entonces, de los dos archivos anteriores, tenemos dos categorías a saber pos y neg.
Ahora creemos una instancia CategorizedPlaintextCorpusReader clase.
from nltk.corpus.reader import CategorizedPlaintextCorpusReader
reader_corpus = CategorizedPlaintextCorpusReader('.', r'movie_.*\.txt',
cat_pattern = r'movie_(\w+)\.txt')
reader_corpus.categories()
reader_corpus.fileids(categories = [‘neg’])
reader_corpus.fileids(categories = [‘pos’])
Salida
['neg', 'pos']
['movie_neg.txt']
['movie_pos.txt']