ejercicio2

del Pardo

1/30/2022

Paquetes

library(pacman)
p_load("dplyr", "stringr", "ggplot2", "wordcloud","rmdformats","vembedr", "xfun")

Análisis de conteo de palabras para conocer su frecuencia

Video de youtube de la charla:

embed_url("https://www.youtube.com/watch?v=oz93uo80pGo&ab_channel=fAIrLACJalisco")
  • Este es un ejercicio de la materia de probabilidad y estadística de la clase de las 9:00 a.m. (LMV) del departamento de matemáticas de ITSON.

Procesamiento del lenguaje natural

Entendiendo el lenguaje

Concepto de PLN

  1. Analisis morfologico o lexico.
  2. Analisis sintáctico.
  3. Analisis semantico.
  4. Analisis pragmatico

El siguiente enlace contiene un articulo explicando mas acerca de esto

Funcion

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("~/Universidad en general/4to semestre/Estadistica aplicada/ea9am")
politica <- readLines("monetizar.txt")
head(politica)
## [1] "buenos días mi nombre es génesis"       
## [2] ""                                         
## [3] "manzanares soy comunicóloga de reach"    
## [4] ""                                         
## [5] "haití una empresa mexicana especializada"
## [6] ""

Conteo de lineas (renglones)

#longitud del vector
intLineCount <-length(politica)
intLineCount
## [1] 3416

Conteo de palabras por linea

lstUNPrfLines <- str_split(politica," ")
# palabras por linea
vciUNPrfWperL <- unlist(lapply(lstUNPrfLines, length))
# imprimir media de palabras por linea 
mean(vciUNPrfWperL)
## [1] 3.633197

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] 12411

Mostrar las primeras 100 palabras

head(vcsUNPrfWords, 100)
##   [1] "buenos"        "días"         "mi"            "nombre"       
##   [5] "es"            "génesis"      ""              "manzanares"   
##   [9] "soy"           "comunicóloga" "de"            "reach"        
##  [13] ""              "haití"        "una"           "empresa"      
##  [17] "mexicana"      "especializada" ""              "en"           
##  [21] "administrar"   "grandes"       "volúmenes"    "de"           
##  [25] ""              "datos"         "en"            "esta"         
##  [29] "masterclass"   "titulada"      "cómo"         ""             
##  [33] "monetizar"     "tus"           "datos"         "con"          
##  [37] "inteligencia"  ""              "artificial"    "aprenderán"  
##  [41] "cómo"         "extraer"       "valor"         ""             
##  [45] "de"            "esos"          "datos"         "a"            
##  [49] "partir"        "de"            "algunas"       ""             
##  [53] "tecnologías"  "como"          "ma"            "jin"          
##  [57] "learning"      ""              "inteligencia"  "artificial"   
##  [61] "entre"         "otras"         "para"          ""             
##  [65] "hablar"        "sobre"         "el"            "tema"         
##  [69] "está"         "con"           "nosotros"      ""             
##  [73] "edwin"         "cházaro"      "chip"          "data"         
##  [77] "officer"       "de"            ""              "rating"       
##  [81] ""              "bienvenido"    "a"             "edwin"        
##  [85] "gracias"       "por"           "estar"         "con"          
##  [89] ""              "nosotros"      "muchas"        "veces"        
##  [93] "y"             "génesis"      ""              "antes"        
##  [97] "de"            "iniciar"       "me"            "gustaría"

Limpieza de palabras

# Convirtiendo todas las palabras a minúsculas 
vcsUNPrfWords <- str_to_lower(vcsUNPrfWords)
# Quitar números
vcsUNPrfWords <- str_replace_all(vcsUNPrfWords, pattern="[[:digit:]]", "")
# remover puntuaciones 
vcsUNPrfWords <- str_replace_all(vcsUNPrfWords, pattern="[[:punct:]]", "")
# remover espacio en blanco 
vcsUNPrfWords <- str_replace_all(vcsUNPrfWords, pattern="[[:space:]]", "")
# remover carateres especiales 
vcsUNPrfWords <- str_replace_all(vcsUNPrfWords, pattern="[~@#$%&-_=<>]", "")
# remover vectores vacíos 
vcsUNPrfWords <- vcsUNPrfWords[vcsUNPrfWords != ""]
# hack & remove $
vcsUNPrfWords <- str_replace_all(vcsUNPrfWords, pattern="$", "")
# head
head(vcsUNPrfWords,100)
##   [1] "buenos"        "dã­as"         "mi"            "nombre"       
##   [5] "es"            "gã©nesis"      "manzanares"    "soy"          
##   [9] "comunicã³loga" "de"            "reach"         "haitã­"       
##  [13] "una"           "empresa"       "mexicana"      "especializada"
##  [17] "en"            "administrar"   "grandes"       "volãºmenes"   
##  [21] "de"            "datos"         "en"            "esta"         
##  [25] "masterclass"   "titulada"      "cã³mo"         "monetizar"    
##  [29] "tus"           "datos"         "con"           "inteligencia" 
##  [33] "artificial"    "aprenderãn"    "cã³mo"         "extraer"      
##  [37] "valor"         "de"            "esos"          "datos"        
##  [41] "a"             "partir"        "de"            "algunas"      
##  [45] "tecnologã­as"  "como"          "ma"            "jin"          
##  [49] "learning"      "inteligencia"  "artificial"    "entre"        
##  [53] "otras"         "para"          "hablar"        "sobre"        
##  [57] "el"            "tema"          "estã"          "con"          
##  [61] "nosotros"      "edwin"         "chãzaro"       "chip"         
##  [65] "data"          "officer"       "de"            "rating"       
##  [69] "bienvenido"    "a"             "edwin"         "gracias"      
##  [73] "por"           "estar"         "con"           "nosotros"     
##  [77] "muchas"        "veces"         "y"             "gã©nesis"     
##  [81] "antes"         "de"            "iniciar"       "me"           
##  [85] "gustarã­a"     "recordarles"   "que"           "al"           
##  [89] "terminar"      "esta"          "masterclass"   "les"          
##  [93] "enviaremos"    "la"            "grabaciã³n"    "a"            
##  [97] "sus"           "correos"       "y"             "pueden"

Data frame con palabras normales

# hacer data frame
dfrUNPrfWords <- data.frame(vcsUNPrfWords) #data frame
colnames(dfrUNPrfWords) <- c("Words") #título de la columna
dfrUNPrfWords$Words <- as.character(dfrUNPrfWords$Words) #convertimos caracteres
# conteo de palabras normales
head(dfrUNPrfWords,10)
##            Words
## 1         buenos
## 2          dã­as
## 3             mi
## 4         nombre
## 5             es
## 6       gã©nesis
## 7     manzanares
## 8            soy
## 9  comunicã³loga
## 10            de

Conteo de palabras “normales”

dfrUNPrfFreq <- dfrUNPrfWords %>% 
                group_by(Words) %>% 
                summarise(Freq=n()) %>% 
                arrange(desc(Freq))
head(dfrUNPrfFreq)
## # A tibble: 6 x 2
##   Words  Freq
##   <chr> <int>
## 1 de      480
## 2 que     473
## 3 y       308
## 4 en      272
## 5 a       259
## 6 es      228

Data frame de palabras realmente significativas

En esta seccion vamos a quitar 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     buenos
## 2      dã­as
## 3     nombre
## 4   gã©nesis
## 5 manzanares
## 6        soy

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 datos     101
## 2 mãs        75
## 3 hacer      45
## 4 quã©       44
## 5 ese        40
## 6 negocio    35

“Cola” de palabras significativas

tail(dfrUNPrfFreq)
## # A tibble: 6 x 2
##   Words      Freq
##   <chr>     <int>
## 1 wifi          1
## 2 winehouse     1
## 3 xallas        1
## 4 youtube       1
## 5 zaro          1
## 6 zombie        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 sino            6
## 2 sirve           6
## 3 tecnologã­as     6
## 4 ustedes         6
## 5 veces           6
## 6 ventas          6

Conteo final de palabras

# total word count = length of vector
intWordCountFinal <- length(dfrUNPrfFreq$Words)
# print
intWordCountFinal
## [1] 199

Categorizacion 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: 5 x 2
##   Fcat       Rfrq
##   <ord>     <int>
## 1 "     10"   116
## 2 "     20"    54
## 3 "     50"    27
## 4 "    100"     1
## 5 "    500"     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"))

Grafica 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()

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

Datos

xfun::embed_file("monetizar.txt")

Download monetizar.txt