TEXTMINING
TEXTMINING
TEXTMINING
1. CONTEXTO HISTÓRICO.
Trabajaremos con lenguaje Python, veremos técnicas y conceptos básicos de procesado de elementos de
lenguaje natural y diferentes técnicas para representar documentos de texto de forma que puedan ser
interpretadas por modelos de IA.
B. Clasificación de textos
Encontramos este tipo de herramientas en el día a día. Por ejemplo, el autocompletado de la barra de
búsqueda de Google, un algoritmo de text mining busca las opciones más probables según nuestro perfil
e intereses. Cuando realizamos una pregunta es capaz de detectar que realizamos una pregunta, analizar
qué se está preguntando y recuperar la info y el artículo que nos contesta a dicha pregunta, utilizando
técnicas de text mining de recuperación de la info.
En la segunda mitad del S.XX, a mediados de los 50, un proceso tecnológico conocido como la revolución
digital, transforma el mundo. Durante este período se realizan muchos desarrollos tecnológicos de gran
importancia: el transistor, el ordenador personal y los fundamentos de internet.
En todas las épocas históricas se realizan grandes avances, pero una de las características de la
revolución digital es la reducción del tiempo de adopción tecnológica, especialmente marcado en los
países desarrollados. La evolución de la adopción de diferentes tecnologías hasta la década de los 60
era más largo, luego se reduce.
Ello se produce debido a que:
-Bonanza económica
ERA DE LA INFORMACIÓN
La revolución digital fue un paso previo a la era de la información. En esta era que nos encontramos
ahora, está marcada por la IMPORTANCIA DE LAS TICS (tecnologías de la info y las comunicaciones),
que se han convertido en un motor de la evolución social:
-WEB 2.0. Se pasa de una web 1.0 de expertos a una web2.0 en la que un usuario no profesional puede
generar contenido
-REDES SOCIALES A través de las que establecemos vínculos con personas de todo el mundo
DATOS
Estos datos pueden estar estructurados (como los logs de servidores, o bbdd..) o no estructurados (la
mayoría de los datos son de este tipo, entre ello se encuentran imágenes y vídeos, que son analizados
con técnicas de visión computacional, y textos, que son analizados con técnicas de text mining).
El text mining tiene un origen muy diverso, con mucha multidisciplinariedad, que ha desarrollado
estadísticos, linguistas computacionales e ingenieros de machine learning, por eso la definición del text
mining es bastante inespecífica:
Diagrama de estas tecnologías que parte se han desarrollado en la linguistica tradicional, parte en los
ingenieros de de ML, parte por ingenieros de data mining, parte por bases de datos.. al final el text
mining es una amalgama de muchas tecnologías en las que la estadística tiene vital importancai.
INTRODUCCIÓN
Para trabajar con textos trabajamos con unas minerías de Python, la más conocida es NLTK, ampliamente
usada por investigación, otras librerías están más orientadas a producción y a la reutilización sencilla del
código y de los datos
Usaremos estas 4 pero existen muchas más, como textblog, corenlp o polyglot y cada una de ellas tiene
una serie de características que nos pueden convenir más o menos en un proyecto dado.
Algunas librerías como NLTK son secuenciales, es decir, que para aplicar una función tendremos que
haber pasado nuestros textos previamente por otras funciones, la entrada depende de la salida de otra
función.
Otras librerías como Spacy no son secuenciales, tenemos un texto, se creará un objeto llamado nlp, que
realizará una serie de tareas automaticamente sobre nuestros textos y podremos acceder a dicha info
que usaremos posteriormente para generar modelos de IA
Con !pip install nombre_librería podemos instalar librerías dentro del entorno de jupiter que tenemos
habilitado en la página de google.
Librería NLTK:
Wordnet sirve para cargar la ontología de wordnet dentro del entorno virtual
Stopwords Cargamos las palabras vacías, el listado de palabras vacías incluido dentro de NLTK
La librería SPACY es la librería más actual para realizar técnicas de text mining, permite descargar
modelos preentrenados, usaremos dos: el modelo preentrenado en inglés con contenido de la web y el
modelo preentrenado en español con contenido entrenado a partir de noticias
La librería textacy
De un repo de github descargaremos con !wget los datos que vamos a usar para hacer las pruebas, los
datasets
CORPUS Y CORPORA
Todo proceso de análisis textual comienza con un dataset de documentos textuales, que llamamos
corpus cuando es un único dataset y corpora cuando son varios.
El corpus está compuesto un campo que suele ser el texto en bruto y una serie de metadatos
asociados, aunque no tiene por qué ser así.
Cargamos el contenido del dataset (en este caso un csv) con pd.read_csv('path', encoding-'latin-1')
En el apartado text tenemos el campo del texto en bruto, y una serie de metadatos (headlines, el
titular; la fecha cuando fue publicado en date y la web de donde fue descargado).
Como en este notebook solamente vamos a trabajar con el campo de texto, vamos a filtar esa columna
de texto y la transformaremos en lista para facilitar el procesado.
dataframe['columnaObjetivo'].to_list()
Con print(type(variable)) verificamos el tipo de la variable que acabamos de crear, para corroborar que
es una lista.
Vamos a verificar la longitud de la lista que nos marcaría el corpus, el nº total de documentos
almacenados.
TOKENIZACIÓN
El texto bruto está compuesto por una secuencia de caracteres o palabras, vamos a dividir el texto en
estos tokens o palabras. Un token puede ser una palabra, un símbolo de puntuación, un número, o un
emoticono en caso de que estemos trabajando con redes sociales.
El proceso de división de texto en tokens se llama tokenización o división en palabras en español. Vamos
a realizar el proceso tanto para la librería Spacy como para la librería NLTK para un único texto del
corpus.
TOKENIZACIÓN - NLTK
Con ? podemos ver las vv de entrada que tiene la función : tenemos que introducir el texto, el lneguaje y
preserve_line que como vamos a trabajar con el párrafo lo dejamos en False por defecto
sent_tokenize divide un párrafo en frases, cada una de ellas en una lista. Por comodidad y por rapidez
trabajaremos solamente con un subconjunto de noticias, 100
Vamos a usar sent_tokenize para ver cuántas frases tiene cada una de las noticias, por ejemplo la
noticia 5 que tiene el índice 4
Tras obtener las frases en una lista iteramos dicha lista, vemos que tenemos 3 frases.
TOKENIZAR - SPACY
En Spacy el funcionamiento es distinto, porque está basado en el modelo preentrenado que vamos a
cargar y este modelo se va a encargar de realizar todos los procesos de forma simultánea. Importamos
spacy y con el comando spacy.load cargamos el modelo preentrenado en memoria
Este objeto nlp, si lo ejecutamos, vamos a tener un modelo de lenguaje spacy en inglés que es el que
hemos cargado que ha sido entrenado con datos de páginas web. El sm significa la calidad, el tamaño
de los coeficientes de deep lerning que tiene el modelo, sm es el más sencillo, el md es el medium, etc.
De nuevo cogemos el mismo sub set de noticias y para procesarlo aplicamos el objeto nlp creado
anteriormente a cada documento
Para procesar cada una de estas noticias lo único que vamos a tener que hacer es introducir el objeto
nlp e introducirle el texto, esto nos devuelve un objeto tipo spacy que tiene distintos valores en su
interior (algunos serán los tokens).
Si esto lo queremos aplicarr a toda la lista de noticias creamos una lista, nuestro subset, lo que
hacemos es crear una lista, dentro de la misma lista hacemos un for y procesamos cada una de estas
noticias, de esta forma obtendremos el mismo valor que antes para cada uno de los elementos de
dicha lista, un modelo tipo spacy
Este proceso lo que ha hecho ha sido transformar, nuestros textos, objetos de tipo spacy tokens que
tienen estos atributos y métooso útiles que podemos usar en el pipeline de trabajo. Por ejemplo, si
queremos segmentar las frases, tenemos que iterar sobre el atributo sents
Si queremos obtener tokens independientes para cada una de las frases segmentadas, iteramos sobre
ellas y asignamos ese valor dentro de una lista que se va a llamar tokens, si hacemos el print veremos
que cada uno de los tokens ha sido separado de forma correcta.
Los tokens no aportan demasiada información, en ocasiones necesitamos una información del
contexto y para ello tenemos que calcular los enegramas o bigramas. Unigramas son cuando estamos
hablando del token en si mismo.
En NLTK los enegramas se calculan a través del método util que tiene esta librería, que es la función
ngrams, a la que se le pasa o introduce una secuencia de tokens, el valor n representa el numero de
ngramas (si quieres un unigrama pones un 1, si quieres un bigrama, un 2), el resto de parámetros son
opcionales que permiten rellenar con un valor específico los enegramas extremos de una frase.
Generamos una función para poder crear enegramas de distinto tamaño de forma más ágil, para ello
cargamos las funciones de antes
Definimos la función extraer_ngramas y usamos la función ngrams para calcular los ngramas del valor
que queramos, para ello aplicamos la función tokenize dado que la función ngrams necesita en su
entrada una lista de tokens, que es lo que nos devuelve la función word_tokenize, y le pasamos la
variable datos, y para el valor n de la función le pasamos el valor número que hemos pasado como
variable de nuestra función, esto nos va a retornar una lista con todos los ngramas para cada una de
las frases
Si queremos extraer los bigramas, trigramas y cuatrigramas deberemos cambiar el valor de uno, como
vemos los tokens Hotels e in, han sido unidos en un bigrama, in Maharastra en otro bigrama y así
sucesivamente ,lo mismo pasa con los trigramas sólo que aquí la asociación se hace de 3 en 3
moviendo un valor de cada vez.
EN SPACY
Esto mismo lo podemos hacer en spacy, pero spacy en sí mismo no tiene esta funcionalidad
incorporada. de ahí que se halla descargado la librería textacy. Si queremos trabajar con spacy para
calcular los ngramas introduciremos el modelo en inglés, porque el texto es en inglés, importante,
cuando los textos sean en español tendremso que aplicar en español o el rendimiento no será el
mismo. Cogemos el subset de noticias y para conseguir los objetos spacy que necesita la función que
vamos a usar dentro de spacy, tenemos que cosneguir un objeto de spacy, para ello ejecutamos la
función:
Para calcular los bigramas, trigramas y cuatrigramas de por ejemplo la noticia 4, usaríamos la función
de textacy llamada extract.engrams, introduciendo el objeto, el nº de ngramas, si queremos calcular
los bigramas será un 2, y el min_freq solo te devuelve los ngramas de un documento que aparezcan n
veces. Con filter_stops permite quitar palabras vacías y filter_punct puntuacion. Como queremos
obtener los mismos resultadsos que hemos obtenido antes diremos que no nos filtre ni las palabras
vacías ni los signos de puntuación (ambas a false). Así, nos devuelve la misma lista que teníamos
anteriormente pero calculada con esta función de spacy
Para calcular los trigramas lo único que tenemos que hacer es replicar lo hecho con anterioridad y
cambiar el nº de ngramas
VISUALIZACIÓN
El text mining es una rama de la ciencia de datos y la visualización en la ciencia de datos es muy
importante. Por ello creamos una función para calcular los tokens y bigramas de todo el corpus de
documentos y después generaremos una visualización
Creamos la función frecuencia_tokens a la que hay que introducirle una lista, esto crea un diccionario
vacío llamado frecuencia, itera por los elementos de la lista que le hemos pasado, si el item está
presente dentro del diccionario, le suma un valor al valor de esa clave, y si no lo va a inicializar con el
valor 1, porque será la primera vez que aparece.
Si queremos extrarer los tokens de todos estos documentos, lo que hacemos es:
Creamos una lista_tokens de lista de tokens, en donde vamos a incluir todos esos elementos, vamos a
iterar por cada uno de los elementos del subset de noticias generado anteriormente, vamos a
tokenizar cada uno de esos documentos y vamos a añadir esos tokens, todos esos tokens los metemos
en una única lista, que pasaremos a la función frecuencia_tokens y calcular así el nº de veces que
aparece cada uno de esos tokens.
El resultado es un diccionario que representa un token y el nº de veces que aparece ese token.
Ahora vamos a ordenar ese diccionario y seleccionar sólo aquellos valores mayores de 20.
FLUJO DE DATOS EN TEXT MINING
Dentro de un proyecto de text mining los datos siguen un flujo similar al de cualquier proyecto de data
science.
3 grandes bloques:
-Entrenamiento y evaluación
Se podría añadir un último bloque de análisis exhaustivo de los resultados, visualización de la info o
puesta en producción de un modelo de producción que en este caso no vamos a tratar.
-Obtención de los datos textuales con los que queremos trabajar. Se pueden obtener de 3 formas
diferentes: técnicas de scalping (páginas web, descargamos el contenido, el html de una página web,
tal cual, y después realizaremos procesos de limpieza, quitando etiquetas html que no aportan info
semántica del documento), podemos obtener databases de plataformas como kabel o github que te
dan datos reales un poco preprocesados que nos ahorra este proceso de limpieza tedioso, o podemos
usar apis para descargar info de RRSS como twitter
-Análisis preliminar. Una vez disponemos del conjunto de datos limpio, un poco preprocesado, es
aconsejable realizar un análisis preliminar: analizar la longitud media de los documentos, la
distribución de clases, la longitud de los documentos por clase, si aparecen algún tipo de palabras, la
frecuencia de las palabras usadas..
-Preparación del corpus para introducirlo en un sistema de IA. Dividimos el conjunto de datos en
subconjunto de training (entrenamiento) y testeo o evaluación, o más subconjuntos si queremos hacer
validación cruzada
En los procesos o problemas de text mining siempre es necesario transformar los documentos
textuales en un conjunto de características numéricas comprensibles por los algoritmos. Este proceso
de transformación se dividen en dos etapas:
-Normalización. Como los textos en lenguaje natural presentan mucha diversidad en sus formas
escritas, en ocasiones es mejor normalizar estos documentos antes de generar los vectores de
características que hemos visto antes, esos vectores que habíamos generado con TF y DF. Este proceso
de uniformización trata de uniformizar las palabras existentes en el corpus con la intención de reducir
la dimensionalidad de los datos, algo que puede favorecer a la velocidad de entrenamiento y en
ocasiones mejorar su eficiencia, porque stopwords pueden generar sobreentreamiento en los
modelos u otro tipo de problemas.
Los procesos de normalización más comunes son: stemming, lemantización, eliminación de signos de
puntuación, transformación a minúsculas, exclusión de palabras vacías, las stopwords.. en función de
la aplicación del modelo que queremos entrenar podría no ser necesario aplicar todos estos tipos de
normalización.
-Transformación. EL siguiente paso, que también podría llamarse el proceso de generar vectores de
características, consiste en representar el texto de forma numérica, se pueden usar técnicas ya
explicadas como bagofwords o bagofngrams o en función de la aplicación sería recomendable usar
también TF y DF, conteo de palabras o incluso embeddings o modelos de lenguaje más avanzadas.
El último paso del flujo de los datos sería el entrenamiento y la evaluación. Aquí ya irían algoritmos
específicos para la aplicación que queremos utilizar, por ejemplo, veremos sistemas de clasificación
supervisada y sistemas de topic modeling que son unos sistemas más específicos que sirven para
extraer los temas sobre los que tratan un conjunto de documentos muy grande.
EXPLICACIÓN EJERCICIO 6-8h
Tenemos un enlace al notebook de Collab desde el que podemos duplicar para empezar a trabajar, que
incorpora unas funciones para descargar y preparar el dataset que usaremos en la tarea. No todas las
librerías que hemos visto están disponibles en Collab, hay que descargar las librerías y/o módulos
necesarios en cada caso.
Trabajaremos con un conjunto de datos reales publicados para la shared-task ProfNER de 2021. Se pide
usar los datos textuales de la subtarea 1, centrada en la clasificación de textos, que son un conjutno de
datos provenientes de twitter en español con una etiqueta numérica (presencia 1, ausencia 0) de
menciones de profesiones en el tweet.
Tenemos que entrenar diferentes modelos de clasificación que permitan clasificar correctamente los
tweets, creando y utilizando funciones de preprocesado de datos similares a las vistas en los vídeos y
aplicar diferentes estrategias de vectorización de textos como TF-IDF o embeddings y entrenar/evaluar
modelos de clasificación.
Se puede escoger la estrategia de vectorización que deseemos, pero si usamos TF-IDF habrá que
incorporar en el modelo características adicionales ya sean de sentimientos u otros recursos (ej. nº
adjetivos presentes en un tweet)
Si usamos embeddings no es necesario incorporar características adicionales, lo mejor en este caso sería
usar los embeddings que vimos en clase.
Al menos habrá que testear 3 modelos de clasificación y el procedimiento debe ser similar al visto en
clase: primero evaluar varios algoritmos de forma general para posteriormente seleccionar el mejor para
ajustar los hiperparámetros.