#Analisis de conteo de palabras para conocer su frecuencia
*El presente documento tiene como objetivo analizar a través de un conteo de palabras y análisis de frecuencia las charlas. Para este caso se hace el análisis de la charla “como encontrar trabajoy la educacion de tus sueños con Inteligencia Artificial” impartida por Neysa Santoscoy y Pato Bichara el 9 de noviembre de 2021.
##Paquetes
library(pacman)
p_load("dplyr", "stringr", "ggplot2", "wordcloud","rmdformats","vembedr")
embed_url("https://www.youtube.com/watch?v=VLkiR0jL71o")
##Funciones
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
setwd("~/ea9am")
trabajo <- readLines ("trabajo.txt", encoding='UTF-8')
head(trabajo)
## [1] "para preguntas y respuestas pueden"
## [2] ""
## [3] "escribirlas en la parte de johnny y"
## [4] ""
## [5] "posterior a ellos serán redirigidos en"
## [6] ""
##Conteo de lineas
intLineCount <- length(trabajo)
intLineCount
## [1] 2256
##Palabras por linea
# separar
lstUNPrfLines <- str_split(trabajo," ")
# palabras por linea
vciUNPrfWperL <- unlist(lapply(lstUNPrfLines, length))
# imprimir media de palabras por linea
mean(vciUNPrfWperL)
## [1] 3.605496
##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] 8134
##Mostrar palabras
head(vcsUNPrfWords,100)
## [1] "para" "preguntas" "y" "respuestas"
## [5] "pueden" "" "escribirlas" "en"
## [9] "la" "parte" "de" "johnny"
## [13] "y" "" "posterior" "a"
## [17] "ellos" "serán" "redirigidos" "en"
## [21] "" "nuestra" "encuesta" "de"
## [25] "satisfacción" "y" "poder" ""
## [29] "recibir" "la" "memoria" "de"
## [33] "esta" "sesión" "así" ""
## [37] "como" "otros" "recursos" "para"
## [41] "los" "innovadores" "" "y"
## [45] "bueno" "queremos" "platicarles" "un"
## [49] "poco" "" "sobre" "la"
## [53] "iniciativa" "de" "hacerla" "jalisco"
## [57] "y" "" "vamos" "a"
## [61] "presentarles" "un" "videito" "gracias"
## [65] "" "perla" "en" "jalisco"
## [69] "es" "una" "iniciativa" ""
## [73] "liderada" "por" "el" "banco"
## [77] "interamericano" "de" "" "desarrollo"
## [81] "el" "tecnológico" "de" "monterrey"
## [85] "" "en" "guadalajara" "el"
## [89] "gobierno" "de" "jalisco" "y"
## [93] "" "mainz" "" "perla"
## [97] "calixto" "trabaja" "a" "través"
##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] "para" "preguntas" "y" "respuestas"
## [5] "pueden" "escribirlas" "en" "la"
## [9] "parte" "de" "johnny" "y"
## [13] "posterior" "a" "ellos" "serán"
## [17] "redirigidos" "en" "nuestra" "encuesta"
## [21] "de" "satisfacción" "y" "poder"
## [25] "recibir" "la" "memoria" "de"
## [29] "esta" "sesión" "así" "como"
## [33] "otros" "recursos" "para" "los"
## [37] "innovadores" "y" "bueno" "queremos"
## [41] "platicarles" "un" "poco" "sobre"
## [45] "la" "iniciativa" "de" "hacerla"
## [49] "jalisco" "y" "vamos" "a"
## [53] "presentarles" "un" "videito" "gracias"
## [57] "perla" "en" "jalisco" "es"
## [61] "una" "iniciativa" "liderada" "por"
## [65] "el" "banco" "interamericano" "de"
## [69] "desarrollo" "el" "tecnológico" "de"
## [73] "monterrey" "en" "guadalajara" "el"
## [77] "gobierno" "de" "jalisco" "y"
## [81] "mainz" "perla" "calixto" "trabaja"
## [85] "a" "través" "de" "la"
## [89] "articulación" "de" "academia" "sociedad"
## [93] "civil" "sector" "público" "y"
## [97] "sector" "privado" "en" "tres"
##Data frame 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 para
## 2 preguntas
## 3 y
## 4 respuestas
## 5 pueden
## 6 escribirlas
## 7 en
## 8 la
## 9 parte
## 10 de
##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 que 417
## 2 de 337
## 3 y 246
## 4 en 190
## 5 a 181
## 6 la 142
##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 realmente significantes *En esta seccion quitaremos las “stop words”
# 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("de","que","en","y","la","a","el","es","una","un","pues","no","para","los","se","las","como","con","más","por","lo","hay","del","o","entonces","este","está","nos","pero","también","creo","porque","también","yo","ya","esta","si","me","al","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")
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 preguntas
## 2 respuestas
## 3 pueden
## 4 escribirlas
## 5 johnny
## 6 posterior
##Conteo de palabras signficativas
dfrUNPrfFreq <- dfrUNPrfWords %>%
group_by(Words) %>%
summarise(Freq=n()) %>%
arrange(desc(Freq))
head(dfrUNPrfFreq)
## # A tibble: 6 x 2
## Words Freq
## <chr> <int>
## 1 poco 34
## 2 inteligencia 32
## 3 artificial 31
## 4 todos 24
## 5 pregunta 19
## 6 hacer 18
##“Cola” de palabras signficativas
tail(dfrUNPrfFreq)
## # A tibble: 6 x 2
## Words Freq
## <chr> <int>
## 1 weibo 1
## 2 yendo 1
## 3 youtube 1
## 4 yucatán 1
## 5 zacatones 1
## 6 zona 1
##Eliminar palabras dispersas
# palabras con una frecuencia absoluta menor a 5
dfrUNPrfFreq <- filter(dfrUNPrfFreq, Freq>5)
tail(dfrUNPrfFreq)
## # A tibble: 6 x 2
## Words Freq
## <chr> <int>
## 1 punto 6
## 2 quieres 6
## 3 reclutamiento 6
## 4 robot 6
## 5 saber 6
## 6 vez 6
##Conteo final de palabras
# total word count = length of vector
intWordCountFinal <- length(dfrUNPrfFreq$Words)
# print
intWordCountFinal
## [1] 110
##Categorización por frecuencias
# 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: 3 x 2
## Fcat Rfrq
## <ord> <int>
## 1 " 10" 74
## 2 " 20" 32
## 3 " 50" 4
##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("Frequency") +
xlab("Words") +
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("Words With Frequency Less Than") + ylab("Frequency") +
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="blue")) +
ggtitle("Frequency Of Word Count")
##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("Word Length (Chars)") + ylab("Number Of Words (Frequency)")