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
- Análisis morfológico o léxico
- Análisis sintáctico
- Análisis semántico
- 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)")