#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")

Video de youtube de la charla:

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)")