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
- Analisis morfologico o lexico.
- Analisis sintáctico.
- Analisis semantico.
- 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)")