Análisis de frecuencia a través de conteo de palabras

Omar Cortez

1/20/2022

Procesamiento del lenguaje natural

Esquema del lenguaje natural

Concepto de PNL

El procesamiento de lenguaje natural, abreviado PLN —en inglés, Natural Language Processing, NLP— es un campo de las ciencias de la computación, de la Inteligencia Artificial y de la lingüística que estudia las interacciones entre las computadoras y el lenguaje humano.

Principales ecuaciones utilizdas

Si quisieramos poner una ecuación en el texto sería de testa forma: \(E=mc²\)

Paquetes

library(pacman)
p_load("dplyr", "stringr", "ggplot2", "wordcloud","rmdformats","vembedr", "xfun")
## Installing package into 'C:/Users/OMAR/Documents/R/win-library/4.1'
## (as 'lib' is unspecified)
## Warning: unable to access index for repository http://www.stats.ox.ac.uk/pub/RWin/bin/windows/contrib/4.1:
##   no fue posible abrir la URL 'http://www.stats.ox.ac.uk/pub/RWin/bin/windows/contrib/4.1/PACKAGES'
## package 'ggplot2' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\OMAR\AppData\Local\Temp\Rtmp2xK0iw\downloaded_packages
## 
## ggplot2 installed
## Warning in p_load("dplyr", "stringr", "ggplot2", "wordcloud", "rmdformats", : Failed to install/load:
## ggplot2

Video de youtube de la charla:

embed_url("https://youtu.be/5PLw3Macsxs")

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("~/EA")
politica <- readLines("politica.txt")
head(politica)
## [1] "también se está comenzando transmisiones"
## [2] ""                                          
## [3] "en facebook live y todos ustedes"          
## [4] ""                                          
## [5] "bienvenidos"                               
## [6] ""

Conteo de lineas

# Longitud de vector 
intLineCount <- length(politica)
intLineCount
## [1] 3182

Conteo de palabras por linea

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

conteo total 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] 11124

Mostrar palabras

head(vcsUNPrfWords,100)
##   [1] "también"       "se"             "está"          "comenzando"    
##   [5] "transmisiones"  ""               "en"             "facebook"      
##   [9] "live"           "y"              "todos"          "ustedes"       
##  [13] ""               "bienvenidos"    ""               "muy"           
##  [17] "buenas"         "tardes"         "a"              "todos"         
##  [21] "sean"           ""               "bienvenidos"    "en"            
##  [25] "dos"            "momentos"       "iniciamos"      ""              
##  [29] "pues"           "de"             "nuevo"          "buenas"        
##  [33] "tardes"         "a"              "todos"          "y"             
##  [37] ""               "todas"          "en"             "mi"            
##  [41] "nombre"         "es"             "lulú"          "velasco"       
##  [45] "y"              ""               "formó"         "parte"         
##  [49] "del"            "equipo"         "del"            "instituto"     
##  [53] "de"             ""               "emprendimiento" "del"           
##  [57] "tec"            "de"             "monterrey"      ""              
##  [61] "región"        "occidente"      "muchas"         "gracias"       
##  [65] "por"            ""               "acompañarnos"  "en"            
##  [69] "esta"           "serie"          "donde"          "vamos"         
##  [73] "a"              ""               "platicar"       "sobre"         
##  [77] "inteligencia"   "artificial"     ""               "y"             
##  [81] "bueno"          "antes"          "de"             "dar"           
##  [85] "inicio"         "les"            "comparto"       ""              
##  [89] "que"            "al"             "finalizar"      "la"            
##  [93] "sesión"        "tendremos"      ""               "algunos"       
##  [97] "minutos"        "de"             "preguntas"      "y"

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] "tambiã©n"       "se"             "estã"           "comenzando"    
##   [5] "transmisiones"  "en"             "facebook"       "live"          
##   [9] "y"              "todos"          "ustedes"        "bienvenidos"   
##  [13] "muy"            "buenas"         "tardes"         "a"             
##  [17] "todos"          "sean"           "bienvenidos"    "en"            
##  [21] "dos"            "momentos"       "iniciamos"      "pues"          
##  [25] "de"             "nuevo"          "buenas"         "tardes"        
##  [29] "a"              "todos"          "y"              "todas"         
##  [33] "en"             "mi"             "nombre"         "es"            
##  [37] "lulãº"          "velasco"        "y"              "formã³"        
##  [41] "parte"          "del"            "equipo"         "del"           
##  [45] "instituto"      "de"             "emprendimiento" "del"           
##  [49] "tec"            "de"             "monterrey"      "regiã³n"       
##  [53] "occidente"      "muchas"         "gracias"        "por"           
##  [57] "acompaã±arnos"  "en"             "esta"           "serie"         
##  [61] "donde"          "vamos"          "a"              "platicar"      
##  [65] "sobre"          "inteligencia"   "artificial"     "y"             
##  [69] "bueno"          "antes"          "de"             "dar"           
##  [73] "inicio"         "les"            "comparto"       "que"           
##  [77] "al"             "finalizar"      "la"             "sesiã³n"       
##  [81] "tendremos"      "algunos"        "minutos"        "de"            
##  [85] "preguntas"      "y"              "respuestas"     "que"           
##  [89] "podrãn"         "compartir"      "con"            "nuestros"      
##  [93] "panelistas"     "y"              "posterior"      "a"             
##  [97] "ellos"          "serãn"          "dirigidos"      "a"

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       tambiã©n
## 2             se
## 3           estã
## 4     comenzando
## 5  transmisiones
## 6             en
## 7       facebook
## 8           live
## 9              y
## 10         todos

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      554
## 2 que     545
## 3 en      289
## 4 y       261
## 5 la      227
## 6 a       179

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

## Descargas

Código

xfun::embed_file("U1A1.Rmd")

Download U1A1.Rmd

Datos

xfun::embed_file("politica.txt")

Download politica.txt