A1U1

Andrea A.

28/1/2022

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

Descargar

Código

xfun::embed_file("A1U1.Rmd")

Download A1U1.Rmd

Datos

xfun::embed_file("futuroDigital.txt")

Download futuroDigital.txt