Clase 17: Introducción al análisis de texto (text mining)¶
En esta clase veremos una introducción al procesamiento de texto. Para esto utilizaremos un discurso presidencial y veremos como depurar este texto, de manera que podamos extraer información relevante.
Vamos a
Examinar el texto
Depurar:
Remover símbolos
Remover números
Mayúscula-minúscula
Espacios en blanco
Tíldes
Tokenizar
Frecuencias de palabras
Stopwords
Wordclouds
Stemming
N-gramas
1. Introducción¶
En el mundo moderno tenemos muchas fuentes de información, la tarea es cómo la recopilamos, procesamos y analizamos.
Por ejemplo, las frases, textos, libros, comentarios en redes sociales, son una amplia gama de fuentes de información. El text mining
es “obtener información interesante y no trivial de textos o información no estructurada”.
Ejemplos de información que podemos recopilar y procesar:
Noticias de diarios electrónicos
Libros
Twitter
etc.
Para efectos de esta clase, veremos la librería nltk
(Natural Language Toolkit), que proporciona una potente herramienta de manejo de texto.
# Tratamiento de datos
# ==============================================================================
import numpy as np
import pandas as pd
import string
import re
import nltk
# nltk.download('punkt')
# import nltk.corpus
# from nltk.tokenize import word_tokenize
Vamos a importar un archivo .txt
#Discurso 1
# discurso1 = open('C:\\Users\\ordon\\Dropbox\\Computational_Economics\\Intro_python\\Data_text_proc\\discurso1.txt', 'r')
discurso1 = open('/home/felix/Dropbox/Computational_Economics/Intro_python/Data_text_proc/discurso1.txt', 'r', encoding="latin-1")
discurso1 = discurso1.read()
discurso1
'S.E. la Presidenta de la República, Michelle Bachelet, asiste al lanzamiento de la campaña \x93Chile necesita más médicos y especialistas. Incorpórate al Sistema Público de Salud\x94\nAmigas y amigos:\n\nQué duda cabe, la verdad, como señala esta campaña del Ministerio de Salud, que \x93Chile necesita más Médicos y Especialistas\x94 en el sector público. Y es una necesidad de nuestra sociedad, y estamos dando pasos concretos para poder satisfacer esta necesidad.\n\nY uno de los grandes objetivos que tenemos como Gobierno es, justamente, mejorar la atención de salud que recibe nuestra población.\n\nY una de nuestras preocupaciones centrales es justamente fortalecer y asegurar la capacidad del Estado para responder de manera más rápida y más integral a las necesidades de millones de nuestros compatriotas que utilizan la red pública de consultorios, hospitales, centros de salud familiar y los servicios de urgencia. \n\nLa calidad de vida en nuestro país depende fuertemente de la capacidad que tengamos para, obviamente, prevenir y para asegurar, yo diría, la dignidad y el tratamiento oportuno de las enfermedades que siempre son un duro golpe para las personas y para las familias. \n\nY en este proceso, el rol de los y las profesionales de la salud es fundamental. Para enfrentar las carencias que vive nuestro sistema de salud en este ámbito, como Gobierno pusimos en marcha, desde su inicio, el Plan de Ingreso, Formación y Retención de Médicos Especialistas.\nEste Plan nos permitirá sumar, durante estos cuatro años, mil 100 médicos a la Atención Primaria de Salud y formar 4 mil especialistas, médicos y odontólogos. \n\nY ya hemos obtenido algunos avances importantes en este sentido. Este año, gracias a la ampliación en 370 cupos adicionales cada año para la Etapa de Destinación y Formación, tanto rural como urbana, pudimos contar con 538 nuevos médicos en la Atención Primaria. \n\nY para mí fue bien interesante, doctor Concha, que cuando fui a Puyehue, de los tres médicos que estaban en el CESFAM, dos eran justamente de estos médicos que habían salido con cupos adicionales para la atención primaria. \n\nEs decir, los que corresponden a la ampliación generada por este Gobierno, más los cupos que tenía anteriormente este programa que -los que ya tenemos algunos añitos- conocemos como médicos generales de zona, y que en julio de este año se celebró el aniversario número 60.\n\nLa verdad, yo creo que se trata de una experiencia, desde mi punto de vista, inigualable en la formación de un o una joven profesional de la medicina. \n\nLa tarea de los antiguos médicos generales de zona (o en Etapa de Destinación y Formación) en esas comunidades, como las veíamos en el video, donde hay que llegar en lancha, donde en general las vías de comunicación son escasas -bueno, no muy lejos de aquí, yo me acuerdo, conversando con algún médico general de zona, siendo la epidemióloga del Servicio de Salud Occidente, tenía que ir en Curacaví, pero tenía que subir a caballo a veces a ver un paciente que vivía en algún lado. O sea, que trae un poquito de aventura, trae un poquito de aventura, pero también trae un trabajo intenso, arduo, pero que también es, yo diría, algo que genera una experiencia extraordinaria-, y en general son lugares donde las vías de comunicación muchas veces son escasas, y creo que es un valor que trasciende mucho más allá del tiempo que dura su destinación. \n\nCuando recorro el país, veo el trabajo de los médicos en las localidades del sur, del norte, el cariño que le tienen los vecinos y vecinas; escucho también los recuerdos y recibo los saludos para antiguos médicos generales de zona que con el tiempo han tomado otros rumbos. Estuvimos inaugurando en Paine, me parece que fue, el CESFAM Miguel Ángel Solar, y yo pensé que era el que yo conocía, el que había sido presidente de la FEUC, pero no, era su papá, que había partido ahí, se había especializado, había estado en Estados Unidos y después volvió ahí, hasta que falleció, y trabajó en esa misma localidad. La gente lo recordaba con mucho cariño y era muy emocionante ver los videos de los pacientes que había tenido. \n\nY con la ampliación de cupos en la Etapa de Destinación y Formación, al año 2017 se habrán agregado mil 100 nuevos médicos en la Atención Primaria y en abril de 2018 esta cifra va a llegar a mil 480.\n\nEntonces, vamos a pasar de una situación en la que existía un médico cada 4 mil 300 habitantes -cuando llegamos al gobierno, era la situación que nos encontramos; un médico cada 4 mil 300, a comienzos del 2014- a otra donde habrá un médico por cada 2 mil 800 habitantes, es decir, casi el doble. Todavía nos va a faltar un poquito para lo que son los estándares de la OECD, que son alrededor de 2 mil 100 o 2 mil 200 médicos por ese número de habitantes. Entonces. Esto, obviamente, el llegar a bajar de 4 mil 300 a 2 mil 800 habitantes por médico, creo que nos acerca a los estándares de los países desarrollados. \n\nAdemás, y aquí también aprovecho de agradecer el trabajo que ha hecho el Ministerio con las universidades, con la Asociación de Facultades de Medicina de Chile, con la Asociación Chilena de Enseñanza de Odontología, con el Colegio Médico y con el Colegio de Cirujanos Dentistas, se logró ampliar en un 40% los cupos disponibles para la formación de especialistas.\n\n¡40%! Incluso algunas universidades llegaron a un 100% en la ampliación de sus cupos, y creo que es una tremenda noticia para el avance de la salud en nuestro país.\n\nY éste es un ámbito en el que vamos a continuar poniendo los máximos esfuerzos, ya que existe un importante déficit de especialistas en nuestro país (se estima que son alrededor de 3 mil 800), que afecta directamente, por cierto, la calidad de la atención que reciben los pacientes del sistema público de salud.\n\nLos y las jóvenes egresados de la carrera de medicina tienen mucho interés de participar en estos programas y aproximadamente un 60% de ellos postula a las becas de especialización.\n\nPero queremos que sean todavía más y esperamos que en los próximos años esta cifra llegue al 80%. \n\nAsí, tanto a través de la Ampliación de la Etapa de Destinación y Formación como mediante el aumento de cupos de especialización, iremos disminuyendo las carencias que afectan a la atención pública de salud.\n\nPero, al mismo tiempo, nos permitirá entregar a más profesionales la posibilidad de vivir esta experiencia única, de valor incomparable, que es ejercer el objetivo social de la medicina, llegar a lugares apartados de nuestra patria, conocer realidades diversas, también.\n\nE integrarse a la red más compleja y amplia de atención médica como es el sistema público de salud, donde van a poder formarse de manera continúa a lo largo de su carrera profesional y de aprender de los y las mejores profesionales.\n\nPorque, tal como dice la campaña, \x93Chile necesita más médicos y especialistas\x94, los médicos y especialistas necesitan conocer y valorar las oportunidades que ofrece el Sistema Público de Salud.\n\nPor eso que esta campaña de difusión llegará a todas las facultades de medicina de nuestro país, donde, estoy segura, hay una enorme cantidad de vocaciones de servicio público que esperan aportar al desarrollo de nuestra patria y a la calidad de vida de nuestros compatriotas.\n\nUstedes que están acá en un hospital público, están ejerciendo esto que es tan importante. Queremos motivar a muchos jóvenes más para que la salud pública que ellos consideren seriamente. Y estoy segura que van a sentir todas las situaciones que vivimos los médicos, pero también toda aquella experiencia, de verdad, extraordinaria que significa estar trabajando para la gente. \n\nMuchas gracias.'
Examinar texto¶
discurso1[0:1000]
'S.E. la Presidenta de la República, Michelle Bachelet, asiste al lanzamiento de la campaña \x93Chile necesita más médicos y especialistas. Incorpórate al Sistema Público de Salud\x94\nAmigas y amigos:\n\nQué duda cabe, la verdad, como señala esta campaña del Ministerio de Salud, que \x93Chile necesita más Médicos y Especialistas\x94 en el sector público. Y es una necesidad de nuestra sociedad, y estamos dando pasos concretos para poder satisfacer esta necesidad.\n\nY uno de los grandes objetivos que tenemos como Gobierno es, justamente, mejorar la atención de salud que recibe nuestra población.\n\nY una de nuestras preocupaciones centrales es justamente fortalecer y asegurar la capacidad del Estado para responder de manera más rápida y más integral a las necesidades de millones de nuestros compatriotas que utilizan la red pública de consultorios, hospitales, centros de salud familiar y los servicios de urgencia. \n\nLa calidad de vida en nuestro país depende fuertemente de la capacidad que tengamos para, o'
2. Depurar¶
El proceso de depurar implica remover o cambiar elementos que no son palabras y que para efectos del análisis del texto puedan ser irrelevantes.
Vamos a:
Remover símbolos: Los textos pueden venir con variados símbolos como “,+,,<,@, entre otros.
Remover números: hay que evaluar si los números van a ser relevantes a la hora del texto que queremos analizar. En caso que no lo sean, los vamos a quitar.
Llevar a minúscula: Hola y hola, para efectos del análisis de texto son equivalentes. Por eso llevamos todo a minúsculas.
Eliminar espacios en blanco innecesarios: vamos a borrar cuando hay más de un espacio.
Eliminar tildes: para el análisis de texto podemos eliminar las tildes, para que palabras como analisis y análisis sean equivalentes.
Borrar saltos de línea.
Remover Símbolos¶
import re
regex = '[\\!\\“\\”\\"\\#\\$\\%\\&\\\'\\(\\)\\*\\+\\,\\-\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\\\\\]\\^_\\`\\{\\|\\}\\~]'
nuevo_discurso = re.sub(regex, ' ', discurso1)
print(nuevo_discurso[0:2000])
S E la Presidenta de la República Michelle Bachelet asiste al lanzamiento de la campaña Chile necesita más médicos y especialistas Incorpórate al Sistema Público de Salud
Amigas y amigos
Qué duda cabe la verdad como señala esta campaña del Ministerio de Salud que Chile necesita más Médicos y Especialistas en el sector público Y es una necesidad de nuestra sociedad y estamos dando pasos concretos para poder satisfacer esta necesidad
Y uno de los grandes objetivos que tenemos como Gobierno es justamente mejorar la atención de salud que recibe nuestra población
Y una de nuestras preocupaciones centrales es justamente fortalecer y asegurar la capacidad del Estado para responder de manera más rápida y más integral a las necesidades de millones de nuestros compatriotas que utilizan la red pública de consultorios hospitales centros de salud familiar y los servicios de urgencia
La calidad de vida en nuestro país depende fuertemente de la capacidad que tengamos para obviamente prevenir y para asegurar yo diría la dignidad y el tratamiento oportuno de las enfermedades que siempre son un duro golpe para las personas y para las familias
Y en este proceso el rol de los y las profesionales de la salud es fundamental Para enfrentar las carencias que vive nuestro sistema de salud en este ámbito como Gobierno pusimos en marcha desde su inicio el Plan de Ingreso Formación y Retención de Médicos Especialistas
Este Plan nos permitirá sumar durante estos cuatro años mil 100 médicos a la Atención Primaria de Salud y formar 4 mil especialistas médicos y odontólogos
Y ya hemos obtenido algunos avances importantes en este sentido Este año gracias a la ampliación en 370 cupos adicionales cada año para la Etapa de Destinación y Formación tanto rural como urbana pudimos contar con 538 nuevos médicos en la Atención Primaria
Y para mí fue bien interesante doctor Concha que cuando fui a Puyehue de los tres médicos que estaban en el CESFAM d
Remover números¶
nuevo_discurso = re.sub('\d+', ' ', nuevo_discurso)
print(nuevo_discurso[0:2000])
S E la Presidenta de la República Michelle Bachelet asiste al lanzamiento de la campaña Chile necesita más médicos y especialistas Incorpórate al Sistema Público de Salud
Amigas y amigos
Qué duda cabe la verdad como señala esta campaña del Ministerio de Salud que Chile necesita más Médicos y Especialistas en el sector público Y es una necesidad de nuestra sociedad y estamos dando pasos concretos para poder satisfacer esta necesidad
Y uno de los grandes objetivos que tenemos como Gobierno es justamente mejorar la atención de salud que recibe nuestra población
Y una de nuestras preocupaciones centrales es justamente fortalecer y asegurar la capacidad del Estado para responder de manera más rápida y más integral a las necesidades de millones de nuestros compatriotas que utilizan la red pública de consultorios hospitales centros de salud familiar y los servicios de urgencia
La calidad de vida en nuestro país depende fuertemente de la capacidad que tengamos para obviamente prevenir y para asegurar yo diría la dignidad y el tratamiento oportuno de las enfermedades que siempre son un duro golpe para las personas y para las familias
Y en este proceso el rol de los y las profesionales de la salud es fundamental Para enfrentar las carencias que vive nuestro sistema de salud en este ámbito como Gobierno pusimos en marcha desde su inicio el Plan de Ingreso Formación y Retención de Médicos Especialistas
Este Plan nos permitirá sumar durante estos cuatro años mil médicos a la Atención Primaria de Salud y formar mil especialistas médicos y odontólogos
Y ya hemos obtenido algunos avances importantes en este sentido Este año gracias a la ampliación en cupos adicionales cada año para la Etapa de Destinación y Formación tanto rural como urbana pudimos contar con nuevos médicos en la Atención Primaria
Y para mí fue bien interesante doctor Concha que cuando fui a Puyehue de los tres médicos que estaban en el CESFAM dos era
Convertir a minúscula¶
nuevo_discurso = nuevo_discurso.lower()
print(nuevo_discurso[0:100])
s e la presidenta de la república michelle bachelet asiste al lanzamiento de la campaña chile ne
Eliminar espacios en blanco innecesarios¶
nuevo_discurso = re.sub("\\s+", ' ', nuevo_discurso)
print(nuevo_discurso[0:100])
s e la presidenta de la república michelle bachelet asiste al lanzamiento de la campaña chile neces
Eliminar tildes y líneas en blanco¶
Eliminar diacríticos: tíldes y símbolos como ¨, ^, …
NFC: https://docs.python.org/3/library/unicodedata.html#unicodedata.normalize
from unicodedata import normalize
# -> NFD y eliminar diacríticos
nuevo_discurso = re.sub(
r"([^n\u0300-\u036f]|n(?!\u0303(?![\u0300-\u036f])))[\u0300-\u036f]+", r"\1",
normalize( "NFD", nuevo_discurso), 0, re.I
)
# -> NFC
nuevo_discurso = normalize( 'NFC', nuevo_discurso)
print(nuevo_discurso[0:200])
s e la presidenta de la republica michelle bachelet asiste al lanzamiento de la campaña chile necesita mas medicos y especialistas incorporate al sistema publico de salud amigas y amigos que duda ca
3. Tokenizar¶
Tokenizar significa dividir el texto en una unidad más pequeña, donde cada una de estas unidades va a ser un token
.
Por ejemplo, podemos tokenizar
texto anterior en oraciones o en palabras:
Oraciones:
token 1 = Tokenizar significa dividir el texto en una unidad más pequeña
token 2 = donde cada una de estas unidades va a ser un
token
Palabras:
token 1 = Tokenizar
token 2 = significa
token 3 = dividir
…
En nuestro ejemplo vamos a tokenizar
en base a palabras.
from nltk.tokenize import word_tokenize
token = word_tokenize(nuevo_discurso)
print(token[0:10])
['s', 'e', 'la', 'presidenta', 'de', 'la', 'republica', 'michelle', 'bachelet', 'asiste']
4. Frecuencia de palabras¶
Uno de los primeros análisis que se puede realizar a partir de un texto, es la frecuencia por palabra, es decir cuántas veces se encuentra cada palabra dentro del texto.
from nltk.probability import FreqDist
fdist = FreqDist(token)
fdist
FreqDist({'de': 100, 'que': 62, 'y': 50, 'la': 48, 'en': 35, 'a': 31, 'el': 26, 'los': 25, 'las': 18, 'medicos': 17, ...})
# To find the frequency of top 10 words
fdist1 = fdist.most_common(10)
fdist1
[('de', 100),
('que', 62),
('y', 50),
('la', 48),
('en', 35),
('a', 31),
('el', 26),
('los', 25),
('las', 18),
('medicos', 17)]
5. Stopwords¶
En el ejemplo anterior vemos que las palabras más frecuentes son “de”, “que”, “y”, etc. Palabras que no aportan al análisis del texto, sino que son conectores, prepocisiones. Estas palabras son llamadas stopwords
.
Para cada idioma existe un listado de stopwords
y, dependiendo del contexto, se pueden ir modificando.
# nltk.download('stopwords')
from nltk.corpus import stopwords
stop_words = list(stopwords.words('spanish'))
print(stop_words[0:10])
['de', 'la', 'que', 'el', 'en', 'y', 'a', 'los', 'del', 'se']
token_sw = [x for x in token if x not in stop_words]
print(token_sw[0:10])
['s', 'presidenta', 'republica', 'michelle', 'bachelet', 'asiste', 'lanzamiento', 'campaña', '\x93chile', 'necesita']
fdist = FreqDist(token_sw)
fdist1 = fdist.most_common(10)
fdist1
[('medicos', 17),
('salud', 13),
('mil', 12),
('mas', 11),
('atencion', 8),
('publico', 7),
('formacion', 7),
('cupos', 7),
('especialistas', 6),
('medico', 6)]
6. Wordclouds¶
Una de las visualizaciones clásicas del análisis de texto, es una representación visual de la frecuencia de palabas mediante una nube de palabras (wordclouds).
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import matplotlib.pyplot as plt
comment_words = ''
for i in range(len(token_sw)):
comment_words += " ".join(token_sw)+" "
wordcloud = WordCloud().generate(comment_words)
plt.figure(figsize = (8, 8), facecolor = None)
plt.imshow(wordcloud)
plt.axis("off")
plt.tight_layout(pad = 0)
plt.show()

wordcloud = WordCloud(max_font_size=50, max_words=100, background_color="white").generate(comment_words)
plt.figure(figsize = (10, 10), facecolor = None)
plt.imshow(wordcloud, interpolation="bilinear")
# plt.imshow(wordcloud)
plt.axis("off")
plt.tight_layout(pad = 0)
plt.show()

7. Stemming¶
Stemming
(derivado de) corresponde a una normalización de palabras llevandolas a la raíz. Por ejemplo las palabras médicos, medicas, médico, médica se pueden agrupar dentro de medic
. Luego, en un procesamiento de información nos va ayudar a tener información más depurada.
Sin embargo, tenemos que tener precaución con estas reducciones de significado. Por ejemplo, un paquete podría reducir médico a medic y medicina a medicin, mientras que otro más agresivo podría llevar ambos conceptos a medic. Naturalmente, para efectos del análisis de la información los resultados pueden ser muy variados.
from nltk.stem import SnowballStemmer
stemmer = SnowballStemmer('spanish')
stemmer.stem('medico')
'medic'
token_st =[stemmer.stem(x) for x in token_sw]
token_st[0:10]
['s',
'president',
'republ',
'michell',
'bachelet',
'asist',
'lanzamient',
'campañ',
'\x93chil',
'necesit']
comment_words = ''
for i in range(len(token_st)):
comment_words += " ".join(token_st)+" "
wordcloud = WordCloud(max_font_size=50, max_words=100, background_color="white").generate(comment_words)
plt.figure(figsize = (8, 8), facecolor = None)
plt.imshow(wordcloud, interpolation="bilinear")
# plt.imshow(wordcloud)
plt.axis("off")
plt.tight_layout(pad = 0)
plt.show()

8. N-gramas¶
Podemos escribir “el computador está apagado”, pero sería incorrecto decir “apagado el está computador”. En este contexto, los N-gramas con estructuras de palabras que se suceden.
Por ejemplo:
Bi-grama: (el, computador), (computador, está)
Tri-grama: (el, computador, está), (computador, está, apagado)
Capturamos cierto significado de un conjunto de palabras.
from nltk import ngrams
sentence = 'this is a foo bar sentences and i want to ngramize it'
n = 3
n2grams = ngrams(nuevo_discurso.split(), n)
from nltk.probability import FreqDist
fdist = FreqDist(n2grams)
fdist
FreqDist({('sistema', 'publico', 'de'): 4, ('la', 'atencion', 'primaria'): 4, ('etapa', 'de', 'destinacion'): 4, ('de', 'destinacion', 'y'): 4, ('destinacion', 'y', 'formacion'): 4, ('\x93chile', 'necesita', 'mas'): 3, ('necesita', 'mas', 'medicos'): 3, ('mas', 'medicos', 'y'): 3, ('la', 'calidad', 'de'): 3, ('en', 'nuestro', 'pais'): 3, ...})
fdist1 = fdist.most_common(10)
x=[]
y=[]
for i in fdist1:
x.append(str(i[0]))
y.append(i[1])
print(x[0])
('sistema', 'publico', 'de')
import plotly.graph_objects as go
fig = go.Figure(go.Bar(
x=y,
y=x,
orientation='h'))
fig.update_layout(width=700, height=500)
fig.show()