Blog
Cómo limpiar el texto manualmente usando NLTK
- Publicado por: Rafael Fernandez
- Categoría: Natural Language Processing
Casi siempre deberemos limpiar nuestros textos en bruto antes de pasar a la adaptación de una máquina de aprendizaje o modelo de Deep Learning. Primero debes limpiar tu texto, lo que significa que tienes que dividirlo en palabras, y manejar la puntuación en cada caso. De hecho, hay toda una serie de métodos de preparación de textos que puede que necesites utilizar, y la elección de los métodos realmente dependen de su tarea de procesamiento del lenguaje natural. En este tutorial, descubrirás cómo se puede limpiar y preparar un texto, para el modelado con aprendizaje automático. Después de completar este tutorial sabrás:
- Cómo empezar a desarrollar sus propias herramientas de limpieza de texto de forma simple.
- Cómo dar un paso adelante y utilizar los métodos más sofisticados de la biblioteca NLTK.
- Consideraciones a la hora de preparar textos para modelos de procesamiento de lenguaje natural.
Descripción del tutorial
Este tutorial está dividido en las siguientes partes:
- Selección de un texto (Metamorfosis por Franz Kafka)
- La limpieza de texto
- Tokenización manual
- Tokenización y limpieza con NLTK
- Consideraciones adicionales para la limpieza de texto
Primer paso: Metamosphosis de Franz Kafka
Comencemos por seleccionar un conjunto de datos. En este tutorial utilizaremos el texto del libro Metamorfosis de Franz Kafka. No hay una razón específica, aparte de que es corta, me gusta, y puede que a ti también te guste. Espero que sea uno de esos clásicos que la mayoría de los estudiantes tienen que leer en la escuela. El texto completo de Metamorfosis está disponible gratuitamente en el Proyecto Gutenberg. Puede descargar la versión en texto ASCII del texto aquí:
Metamorfosis por Franz Kafka Plain Text UTF-8 (puede ser necesario cargar la página dos veces).
http://www.gutenberg.org/cache/epub/5200/pg5200.txt
Tambien puedes descargarlo desde aquí.
Descargue el archivo y colóquelo en su directorio de trabajo actual con el nombre de archivo metamorphosis.txt. El archivo contiene información de cabecera y pie de página que no nos interesa, específicamente información sobre derechos de autor y licencias. Abra el archivo y elimine la información del encabezado y pie de página y guarde el archivo como metamorfosis_clean.txt. El inicio del archivo limpio debería ser como:
One morning, when Gregor Samsa woke from troubled dreams, he found himself
transformed in his bed into a horrible vermin…
La limpieza de texto como una tarea específica
Después de obtener los datos de texto, el primer paso para limpiar los datos de texto es tener una idea clara de lo que está tratando de lograr y, en ese contexto, revisar el texto para ver qué es exactamente lo que puede ayudar. Tómese un momento para mirar bien el texto, ya que para limpar debemos conocer previamente el texto. Esto es lo que veo yo en nuestro texto:
- Es texto plano, por lo que no hay marcas que analizar (¡Bien por eso!).
- Las líneas están envueltas artificialmente con nuevas líneas de unos 70 caracteres.
- No hay errores tipográficos ni ortográficos obvios.
- Hay signos de puntuación como comas, apóstrofes, comillas, signos de interrogación y más.
- Hay descripciones con guiones como -como queda dicho-.
- Hay mucho uso del guión (-) para continuar oraciones (¿Tal vez para reemplazar las comas?).
- Hay nombres (p. ej. Sr. Samsa)
- No parece haber números que requieran manipulación.
- Hay marcadores de sección (por ejemplo, II y III).
Estoy seguro de que hay mucho más si analizamos con profundidad. Vamos a ver los pasos generales de limpieza de texto en este pequeño tutorial. No obstante, consideremos algunos posibles objetivos que podamos tener al trabajar con este documento de texto. Por ejemplo:
- Si estamos interesados en desarrollar un modelo de lenguaje kafkiano, es posible que queramos mantener todos los casos, citas y otros signos de puntuación en su lugar.
- Si estuviéramos interesados en clasificar los documentos como Kafka y No Kafka, tal vez quisiéramos quitar en este caso, la puntuación, e incluso recortar algunas palabras a su raíz.
Tienes como tarea elegir cómo preparar tus datos de texto.
Manual de Tokenization
La limpieza de textos es difícil, pero el texto con el que hemos decidido trabajar ya está bastante limpio. Podríamos escribir un poco de código Python para limpiarlo manualmente, y este es un buen ejercicio para esos problemas simples que encuentras. Las herramientas como las expresiones regulares y la división de cadenas te pueden ayudar mucho en esas tareas.
Carga de datos
Vamos a cargar los datos de texto para poder trabajar con ellos. El texto es pequeño y se cargará rápida y fácilmente en la memoria. Esto no siempre será el caso y es posible que tenga que escribir código para mapear el archivo en la memoria. Herramientas como NLTK (cubiertas en la siguiente sección) harán que trabajar con archivos grandes sea mucho más fácil. Podemos cargar toda la metamorfosis_clean.txt.txt en la memoria de la siguiente manera:
# Cargando el texto filename = 'metamorphosis_clean.txt' file = open(filename, 'rt') text = file.read() file.close()
Dividimos por espacios en blanco
Tener el “texto limpio” a menudo significa que existe una lista de palabras o fichas con las que podemos trabajar en nuestros modelos de aprendizaje automático. Esto significa convertir el texto en bruto en una lista de palabras y guardarlo de nuevo. Una forma muy sencilla de hacerlo sería dividir el documento por espacios en blanco, incluyendo ” ” (espacio), nuevas líneas, tabulaciones y más. Podemos hacer esto en Python con la función split() en la cadena cargada.
# cargando texto filename = 'metamorphosis_clean.txt' file = open(filename, 'rt') text = file.read() file.close() # dividimos palabras por un espacio en blanco words = text.split() print(words[:100])
Al ejecutar el ejemplo, el documento se divide en una larga lista de palabras y se imprimen las primeras 100 para que las revisemos. Podemos ver que la puntuación se conserva, lo cual es bueno. También podemos ver que la puntuación del final de la oración se mantiene con la última palabra, lo cual no es tan muy bueno.
['One', 'morning,', 'when', 'Gregor', 'Samsa', 'woke', 'from', 'troubled', 'dreams,', 'he', 'found', 'himself', 'transformed', 'in', 'his', 'bed', 'into', 'a', 'horrible', 'vermin.', 'He', 'lay', 'on', 'his', 'armour-like', 'back,', 'and', 'if', 'he', 'lifted', 'his', 'head', 'a', 'little', 'he', 'could', 'see', 'his', 'brown', 'belly,', 'slightly', 'domed', 'and', 'divided', 'by', 'arches', 'into', 'stiff', 'sections.', 'The', 'bedding', 'was', 'hardly', 'able', 'to', 'cover', 'it', 'and', 'seemed', 'ready', 'to', 'slide', 'off', 'any', 'moment.', 'His', 'many', 'legs,', 'pitifully', 'thin', 'compared', 'with', 'the', 'size', 'of', 'the', 'rest', 'of', 'him,', 'waved', 'about', 'helplessly', 'as', 'he', 'looked.', '"What\'s', 'happened', 'to', 'me?"', 'he', 'thought.', 'It', "wasn't", 'a', 'dream.', 'His', 'room,', 'a', 'proper', 'human']
Seleccionar palabras
Otro enfoque podría ser usar la librería de expresiones regulares regex (re) y dividir el documento en palabras seleccionando las cadenas de caracteres alfanuméricos (‘a-z’, ‘A-Z’, ‘0-9’ y ‘-‘). Por ejemplo:
import re # cargando el texto filename = 'metamorphosis_clean.txt' file = open(filename, 'rt') text = file.read() file.close() # división basada sólo en palabras words = re.split(r'\W+', text) print(words[:100])
De nuevo, ejecutando el ejemplo podemos ver que obtenemos nuestra lista de palabras.
['One', 'morning', 'when', 'Gregor', 'Samsa', 'woke', 'from', 'troubled', 'dreams', 'he', 'found', 'himself', 'transformed', 'in', 'his', 'bed', 'into', 'a', 'horrible', 'vermin', 'He', 'lay', 'on', 'his', 'armour', 'like', 'back', 'and', 'if', 'he', 'lifted', 'his', 'head', 'a', 'little', 'he', 'could', 'see', 'his', 'brown', 'belly', 'slightly', 'domed', 'and', 'divided', 'by', 'arches', 'into', 'stiff', 'sections', 'The', 'bedding', 'was', 'hardly', 'able', 'to', 'cover', 'it', 'and', 'seemed', 'ready', 'to', 'slide', 'off', 'any', 'moment', 'His', 'many', 'legs', 'pitifully', 'thin', 'compared', 'with', 'the', 'size', 'of', 'the', 'rest', 'of', 'him', 'waved', 'about', 'helplessly', 'as', 'he', 'looked', 'What', 's', 'happened', 'to', 'me', 'he', 'thought', 'It', 'wasn', 't', 'a', 'dream', 'His', 'room']
Dividir por espacios en blanco y eliminar la puntuación
Puede que queramos las palabras, pero sin la puntuación como comas y comillas. También queremos mantener las contracciones juntas. Una forma sería dividir el documento en palabras por espacio en blanco (como en la sección Dividir por espacio en blanco), y luego utilizar la traducción de cadenas para reemplazar toda la puntuación por nada (por ejemplo, eliminarla). Python proporciona una constante llamada string.punctuation que proporciona una gran lista de caracteres de puntuación. Por ejemplo:
print(string.punctuation)
Resultados en:
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
Podemos usar expresiones regulares para seleccionar los caracteres de puntuación y usar la función sub() para reemplazarlos por nada. Por ejemplo:
re_punc = re.compile('[%s]' % re.escape(string.punctuation)) # eliminar la puntuación de cada palabra stripped = [re_punc.sub('', w) for w in words]
Podemos juntar todo esto, cargar el archivo de texto, dividirlo en palabras por espacio en blanco, y luego traducir cada palabra para eliminar la puntuación.
import string import re # cargando texto filename = 'metamorphosis_clean.txt' file = open(filename, 'rt') text = file.read() file.close() # dividido de palabras por un espacio en blanco words = text.split() # prepare a regex para el filtrado de caracteres re_punc = re.compile('[%s]' % re.escape(string.punctuation)) # eliminar la puntuación de cada palabra stripped = [re_punc.sub('', w) for w in words] print(stripped[:100])
Podemos ver que esto ha tenido el efecto deseado.
['One', 'morning', 'when', 'Gregor', 'Samsa', 'woke', 'from', 'troubled', 'dreams', 'he', 'found', 'himself', 'transformed', 'in', 'his', 'bed', 'into', 'a', 'horrible', 'vermin', 'He', 'lay', 'on', 'his', 'armourlike', 'back', 'and', 'if', 'he', 'lifted', 'his', 'head', 'a', 'little', 'he', 'could', 'see', 'his', 'brown', 'belly', 'slightly', 'domed', 'and', 'divided', 'by', 'arches', 'into', 'stiff', 'sections', 'The', 'bedding', 'was', 'hardly', 'able', 'to', 'cover', 'it', 'and', 'seemed', 'ready', 'to', 'slide', 'off', 'any', 'moment', 'His', 'many', 'legs', 'pitifully', 'thin', 'compared', 'with', 'the', 'size', 'of', 'the', 'rest', 'of', 'him', 'waved', 'about', 'helplessly', 'as', 'he', 'looked', 'Whats', 'happened', 'to', 'me', 'he', 'thought', 'It', 'wasnt', 'a', 'dream', 'His', 'room', 'a', 'proper', 'human']
A veces, los datos de texto pueden contener caracteres no imprimibles. Podemos utilizar un enfoque similar para filtrar todos los caracteres no imprimibles seleccionando el inverso de la constante string.printable. Por ejemplo:
... re_print = re.compile('[^%s]' % re.escape(string.printable)) result = [re_print.sub('', w) for w in words]
Caso de normalización
Es común convertir todas las palabras en un solo caso. Esto significa que el vocabulario se reducirá en tamaño, pero se pierden algunas distinciones (por ejemplo, Apple). Podemos convertir todas las palabras a minúsculas llamando a la función lower() en cada palabra. Por ejemplo:
filename = 'metamorphosis_clean.txt' file = open(filename, 'rt') text = file.read() file.close() # dividido de palabras por un espacio en blanco words = text.split() # convertir a minúsculas words = [word.lower() for word in words] print(words[:100])
Al ejecutar el ejemplo, podemos ver que todas las palabras están ahora en minúsculas.
['one', 'morning,', 'when', 'gregor', 'samsa', 'woke', 'from', 'troubled', 'dreams,', 'he', 'found', 'himself', 'transformed', 'in', 'his', 'bed', 'into', 'a', 'horrible', 'vermin.', 'he', 'lay', 'on', 'his', 'armour-like', 'back,', 'and', 'if', 'he', 'lifted', 'his', 'head', 'a', 'little', 'he', 'could', 'see', 'his', 'brown', 'belly,', 'slightly', 'domed', 'and', 'divided', 'by', 'arches', 'into', 'stiff', 'sections.', 'the', 'bedding', 'was', 'hardly', 'able', 'to', 'cover', 'it', 'and', 'seemed', 'ready', 'to', 'slide', 'off', 'any', 'moment.', 'his', 'many', 'legs,', 'pitifully', 'thin', 'compared', 'with', 'the', 'size', 'of', 'the', 'rest', 'of', 'him,', 'waved', 'about', 'helplessly', 'as', 'he', 'looked.', '"what\'s', 'happened', 'to', 'me?"', 'he', 'thought.', 'it', "wasn't", 'a', 'dream.', 'his', 'room,', 'a', 'proper', 'human']
Nota acerca de la normalización de texto
Limpiar el texto es realmente difícil, específico del problema y lleno de compromisos. Recuerda, lo simple es mejor. Datos de texto más simples, modelos más simples, vocabularios más pequeños. Usted siempre puede hacer las cosas más complejas más tarde para ver si resulta en una mejor habilidad de modelo. A continuación, veremos algunas de las herramientas de la biblioteca NLTK que ofrecen algo más que la simple división de cadenas.
Tokenización y limpieza con NLTK
El Natural Language Toolkit, o NLTK para abreviar, es una librería Python escrita para trabajar y modelar texto. Proporciona buenas herramientas para cargar y limpiar texto, que podemos utilizar para preparar nuestros datos para trabajar con el aprendizaje automático y los algoritmos de deep learning.
Instalar NLTK
Puede instalar NLTK usando su gestor de paquetes favorito, como pip. En una máquina compatible con POSIX, esto sería:
sudo pip install -U nltk
Instalar NLKT en Anconda (recomendado)
conda install -c anaconda nltk
Después de la instalación, necesitará instalar los datos usados con la librería, incluyendo un gran conjunto de documentos que puede usar más tarde para probar otras herramientas en NLTK. Hay pocas maneras de hacer esto, como desde dentro de un guión:
import nltk nltk.download()
O desde command prompt de window te será mas sencillo ya que podrás ver la descarga:
python -m nltk.downloader all
Dividir en frases
Un buen primer paso útil es dividir el texto en oraciones. Algunas tareas de modelado prefieren que la entrada sea en forma de párrafos u oraciones, como Word2Vec. Primero podría dividir su texto en oraciones, dividir cada oración en palabras, y luego guardar cada oración en un archivo, una por línea. NLTK proporciona la función sent_tokenize() para dividir el texto en frases. El siguiente ejemplo carga el archivo metamorphosis_clean.txt en la memoria, lo divide en oraciones e imprime la primera oración.
from nltk import sent_tokenize # cargando datos filename = 'metamorphosis_clean.txt' file = open(filename, 'rt') text = file.read() file.close() # dividir en oraciones sentences = sent_tokenize(text) print(sentences[0])
Ejecutando el ejemplo, podemos ver que aunque el documento está dividido en oraciones, cada oración todavía conserva la nueva línea de la envoltura artificial de las líneas en el documento original.
One morning, when Gregor Samsa woke from troubled dreams, he found himself transformed in his bed into a horrible vermin.
Dividir en palabras
NLTK proporciona una función llamada word_tokenize() para dividir cadenas en tokens (nominalmente palabras). Divide los tokens según el espacio en blanco y la puntuación. Por ejemplo, las comas y los puntos se toman como tokens separados. Por ejemplo:
from nltk.tokenize import word_tokenize # cargando datos filename = 'metamorphosis_clean.txt' file = open(filename, 'rt') text = file.read() file.close() # dividir en palabras tokens = word_tokenize(text) print(tokens[:100])
Ejecutando el código, podemos ver que la puntuación son ahora símbolos que podríamos decidir filtrar específicamente.
['One', 'morning', ',', 'when', 'Gregor', 'Samsa', 'woke', 'from', 'troubled', 'dreams', ',', 'he', 'found', 'himself', 'transformed', 'in', 'his', 'bed', 'into', 'a', 'horrible', 'vermin', '.', 'He', 'lay', 'on', 'his', 'armour-like', 'back', ',', 'and', 'if', 'he', 'lifted', 'his', 'head', 'a', 'little', 'he', 'could', 'see', 'his', 'brown', 'belly', ',', 'slightly', 'domed', 'and', 'divided', 'by', 'arches', 'into', 'stiff', 'sections', '.', 'The', 'bedding', 'was', 'hardly', 'able', 'to', 'cover', 'it', 'and', 'seemed', 'ready', 'to', 'slide', 'off', 'any', 'moment', '.', 'His', 'many', 'legs', ',', 'pitifully', 'thin', 'compared', 'with', 'the', 'size', 'of', 'the', 'rest', 'of', 'him', ',', 'waved', 'about', 'helplessly', 'as', 'he', 'looked', '.', '``', 'What', "'s", 'happened', 'to']
Filtrar puntuación en la salida del texto
Podemos filtrar todos los tokens que no nos interesan, como por ejemplo todos los signos de puntuación independientes. Esto se puede hacer iterando sobre todos los tokens y manteniendo sólo aquellos tokens que están todos en orden alfabético. Python tiene la función isalpha() que puede ser usada. Por ejemplo:
from nltk.tokenize import word_tokenize # cargando datos filename = 'metamorphosis_clean.txt' file = open(filename, 'rt') text = file.read() file.close() # convirtiendo en palabras tokens = word_tokenize(text) # eliminar todos los tokens que no estén en orden alfabético words = [word for word in tokens if word.isalpha()] print(words[:100])
Al ejecutar el ejemplo, se puede ver que se filtraron los signos de puntuación.
['One', 'morning', 'when', 'Gregor', 'Samsa', 'woke', 'from', 'troubled', 'dreams', 'he', 'found', 'himself', 'transformed', 'in', 'his', 'bed', 'into', 'a', 'horrible', 'vermin', 'He', 'lay', 'on', 'his', 'back', 'and', 'if', 'he', 'lifted', 'his', 'head', 'a', 'little', 'he', 'could', 'see', 'his', 'brown', 'belly', 'slightly', 'domed', 'and', 'divided', 'by', 'arches', 'into', 'stiff', 'sections', 'The', 'bedding', 'was', 'hardly', 'able', 'to', 'cover', 'it', 'and', 'seemed', 'ready', 'to', 'slide', 'off', 'any', 'moment', 'His', 'many', 'legs', 'pitifully', 'thin', 'compared', 'with', 'the', 'size', 'of', 'the', 'rest', 'of', 'him', 'waved', 'about', 'helplessly', 'as', 'he', 'looked', 'What', 'happened', 'to', 'me', 'he', 'thought', 'It', 'was', 'a', 'dream', 'His', 'room', 'a', 'proper', 'human', 'room']
Filtrar las palabras de interrupción
Las palabras reservadas son aquellas que no contribuyen al significado más profundo de la frase. Son las palabras más comunes tales como: the, a, y is. Para algunas aplicaciones como la clasificación de documentación, puede tener sentido eliminar las palabras de parada. NLTK proporciona una lista de palabras de parada comúnmente acordadas para una variedad de idiomas, como el inglés. Se pueden cargar de la siguiente manera:
from nltk.corpus import stopwords stop_words = stopwords.words('english') print(stop_words)
Puede ver que todas son minúsculas y que se ha eliminado la puntuación.
['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', "you're", "you've", "you'll", "you'd", 'your', 'yours', 'yourself', 'yourselves', 'he', 'him', 'his', 'himself', 'she', "she's", 'her', 'hers', 'herself', 'it', "it's", 'its', 'itself', 'they', 'them', 'their', 'theirs', 'themselves', 'what', 'which', 'who', 'whom', 'this', 'that', "that'll", 'these', 'those', 'am', 'is', 'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had', 'having', 'do', 'does', 'did', 'doing', 'a', 'an', 'the', 'and', 'but', 'if', 'or', 'because', 'as', 'until', 'while', 'of', 'at', 'by', 'for', 'with', 'about', 'against', 'between', 'into', 'through', 'during', 'before', 'after', 'above', 'below', 'to', 'from', 'up', 'down', 'in', 'out', 'on', 'off', 'over', 'under', 'again', 'further', 'then', 'once', 'here', 'there', 'when', 'where', 'why', 'how', 'all', 'any', 'both', 'each', 'few', 'more', 'most', 'other', 'some', 'such', 'no', 'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 's', 't', 'can', 'will', 'just', 'don', "don't", 'should', "should've", 'now', 'd', 'll', 'm', 'o', 're', 've', 'y', 'ain', 'aren', "aren't", 'couldn', "couldn't", 'didn', "didn't", 'doesn', "doesn't", 'hadn', "hadn't", 'hasn', "hasn't", 'haven', "haven't", 'isn', "isn't", 'ma', 'mightn', "mightn't", 'mustn', "mustn't", 'needn', "needn't", 'shan', "shan't", 'shouldn', "shouldn't", 'wasn', "wasn't", 'weren', "weren't", 'won', "won't", 'wouldn', "wouldn't"]
Puede comparar sus fichas con las palabras reservadas y filtrarlas, pero debe asegurarse de que su texto esté preparado de la misma manera. Vamos a demostrar esto con un pequeño pipeline de preparación de textos incluyendo:
- Cargar el texto sin procesar.
- Divídanse en fichas.
- Convertir a minúsculas.
- Elimina el signo de puntuación de cada ficha.
- Filtrar los tokens restantes que no estén en orden alfabético.
- Filtrar tokens que son palabras de parada.
import string import re from nltk.tokenize import word_tokenize from nltk.corpus import stopwords # cargando datos filename = 'metamorphosis_clean.txt' file = open(filename, 'rt') text = file.read() file.close() # convirtiendo en palabras tokens = word_tokenize(text) # convertir a minúsculas tokens = [w.lower() for w in tokens] # prepare a regex para el filtrado de caracteres re_punc = re.compile('[%s]' % re.escape(string.punctuation)) # eliminar la puntuación de cada palabra stripped = [re_punc.sub('', w) for w in tokens] # eliminar los tokens restantes que no estén en orden alfabético words = [word for word in stripped if word.isalpha()] # filtrar las palabras de interrupción stop_words = set(stopwords.words('english')) words = [w for w in words if not w in stop_words] print(words[:100])
Al ejecutar este ejemplo, podemos ver que además de todas las otras transformaciones, las palabras de stop como a y haber sido eliminadas. Observo que todavía nos quedan fichas como nt. La madriguera del conejo es profunda; siempre hay algo más que podemos hacer.
['one', 'morning', 'gregor', 'samsa', 'woke', 'troubled', 'dreams', 'found', 'transformed', 'bed', 'horrible', 'vermin', 'lay', 'armourlike', 'back', 'lifted', 'head', 'little', 'could', 'see', 'brown', 'belly', 'slightly', 'domed', 'divided', 'arches', 'stiff', 'sections', 'bedding', 'hardly', 'able', 'cover', 'seemed', 'ready', 'slide', 'moment', 'many', 'legs', 'pitifully', 'thin', 'compared', 'size', 'rest', 'waved', 'helplessly', 'looked', 'happened', 'thought', 'nt', 'dream', 'room', 'proper', 'human', 'room', 'although', 'little', 'small', 'lay', 'peacefully', 'four', 'familiar', 'walls', 'collection', 'textile', 'samples', 'lay', 'spread', 'table', 'samsa', 'travelling', 'salesman', 'hung', 'picture', 'recently', 'cut', 'illustrated', 'magazine', 'housed', 'nice', 'gilded', 'frame', 'showed', 'lady', 'fitted', 'fur', 'hat', 'fur', 'boa', 'sat', 'upright', 'raising', 'heavy', 'fur', 'muff', 'covered', 'whole', 'lower', 'arm', 'towards', 'viewer']
Stemming se refiere al proceso de reducir cada palabra a su raíz o base. Algunas aplicaciones, como la clasificación de documentos, pueden beneficiarse de la derivación para reducir el vocabulario y centrarse en el sentido o sentimiento de un documento más que en un significado más profundo. Hay muchos algoritmos de Stemming, aunque un método popular y de larga data es el algoritmo de Porter Stemming. Este método está disponible en NLTK a través de la clase PorterStemmer. Por ejemplo:
from nltk.tokenize import word_tokenize from nltk.stem.porter import PorterStemmer # cargando datos filename = 'metamorphosis_clean.txt' file = open(filename, 'rt') text = file.read() file.close() # dividirse en palabras tokens = word_tokenize(text) # derivado de las palabras porter = PorterStemmer() stemmed = [porter.stem(word) for word in tokens] print(stemmed[:100])
Al ejecutar el ejemplo, se puede ver que las palabras se han reducido a su origen.
['one', 'morn', ',', 'when', 'gregor', 'samsa', 'woke', 'from', 'troubl', 'dream', ',', 'he', 'found', 'himself', 'transform', 'in', 'hi', 'bed', 'into', 'a', 'horribl', 'vermin', '.', 'He', 'lay', 'on', 'hi', 'armour-lik', 'back', ',', 'and', 'if', 'he', 'lift', 'hi', 'head', 'a', 'littl', 'he', 'could', 'see', 'hi', 'brown', 'belli', ',', 'slightli', 'dome', 'and', 'divid', 'by', 'arch', 'into', 'stiff', 'section', '.', 'the', 'bed', 'wa', 'hardli', 'abl', 'to', 'cover', 'it', 'and', 'seem', 'readi', 'to', 'slide', 'off', 'ani', 'moment', '.', 'hi', 'mani', 'leg', ',', 'piti', 'thin', 'compar', 'with', 'the', 'size', 'of', 'the', 'rest', 'of', 'him', ',', 'wave', 'about', 'helplessli', 'as', 'he', 'look', '.', '``', 'what', "'s", 'happen', 'to']
Hay un buen conjunto de algoritmos de derivación y lematización para elegir en NLTK, si reducir las palabras a su raíz es algo que necesita para su proyecto.
Consideraciones adicionales para la limpieza de texto
No hemos hecho más que empezar. Debido a que el texto fuente de este tutorial era razonablemente limpio al principio, nos hemos saltado muchas preocupaciones sobre la limpieza del texto que podría tener que tratar en su propio proyecto. He aquí una lista breve de consideraciones adicionales al limpiar el texto:
- Manejo de documentos de gran tamaño y grandes colecciones de documentos de texto que no caben en la memoria.
- Extracción de texto de marcas de revisión como HTML, PDF u otros formatos de documentos estructurados.
- Transliteración de caracteres de otros idiomas al inglés.
- Decodificación de caracteres Unicode en una forma normalizada, como UTF-8.
- Manejo de palabras, frases y acrónimos específicos del dominio.
- Manejo o eliminación de números, como fechas e importes.
- Localización y corrección de errores tipográficos y ortográficos comunes.
- Y mucho más….
La lista podría continuar. Esperamos que puedas ver que es imposible obtener un texto verdaderamente limpio, que realmente estamos haciendo lo mejor que podemos basándonos en el tiempo, los recursos y el conocimiento que tenemos. La idea de limpieza está realmente definida por la tarea o preocupación específica de su proyecto.
Un consejo profesional es revisar continuamente sus tokens después de cada transformación. He intentado demostrarlo en este tutorial y espero que se lo tome en serio. Idealmente, usted guardaría un nuevo archivo después de cada transformación para que pueda pasar tiempo con todos los datos en el nuevo formulario. Las cosas siempre saltan a la vista cuando se toma el tiempo para revisar sus datos.
➡ Aprende mucho mas en nuestro curso:
Curso de Natural Language Processing con Deep Learning
Primero felicitarlos. Escribo desde Cuba, una persona mayor, cacharrero – acá llamamos así a quienes aprenden cosas nuevas en la informática por si solos e intercambiando. Por curiosidad y pensando en la posibilidad de ayudar a un nieto me introduje en este ambiente… y aquí estoy pasando trabajo….
He pasado por varios manuales u tutoriales. No he tenido problemas en seguir algunos ejemplos con textos bajados siguiendo instrucciones, pero no lograba acceder a un texto propio… gracias a ustedes lo he logrado…. veo muy claras sus eplicaciones…
Ya abro el archivo, pero algunas funciones como len o set, cuando espero una respuesta basada en palabras, las obtengo en caracteres…. listado de caracteres, total de caracterés…. no logro solucionar esto…
¿¿¿¿ ?????