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

Gómez

1/20/2022

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 “política e inteligencia artificial” impartida por Cristina Martínez y Fernando baños el 27 de octubre de 2020

Procesamiento del lenguaje natural

Esquema del lenguaje natural ## Principales ecuaciones utilizadas

Si queremos incluir una ecuación en el texto sería de esta forma: \(E=mc^2\)

Si queremos incluir una ecuación para ilustrarla sería de esta forma: \[ E = mc^2 \] Donde: E = Energía m = masa c = constante de la velocidad de la luz

Concepto de PLN

El Procesamiento del Lenguaje Natural es el campo de conocimiento de la Inteligencia Artificial que se ocupa de investigar la manera de comunicar las máquinas dcon las personas mediante el uso de lenguajes naturales, como el español, el inglés o el chino.

Tipos de modelos

  • Modelos Lógicos: gramáticas
  • Modelos probabilísticos del lenguaje natural: basados en datos

Componentes del PLN

  1. Análisis morfológico o léxico.
  2. Análisis sintático.
  3. Análisis semántico.
  4. Análisis pragmático.

En el siguiente enlace pueden ver sus principales aplicaciones

Paquetes

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

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("D:/Cosas varias/Trabajos de clase/Estadistica Aplicada/R Programs")
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: Es un tipo de estructura en el cual se ordenan los datos 
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"))

Data frame de palabras realmente significativasS

En esta sección quitaremos las palabras también llamadas “stop words”

# Remover todas las palabras que se repitan menos de 2 veces

dfrUNPrfWords <- filter(dfrUNPrfWords, str_length(Words)>2)

Listado de remoción

vcsCmnWords <- c("de", "que", "en", "y", "la")
dfrUNPrfWords <- filter(dfrUNPrfWords, !(Words %in% vcsCmnWords))
head(dfrUNPrfWords)
##           Words
## 1      tambiã©n
## 2          estã
## 3    comenzando
## 4 transmisiones
## 5      facebook
## 6          live

Descargas

Código

xfun::embed_file("conteo.Rmd")

Download conteo.Rmd

Datos

xfun::embed_file("politica.txt")

Download politica.txt