Juan David Velásquez Henao
jdvelasq@unal.edu.co
Universidad Nacional de Colombia, Sede Medellín
Facultad de Minas
Medellín, Colombia
[Licencia]
[Readme]
Software utilizado.
Este es un documento interactivo escrito como un notebook de Jupyter, en el cual se presenta un tutorial sobre regresión logistica usando R en el contexto de aprendizaje de maquinas. Los notebooks de Jupyter permiten incoporar simultáneamente código, texto, gráficos y ecuaciones. El código presentado en este notebook puede ejecutarse en los sistemas operativos Linux y OS X.
Haga click aquí para obtener instrucciones detalladas sobre como instalar Jupyter en Windows y Mac OS X.
Haga clic [aquí] para ver la última versión de este documento en nbviewer.
Descargue la última versión de este documento a su disco duro; luego, carguelo y ejecutelo en línea en Try Jupyter!
Haga clic aquí para ver el tutorial de visualización y gráficas.
El modelado de tópicos es un área relativamente reciente que se originó en los campos de procesamiento del lenguaje natural y la recuperación de información, pero tambien ha sido aplicado en una serie de otros dominios. Muchos problemas de clasificación, como el análisis del sentimientos, implican asignar una sola clase a una observación particular por otra parte, en el modelado de tópicos la idea es asignar una mezcla de diferentes clases a una observación.
Básicamente en este tipo de problema, se tiene un conjunto de características y un conjunto de variables ocultas o latentes que generan estas características. Crucialmente, cada observación en el conjunto datos contiene características que se han generado a partir de una mezcla de un subconjunto de estas variables ocultas. Por ejemplo, un ensayo, un sitio web o un artículo de prensa puede tener un tema central como la política, pero también puede incluir uno o más elementos de otros temas, como los derechos humanos, la historia o la economía.
El modelado de tópicos es utilizado de diferentes maneras en la minería de texto. Una posible aplicación es agrupar documentos similares, basados en su tema más predominante, que finalmente, se puede ver como una forma de agrupación. Donde se estudia la composición del tema, las palabras más frecuentes, así como el tamaño relativo de los grupos que se obtienen, y finalmente se resume la información sobre una colección particular de documentos.
Hay dos métodos de aprendizaje automático con las iniciales LDA:
1. Asignación de Dirichlet latente, que es un método de modelado
2. Análisis discriminante lineal, que es un método de clasificación
No tienen relación, excepto por el hecho de que las iniciales LDA pueden referirse a cualquiera.
LDA pertenece a una clase de modelos que son llamados modelos generativos ya que tienen una especie de fábula, que explica cómo se generaron los datos. Esta historia es generativa a una simplificación de la realidad, por supuesto, para hacer más fácil el aprendizaje de la máquina. En primer lugar crear temas mediante la asignación de los pesos de probabilidad a las palabras. cada tema será asignar diferentes pesos a diferentes palabras.
El método usado para ajustar los modelos es el VEM (Variational Expectation-Maximization). Tanto R como Python utilizan este método en sus algoritmos.
Se tiene un número de tópicos $k$ fijado a-priori. El modelo LDA asume que para un documento $w=(w_1,...,w_N)$ de un corpus $D$ que contiene $N$ palabras de un vocabulario con $V$ términos, $w_i \in \{1,...,V\}$ para todo $i=1,...,N$.
$\beta$ es el término de distribución de tópicos y contiene la probabilidad de que una palabra ocurra en un tópico dado.
Para estimar el modelo LDA se realiza el proceso de estimación de máxima verosimilitud (MLE - Maximum Likelihood Estimation). La suma del logaritmo de las similitudes de todos los documentos se maximiza con respecto a los parámetros $\alpha$ y $\beta$. En este caso $\beta$ es el parámetro de interés. Para un documento $w \in D$, la estimación está dada por:
Los datos corresponden a la Primera Conferencia de Recuperación de Texto (TREC-1) 1992. Es un objeto de la clase DocumentTermMatrix
proporcionado por el paquete tm
. Es una matriz que consta de documento-término y contiene 10473 términos en 2246 documentos.
In [1]:
## Instale y cargue las siguientes librerías
library(topicmodels)
In [2]:
## Lectura de los datos
data("AssociatedPress", # Nombre de la base de datos
package = "topicmodels") # Paquete donde extrae los datos
In [3]:
## Modelo de temas utilizando LDA
LDA <- LDA(AssociatedPress,
k = 5)
AssociatedPress$nrow # Número de documentos
In [4]:
## Temas a los que pertenece los doc.
head(topics(LDA))
tail(topics(LDA))
In [10]:
## Histograma de frecuencia
options(repr.plot.width=10, repr.plot.height=4)
hist(topics(LDA), # Datos
breaks=5, # Particiones
xlab="# Temas", # Nombre del eje x
ylab="# Documentos", # Nombre del eje y
col="green") # Color de las barras
El $\alpha$ del modelo está definido como 1 dividido el número de tópicos. Se puede configurar el parametro de la siguiente manera:
In [9]:
## Asignación de parametro alpha
LDA2 <- LDA(AssociatedPress, # Datos
control = list(alpha = 1), # Alpha
k = 5)
In [11]:
## Histograma de frecuencia LDA2
options(repr.plot.width=10, repr.plot.height=4)
hist(topics(LDA2), # Datos
breaks=5, # Particiones
xlab="# Temas", # Nombre del eje x
ylab="# Documentos", # Nombre del eje y
col="purple") # Color de las barras
In [12]:
## Tópicos
terms(LDA)
terms(LDA2)
El comienzo del ejerecicio es para realizar el preprocesamiento de los datos, posteriormente se realizará el modelado de tópicos.
In [1]:
## Instale y cargue las siguientes librerias
library(tm)
library(SnowballC)
In [2]:
## Direccionar el directorio a la carpeta
setwd("topicmodel/")
In [3]:
## Obtener lista de archivos con extensión .txt
filenames <- list.files(getwd(),pattern="*.txt")
## Leer los archivos en un vector de caracteres
files <- lapply(filenames,readLines)
In [4]:
## Creación 'Corpus' del vector de caracteres
docs <- Corpus(VectorSource(files))
## Mostar archivo 2 (bigdata)
writeLines(as.character(docs[[2]]))
In [5]:
## Transformar contenido para poner todo en minuscula
docs <-tm_map(docs, # Datos formato 'Corpus'
content_transformer(tolower)) # Transformación
In [6]:
## Retirar simbolos que puedan afectar el estudio
toSpace <- content_transformer(function(x, pattern){
return (gsub(pattern," ", x))
}
)
docs <- tm_map(docs, toSpace, "-")
docs <- tm_map(docs, toSpace, "’")
docs <- tm_map(docs, toSpace, "‘")
docs <- tm_map(docs, toSpace, "•")
docs <- tm_map(docs, toSpace, "“")
docs <- tm_map(docs, toSpace, "”")
In [7]:
## Retirar puntuación
docs <- tm_map(docs, removePunctuation)
## Remover números
docs <- tm_map(docs, removeNumbers)
## Remover palabras
docs <- tm_map(docs, removeWords, stopwords("english"))
## Remover espacios en blanco
docs <- tm_map(docs, stripWhitespace)
## Mostar archivo 2 (bigdata) con las transformaciones realizadas
writeLines(as.character(docs[[2]]))
In [8]:
## Guardar documento
docs <- tm_map(docs,stemDocument)
In [9]:
## Arreglar errores de sintaxis en ingles y generales
docs <- tm_map(docs, content_transformer(gsub),
pattern = "organiz", replacement = "organ")
docs <- tm_map(docs, content_transformer(gsub),
pattern = "organis", replacement = "organ")
docs <- tm_map(docs, content_transformer(gsub),
pattern = "andgovern", replacement = "govern")
docs <- tm_map(docs, content_transformer(gsub),
pattern = "inenterpris", replacement = "enterpris")
docs <- tm_map(docs, content_transformer(gsub),
pattern = "team-", replacement = "team")
In [10]:
## Definir conjunto de palabras para removerlas
myStopwords <- c("can", "say","one","way","use",
"also","howev","tell","will",
"much","need","take","tend",
"even","like","particular",
"rather","said","get","well",
"make","ask","come","end",
"first","two","help","often",
"may","might","see","someth",
"thing","point","post","look",
"right","now","think","‘ve ",
"‘re ","anoth","put","set",
"new","good","want","sure",
"kind","larg","yes,","day",
"etc","quit","sinc","attempt",
"lack","seen","awar","littl",
"ever","moreov","though","found",
"abl","enough","far","earli",
"away","achiev","draw","last",
"never","brief","bit","entir",
"brief","great","lot")
## Remover palabras
docs <- tm_map(docs, removeWords, myStopwords)
## Mostar archivo 2 (bigdata) con las transformaciones realizadas
writeLines(as.character(docs[[2]]))
In [15]:
## Crear documento tipo matriz de conjunto de datos
dtm <- DocumentTermMatrix(docs)
## Nombre de filas como nombre de archivos
rownames(dtm) <- filenames
## Sumar sobre columnas
freq <- colSums(as.matrix(dtm))
## Longitud = numero total de terminos
length(freq)
In [16]:
## Ordenar de manera descendiente
ord <- order(freq,decreasing=TRUE)
## Lista de los terminos
head(freq[ord]) # Primeros terminos
tail(freq[ord]) # últimos terminos
In [17]:
## Guardar terminos en un archivo CSV
write.csv(freq[ord],"word_freq.csv") # Puede ver los datos en la carpeta de directorio que definio al comienzo
Modelado
In [18]:
## Instale y cargue las siguientes librerias
library(topicmodels)
In [19]:
## Definición de parametros
burnin <- 4000
iter <- 2000
thin <- 500
seed <-list(2003,5,63,100001,765)
nstart <- 5
## Número de tópicos
k <- 5
In [27]:
## Modelado
ldaOut <-LDA(dtm, # data
k, # Número de tópicos
method="Gibbs", # Método de ajuste
control=list(nstart=nstart, # Control de parametros
seed = seed,
best=T,
burnin = burnin,
iter = iter,
thin=thin))
In [22]:
## Tópicos asociados a cada artchivo
ldaOut.topics <- as.matrix(topics(ldaOut))
## Guardar salida en archivo CSV
write.csv(ldaOut.topics,
file=paste("LDAGibbs",k,"DocsToTopics.csv"))
In [25]:
ldaOut.topics
In [23]:
## 6 primeros terminos por cada tópico
ldaOut.terms <- as.matrix(terms(ldaOut,6))
write.csv(ldaOut.terms,
file=paste("LDAGibbs",k,"TopicsToTerms.csv"))
In [26]:
ldaOut.terms
Ejercicio.-- El siguiente conjunto de datos contiene 229 archivos de texto donde cada uno tiene el resumen de un artículo cientifico. Realice un modelado de tópicos para este conjunto de datos utilizando las técnicas presentadas en este notebook.
In [ ]: