A1U1

Alfredo Valenzuela

01/29/2022

Paquetes

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

Análisis de conteo de palabras para conocer su frecuencia

  • 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.

Video de la charla

embed_url("https://www.youtube.com/watch?v=VzSKmJTD_5I")

Principales ecuaciones utilizadas

Si lo que se busca es incluir ecuaciones en texto es así: \(E=mc^2\)

Para explicar una ecuación se incluye de la siguiente forma

\[ (1)E=mc^2 \]

En la ecuación (1) tenemos que

  • E= Energía
  • m = masa
  • c = velocidad de la luz

Concepto de PLN

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

En el siguiente enlace pueden ver un articulo explicando un poco más acerca de esto

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")
proyectosIA <- readLines("proyectosIA.txt",encoding = "UTF-8")
head(proyectosIA)
## [1] "para mejorar tu experiencia en ning"  
## [2] ""                                     
## [3] "monterrey a continuación te damos las"
## [4] ""                                     
## [5] "instrucciones para la transmisión"    
## [6] ""

Conteo de lineas

intLineCount <- length(proyectosIA)##Longitud del vector 
intLineCount
## [1] 1408

Conteo de palabras por linea

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

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

Mostrar primeras 100 palabras

head(vcsUNPrfWords, 100)
##   [1] "para"          "mejorar"       "tu"            "experiencia"  
##   [5] "en"            "ning"          ""              "monterrey"    
##   [9] "a"             "continuación"  "te"            "damos"        
##  [13] "las"           ""              "instrucciones" "para"         
##  [17] "la"            "transmisión"   ""              "si"           
##  [21] "te"            "encuentras"    "viendo"        "la"           
##  [25] "transmisión"   ""              "en"            "un"           
##  [29] "dispositivo"   ""              "conecta"       "tus"          
##  [33] "audífonos"     "en"            "el"            "auricular"    
##  [37] ""              "derecho"       "escucharás"    "la"           
##  [41] "transmisión"   "en"            ""              "inglés"       
##  [45] "y"             "en"            "el"            "auricular"    
##  [49] "izquierdo"     ""              "escucharás"    "la"           
##  [53] "traducción"    "en"            "español"       "si"           
##  [57] ""              "estás"         "en"            "una"          
##  [61] "computadora"   "ve"            "a"             "la"           
##  [65] ""              "configuración" "de"            "sonido"       
##  [69] "selecciona"    "si"            ""              "quieres"      
##  [73] "solo"          "escuchar"      "la"            "bocina"       
##  [77] "del"           "lado"          ""              "derecho"      
##  [81] "para"          "inglés"        "o"             "solo"         
##  [85] "la"            "bocina"        "del"           ""             
##  [89] "lado"          "izquierdo"     "para"          "español"      
##  [93] "disfrute"      "la"            ""              "conferencia"  
##  [97] "comenzamos"    ""              "[Música]"      ""

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] "para"          "mejorar"       "tu"            "experiencia"  
##   [5] "en"            "ning"          "monterrey"     "a"            
##   [9] "continuación"  "te"            "damos"         "las"          
##  [13] "instrucciones" "para"          "la"            "transmisión"  
##  [17] "si"            "te"            "encuentras"    "viendo"       
##  [21] "la"            "transmisión"   "en"            "un"           
##  [25] "dispositivo"   "conecta"       "tus"           "audífonos"    
##  [29] "en"            "el"            "auricular"     "derecho"      
##  [33] "escucharás"    "la"            "transmisión"   "en"           
##  [37] "inglés"        "y"             "en"            "el"           
##  [41] "auricular"     "izquierdo"     "escucharás"    "la"           
##  [45] "traducción"    "en"            "español"       "si"           
##  [49] "estás"         "en"            "una"           "computadora"  
##  [53] "ve"            "a"             "la"            "configuración"
##  [57] "de"            "sonido"        "selecciona"    "si"           
##  [61] "quieres"       "solo"          "escuchar"      "la"           
##  [65] "bocina"        "del"           "lado"          "derecho"      
##  [69] "para"          "inglés"        "o"             "solo"         
##  [73] "la"            "bocina"        "del"           "lado"         
##  [77] "izquierdo"     "para"          "español"       "disfrute"     
##  [81] "la"            "conferencia"   "comenzamos"    "música"       
##  [85] "de"            "transmisión"   "música"        "en"           
##  [89] "inglés"        "música"        "música"        "a"            
##  [93] "música"        "música"        "música"        "hola"         
##  [97] "muchas"        "gracias"       "a"             "todos"

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          para
## 2       mejorar
## 3            tu
## 4   experiencia
## 5            en
## 6          ning
## 7     monterrey
## 8             a
## 9  continuación
## 10           te

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      249
## 2 que     183
## 3 la      145
## 4 y       113
## 5 en      112
## 6 el       74

Primera nube de palabras normales

# nube de palabras 
wordcloud(dfrUNPrfFreq$Words[1:150], dfrUNPrfFreq$Freq[1:100], random.order=F, max.words=100, colors=brewer.pal(8, "Dark2"))

Data frame de palabras realmente significantes

# 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","música","tu","presentarse","monterrey","américa","hacemos","aire","poco","estas","soy","lado","sebastian","sus","hoy","sebastian","estamos","Carlos","musica","carlos","cristina","Cristina","Sebastián","sebastián")
dfrUNPrfWords <- filter(dfrUNPrfWords, !(Words %in% vcsCmnWords))

# remover las palabras no significativas para este contexto 
vcsBadWords <- c("decir","muy","están","dos")
dfrUNPrfWords <- filter(dfrUNPrfWords, !(Words %in% vcsBadWords))
# show
head(dfrUNPrfWords)
##           Words
## 1       mejorar
## 2   experiencia
## 3          ning
## 4  continuación
## 5         damos
## 6 instrucciones

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           32
## 2 inteligencia    25
## 3 artificial      22
## 4 todos           15
## 5 nosotros        14
## 6 buenos          11

“cola” de palabras significativas

tail(dfrUNPrfFreq)
## # A tibble: 6 x 2
##   Words       Freq
##   <chr>      <int>
## 1 watson         1
## 2 web            1
## 3 wellington     1
## 4 wikileaks      1
## 5 with           1
## 6 you            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 herramientas     6
## 2 pandemia         6
## 3 poder            6
## 4 responsable      6
## 5 tecnologías      6
## 6 todas            6

Conteo final de palabras

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

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"    24
## 2 "     20"     4
## 3 "     50"     3

Nueva nubes de palabras

wordcloud(dfrUNPrfFreq$Words[1:30], dfrUNPrfFreq$Freq[1:30], 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)")