Análisis de palabras en IA Talks
Este es un ejercicio para la materia de estadistica aplicada, el cual su objetivo es realizar un analisis de palabras de una charla mediante su frecuencia. En este ejemplo se usará la charla denominada “El futuro de la transformación digital de los negocios”
Paquetes
library(pacman)
p_load("dplyr", "stringr", "ggplot2", "wordcloud","rmdformats","vembedr", "xfun")
Video de una charla
embed_url("https://www.youtube.com/watch?v=RgjaQTvcFS0")
Función
FreqCategory <- function(value) {
strCategory <- ifelse(value <=5, " 5",
ifelse(value <=10, " 10",
ifelse(value <=20, " 20",
ifelse(value <=50, " 50",
ifelse(value <=100, " 100",
ifelse(value <=500, " 500",
ifelse(value <=1000, " 1,000",
">1,000")))))))
strCategory
}
Datos de texto
setwd("~/ea9am")
fdigital <- readLines("futuroDigital.txt",encoding = "UTF-8")
head(fdigital)
## [1] "[Música]" "" "[Música]" "" "[Aplausos]"
## [6] ""
Conteo de lineas (renglones)
#longitud del vector
intLineCount <-length(fdigital)
intLineCount
## [1] 3070
Palabras por linea
# separar
lstUNPrfLines <- str_split(fdigital," ")
# palabras por linea
vciUNPrfWperL <- unlist(lapply(lstUNPrfLines, length))
# imprimir media de palabras por linea
mean(vciUNPrfWperL)
## [1] 3.63127
Conteo de palabras
# deslistar para obtener un vector de palabras
vcsUNPrfWords <- unlist(lstUNPrfLines)
# recuento total de palabras = longitud del vector
intWordCount <- length(vcsUNPrfWords)
# imprimir
intWordCount
## [1] 11148
Mostrar palabras
head(vcsUNPrfWords,100)
## [1] "[Música]" "" "[Música]" ""
## [5] "[Aplausos]" "" "[Música]" ""
## [9] "[Aplausos]" "" "[Música]" ""
## [13] "[Música]" "" "[Música]" ""
## [17] "[Música]" "" "[Música]" ""
## [21] "[Música]" "" "i" ""
## [25] "[Música]" "" "i" ""
## [29] "[Música]" "" "[Música]" ""
## [33] "[Música]" "" "perla" "en"
## [37] "jalisco" "es" "una" "iniciativa"
## [41] "" "liderada" "por" "el"
## [45] "banco" "interamericano" "de" ""
## [49] "desarrollo" "el" "tecnológico" "de"
## [53] "monterrey" "" "en" "guadalajara"
## [57] "el" "gobierno" "de" "jalisco"
## [61] "y" "" "si" "mind"
## [65] "ferla" "jalisco" "trabaja" "a"
## [69] "través" "" "de" "la"
## [73] "articulación" "de" "academia" "sociedad"
## [77] "" "civil" "sector" "público"
## [81] "y" "sector" "privado" "en"
## [85] "" "tres" "componentes" ""
## [89] "uno" "es" "la" "implementación"
## [93] "de" "soluciones" "" "tecnológicas"
## [97] "mediante" "técnicas" "de" ""
Limpieza de palabras
# lower case
vcsUNPrfWords <- str_to_lower(vcsUNPrfWords)
# remove numbers
vcsUNPrfWords <- str_replace_all(vcsUNPrfWords, pattern="[[:digit:]]", "")
# remove punctuation
vcsUNPrfWords <- str_replace_all(vcsUNPrfWords, pattern="[[:punct:]]", "")
# remove white spaces
vcsUNPrfWords <- str_replace_all(vcsUNPrfWords, pattern="[[:space:]]", "")
# remove special chars
vcsUNPrfWords <- str_replace_all(vcsUNPrfWords, pattern="[~@#$%&-_=<>]", "")
# remove empty vectors
vcsUNPrfWords <- vcsUNPrfWords[vcsUNPrfWords != ""]
# hack & remove $
vcsUNPrfWords <- str_replace_all(vcsUNPrfWords, pattern="$", "")
# head
head(vcsUNPrfWords,100)
## [1] "música" "música" "aplausos" "música"
## [5] "aplausos" "música" "música" "música"
## [9] "música" "música" "música" "i"
## [13] "música" "i" "música" "música"
## [17] "música" "perla" "en" "jalisco"
## [21] "es" "una" "iniciativa" "liderada"
## [25] "por" "el" "banco" "interamericano"
## [29] "de" "desarrollo" "el" "tecnológico"
## [33] "de" "monterrey" "en" "guadalajara"
## [37] "el" "gobierno" "de" "jalisco"
## [41] "y" "si" "mind" "ferla"
## [45] "jalisco" "trabaja" "a" "través"
## [49] "de" "la" "articulación" "de"
## [53] "academia" "sociedad" "civil" "sector"
## [57] "público" "y" "sector" "privado"
## [61] "en" "tres" "componentes" "uno"
## [65] "es" "la" "implementación" "de"
## [69] "soluciones" "tecnológicas" "mediante" "técnicas"
## [73] "de" "inteligencia" "artificial" "para"
## [77] "resolver" "problemáticas" "sociales" "en"
## [81] "jalisco" "otro" "es" "la"
## [85] "recomendación" "en" "creación" "de"
## [89] "política" "pública" "para" "el"
## [93] "uso" "de" "inteligencia" "artificial"
## [97] "así" "como" "el" "impulso"
Data frame de palabras normales
# make data frame
dfrUNPrfWords <- data.frame(vcsUNPrfWords)
colnames(dfrUNPrfWords) <- c("Words")
dfrUNPrfWords$Words <- as.character(dfrUNPrfWords$Words)
# normal word count
head(dfrUNPrfWords,10)
## Words
## 1 música
## 2 música
## 3 aplausos
## 4 música
## 5 aplausos
## 6 música
## 7 música
## 8 música
## 9 música
## 10 música
Conteo de palabras normales
# resumiendo los datos
dfrUNPrfFreq <- dfrUNPrfWords %>%
group_by(Words) %>%
summarise(Freq=n()) %>%
arrange(desc(Freq))
head(dfrUNPrfFreq)
## # A tibble: 6 x 2
## Words Freq
## <chr> <int>
## 1 de 490
## 2 que 456
## 3 y 302
## 4 a 239
## 5 en 238
## 6 la 198
Nube de palabras normales
# nube de palabras
wordcloud(dfrUNPrfFreq$Words[1:100], dfrUNPrfFreq$Freq[1:100], random.order=F, max.words=100, colors=brewer.pal(8, "Dark2"))
## Data frame de palabras significativas En esta sección quitaremos los conectores u otras palabras que no tengan relevancia.
# significant words only
# remove all words with len <= 2
dfrUNPrfWords <- filter(dfrUNPrfWords, str_length(Words)>2)
# remover las "stop words" o palabras comunes como conjunciones
vcsCmnWords <- c("que","una","pues","para","los","las","como","con","más","por","hay","del","entonces","este","está","nos","pero","además","creo","porque","también","esta","son","tiene","donde","bueno","ha","sobre","ejemplo","bien","gracias","ser","eso","todo","uso","ver","tener","esto","estos","muchas","cómo","cuando","sea","tenemos","su","tienen","así","desde","han","parte","ahí","les","tal","qué","estar", "haber","música", "pasa","vamos","esa", "ver", "sea", "más","mejor","aquí", "estamos","hacer","sin","mucho","cosas","algo", "estoy","evidentemente","igual","voy", "hace", "ese", "puede", "demás", "estas","poco", "ustedes", "tan", "tienes","cual","lado","manera","fue","gustaria","otra","justamente","cualquer","cada","nada","través","quiero","menos","ellos","sus","van","torno","vas","gusta","hacia","cosa","darle","dice","esas","éstas","bastante","cuáles","cuales")
dfrUNPrfWords <- filter(dfrUNPrfWords, !(Words %in% vcsCmnWords))
# remover las palabras no significativas para este contexto
vcsBadWords <- c("decir","muy","están")
dfrUNPrfWords <- filter(dfrUNPrfWords, !(Words %in% vcsBadWords))
# show
head(dfrUNPrfWords)
## Words
## 1 aplausos
## 2 aplausos
## 3 perla
## 4 jalisco
## 5 iniciativa
## 6 liderada
Conteo de palabras significativas
dfrUNPrfFreq <- dfrUNPrfWords %>%
group_by(Words) %>%
summarise(Freq=n()) %>%
arrange(desc(Freq))
head(dfrUNPrfFreq)
## # A tibble: 6 x 2
## Words Freq
## <chr> <int>
## 1 digital 56
## 2 mundo 34
## 3 hoy 31
## 4 transformación 30
## 5 día 27
## 6 méxico 27
“Cola” de palabras significativas
tail(dfrUNPrfFreq)
## # A tibble: 6 x 2
## Words Freq
## <chr> <int>
## 1 vuelve 1
## 2 vuelves 1
## 3 vulneración 1
## 4 web 1
## 5 wings 1
## 6 zacatones 1
Eliminar palabras dispersas
dfrUNPrfFreq <- filter(dfrUNPrfFreq, Freq>5)
tail(dfrUNPrfFreq)
## # A tibble: 6 x 2
## Words Freq
## <chr> <int>
## 1 pregunta 6
## 2 tecnológicas 6
## 3 tipo 6
## 4 tres 6
## 5 varios 6
## 6 viviendo 6
Conteo final de palabras
# total word count = length of vector
intWordCountFinal <- length(dfrUNPrfFreq$Words)
# print
intWordCountFinal
## [1] 114
Categorización por palabras
# add FrequencyCategory colum
dfrUNPrfFreq <- mutate(dfrUNPrfFreq, Fcat=FreqCategory(dfrUNPrfFreq$Freq))
# new data frame for Frequency Of Categorized Frequencies ...
dfrUNPrfFocf <- dfrUNPrfFreq %>% group_by(Fcat) %>% summarise(Rfrq=n())
#
dfrUNPrfFocf$Fcat <- factor(dfrUNPrfFocf$Fcat, levels=dfrUNPrfFocf$Fcat, ordered=T)
# head
head(dfrUNPrfFocf,10)
## # A tibble: 4 x 2
## Fcat Rfrq
## <ord> <int>
## 1 " 10" 67
## 2 " 20" 39
## 3 " 50" 7
## 4 " 100" 1
Nueva nube de palabras
wordcloud(dfrUNPrfFreq$Words[1:50], dfrUNPrfFreq$Freq[1:50], random.order=F, max.words=100, colors=brewer.pal(8, "Dark2"))
Gráfica de barras de palabras
ggplot(slice(dfrUNPrfFreq,1:30), aes(x=reorder(Words,-Freq),y=Freq)) +
geom_bar(stat="identity", fill=rainbow(30)) +
ylab("Frecuencia") +
xlab("Palabras") +
ggtitle("Primeras 30 palabras con mayor frecuencia") +
theme(plot.title=element_text(size=rel(1.5), colour="blue")) +
coord_flip()
Gráfica de frecuencia
ggplot(dfrUNPrfFocf, aes(Fcat,Rfrq))+
geom_bar(stat="identity", width=0.8, fill=rainbow(length(dfrUNPrfFocf$Fcat))) +
xlab("Palabras con frecuencia menor a") + ylab("Frecuencia") +
theme(axis.text.x=element_text(angle=60, hjust=1, vjust=1),axis.text.y=element_text(angle=60, hjust=1, vjust=1),plot.title=element_text(size=rel(1.5), colour="black")) +
ggtitle("Conteo de frecuencia de palabras")
Longitud de palabras
dfrUNPrfChrs <- data.frame(Chars=nchar(dfrUNPrfFreq$Words))
#intRowCount <- nrow(table(dfrUNPrfChrs))
ggplot(dfrUNPrfChrs, aes(x=Chars)) +
geom_histogram(binwidth=1, fill='blue') +
geom_vline(xintercept=mean(nchar(dfrUNPrfFreq$Words)), color='black', size=1.5, alpha=.5) +
xlab("Longitud de palabra (Caracteres)") + ylab("Numero de palabra (Frecuencia)")