PONTIFICIA UNIVERSIDAD CATÓLICA DEL PERÚ
FACULTAD DE CIENCIAS E INGENIERÍA
Analytics 2 (1IND51-0731)
Horario: 0731
Alumnos:
Apellidos y Nombres Código Participación
(%)
Chan Sosa, Melany Paloma 20172523 100
Cacho Zavaleta Sofía 20172721 100
Flavio Andre Fuertes Godenzzi 20180907 100
Frank Neil Huallpa Chura 20143024 100
2022-1
1. Resumen ejecutivo.
En el presente trabajo se resolverá el problema planteado a través del empleo de
técnicas de text mining.
El Text Mining consiste en automatizar el análisis de texto gracias al Machine
Learning. Para conseguirlo, se entrenan los algoritmos con ayuda de textos a modo
de datos de ejemplo
Para poder realizar el análisis tomamos las siguientes suposiciones
● Tiene que haber relaciones entre los datos.
● Los grupos en los cuales se segmentan datos son interpretables y se pueden
diferenciar entre sí
Indice ejecutivo
Página
1. Resumen ejecutivo
1
2. Indice ejecutivo
2
3. Objetivo de trabajo
3
4. Descripción de la base de datos asignadas
4
5. Análisis descriptivo de la base de datos
5
6. Identificación de las tecnicas de analitica aplicables a
cada caso 8
7. Código en R empleado
1
4
3. Objetivo del trabajo
● Emplear técnicas de text mining para poder determinar la tendencia de sentimiento
de los tweets proporcionados en la base de datos.
● Generar un código que mediante diversas funciones permite interpretar los tweet.
4. Descripción de la base de datos asignadas
Base de datos recolectada de Twiter segmentado mediante las siguientes clasificaciones:
Locación
Tweet Fecha
Tweet original
Etiqueta
Tabla 1 : Base de datos
5. Análisis descriptivo de la base de datos
La base de datos trabaja con tres tipos de variables, primero se definirán los tipos de
variables y luego se clasificarán las variables.
Las variables categóricas contienen un número limitado de clases o grupos distintos.
Una variable discreta es una variable que tiene un número contable de valores entre dos
valores cualesquiera.
Una variable continua es una variable que tiene un número infinito de valores entre dos
valores cualesquiera.
Ahora se presentan las variables con su tipo.
Locación ( variable categórica)
Tweet Fecha ( variable categórica)
Tweet original ( variable categórica)
Etiqueta ( variable categórica)
6. Identificación de las tecnicas de analitica aplicables a cada caso:
● Primero se crea una función para eliminar direcciones URL
● Función para remover caracteres distintos de palabras
● Personalizamos palabras conectores
● Construimos el corpus
Limpiamos el corpus , se convierte todo a minúsculas, se remueve número y
puntuación y retiramos los espacios en blanco.
● Completamos o cortamos las palabras a su raíz
● Reemplazo de palabras por palabras similares de mayor frecuencia
● Se construye la matriz término
7. Código de R empleado
#Fijamos los datos
setwd("C:/Users/Usuario/OneDrive/Documents/8vo ciclo/Analytics 2")
#Cargar datos
data_test <- [Link]("Corona_NLP_test.csv", "header" = TRUE, sep = ",",encoding =
"UTF-8")
data_train <- [Link]("Corona_NLP_train.csv", "header" = TRUE, sep = ",",encoding
= "UTF-8")
summary(data_test)
summary(data_train)
library(magrittr)
(n.data_test <- dim(data_test)[1])
#Instalamos el packages("NLP")
library(tm)
# Eliminamos el URL
removeURL <- function(x) gsub("http[^[:space:]]*", "", x)
# Funcion para remover cosas distintas de palabras
removeNumPunct <- function(x) gsub("[^[:alpha:][:space:]]*", "", x)
# Personalziando palabras conectoras
myStopwords <- c(setdiff(stopwords('english'), c("r", "big")),"use", "see", "used",
"via", "amp")
data_test $OriginalTweet[20] %>% strwrap(60) %>% writeLines()
data_test $OriginalTweet <- iconv(data1$OriginalTweet, "ASCII", "UTF-8", sub="byte")
#Creamos el corpus
[Link] <-data_test$OriginalTweet %>% VectorSource() %>% Corpus()
[Link] <- [Link] %>%
#Limpieza del corpus
# Convertir todo a minúsculas
tm_map(content_transformer(tolower)) %>%
# Remover numeros y puntuación
tm_map(content_transformer(removeNumPunct)) %>%
# Retirar a las palabras conectoras
tm_map(removeWords, myStopwords) %>%
# Remover los espacios en blanco extras
tm_map(stripWhitespace)
#[Link]("SnowballC")
library(SnowballC)
#Completado/Cortado de palabras a palabras raiz
[Link] <- [Link] %>% tm_map(stemDocument)
#Completado a raiz
stemCompletion2 <- function(x, dictionary) {
x <- unlist(strsplit([Link](x), " "))
x <- x[x != ""]
x <- stemCompletion(x, dictionary=dictionary) #REVISAR
x <- paste(x, sep="", collapse=" ")
stripWhitespace(x)
[Link] <- [Link] %>%
lapply(stemCompletion2, dictionary=[Link]) %>%
VectorSource() %>% Corpus()
#Contador de frecuencia de palaras
wordFreq <- function(corpus, word) {
results <- lapply(corpus,
function(x) grep([Link](x), pattern=paste0("\\<",word)) )
sum(unlist(results))
[Link] <- [Link] %>% wordFreq("miner")
[Link] <- [Link] %>% wordFreq("mining")
cat([Link], [Link])
# Remplazo de palabra antigua con las palabras nuevas
replaceWord <- function(corpus, oldword, newword) {
tm_map(corpus, content_transformer(gsub),
pattern=oldword, replacement=newword)
[Link] <- [Link] %>%
replaceWord("miner", "mining") %>%
replaceWord("universidad", "university") %>%
replaceWord("scienc", "science")
#Construccion de la matriz de termino
## Build Term Document Matrix
tdm <- [Link] %>%
TermDocumentMatrix(control = list(wordLengths = c(1, Inf))) %>%
print
# ANALISIS EXPLORATORIO DE LA MATRIZ DE TERMINOS
# Identificar dentro de la matriz de terminos la busqueda de terminos relacionados a
"r"
idx <- which(dimnames(tdm)$Terms %in% c("r", "data", "mining"))
tdm[idx, 21:30] %>% [Link]()
# Terminos que cumplen con una frecuencia minima
[Link] <- tdm %>% findFreqTerms(lowfreq = 30) %>% print
# Tabla de frecuencia de terminos por encima de una frecuencia minima
[Link] <- tdm %>% [Link]() %>% rowSums()
[Link] <- [Link] %>% subset([Link] >= 20)
df <- [Link](term = names([Link]), freq = [Link])
df
## Frecuencia de terminos
library(ggplot2)
ggplot(df, aes(x=term, y=freq)) + geom_bar(stat="identity") +
xlab("Terms") + ylab("Count") + coord_flip() +
theme([Link]=element_text(size=14))
## word cloud
m <- tdm %>% [Link]
# calculate the frequency of words and sort it by frequency
[Link] <- m %>% rowSums() %>% sort(decreasing = T)
# colors
library(RColorBrewer)
pal <- [Link](9, "BuGn")[-(1:4)]
# plot word cloud
library(wordcloud)
wordcloud(words = names([Link]), freq = [Link], [Link] = 3,
[Link] = F, colors = "palegreen3")
## Medicion de nivel de relaci?n entre terminos
tdm %>% findAssocs("r", 0.2)
tdm %>% findAssocs("data", 0.2)
# Clustering Jerarquico
## clustering of terms remove sparse terms
m2 <- tdm %>% removeSparseTerms(sparse = 0.95) %>% [Link]()
# calculate distance matrix
[Link] <- m2 %>% scale() %>% dist()
fit <- [Link] %>% hclust(method = "ward.D")
#ploteo
plot(fit)
fit %>% [Link](k = 3) # cut tree into 6 clusters
groups <- fit %>% cutree(k = 3)
##CLUSTERING DE TERMINOS POR K MEDIAS
## k-means clustering of documents
m3 <- m2 %>% t() # transpose the matrix to cluster documents (tweets)
[Link](122) # set a fixed random seed to make the result reproducible
k <- 6 # number of clusters
kmeansResult <- kmeans(m3, k)
round(kmeansResult$centers, digits = 3)
for (i in 1:k) {
cat(paste("cluster ", i, ": ", sep = ""))
s <- sort(kmeansResult$centers[i, ], decreasing = T)
cat(names(s)[1:5], "\n")
# print the tweets of every cluster
# print(tweets[which(kmeansResult?cluster==i)])