El modelo bolsa de palabras (del inglés, Bag of Words) es un método que se utiliza en el procesado del lenguaje para representar documentos ignorando el orden de las palabras. Con este modelo podemos tener una representación de cada documento, en función de las palabras que este contiene.

Veamos un ejemplo MUY simplificado del procedimiento para construir un modelo de “bolsa de palabras”

Dados dos mensajes msg_a y msg_b:

msg_a<-"Hola, como estas hoy? Queria saber si te interesa comprar mi producto. Mi numero es 4241421"
msg_b<-"Hola, te queria avisar que no tengo noticias todavia. Te llamo, avisa"

Se extraen todas las palabras presentes en ambos mensajes

lista_palabras_msg_a<-strsplit(msg_a," ")[[1]]
lista_palabras_msg_b<-strsplit(msg_b," ")[[1]]

Se eliminan los símbolos

simbolos<-"[?\\.!,]"
lista_palabras_msg_a<-gsub(simbolos,"",lista_palabras_msg_a)
lista_palabras_msg_b<-gsub(simbolos,"",lista_palabras_msg_b)

Se pasan todas las palabras a minúsculas

lista_palabras_msg_a<-tolower(lista_palabras_msg_a)
lista_palabras_msg_b<-tolower(lista_palabras_msg_b)

Se genera el conjunto de palabras presentes en cada mensaje que consta de un total de 23 palabras

bolsa_de_palabras<-unique(c(lista_palabras_msg_a,lista_palabras_msg_b))
cbind(bolsa_de_palabras)
##       bolsa_de_palabras
##  [1,] "hola"           
##  [2,] "como"           
##  [3,] "estas"          
##  [4,] "hoy"            
##  [5,] "queria"         
##  [6,] "saber"          
##  [7,] "si"             
##  [8,] "te"             
##  [9,] "interesa"       
## [10,] "comprar"        
## [11,] "mi"             
## [12,] "producto"       
## [13,] "numero"         
## [14,] "es"             
## [15,] "4241421"        
## [16,] "avisar"         
## [17,] "que"            
## [18,] "no"             
## [19,] "tengo"          
## [20,] "noticias"       
## [21,] "todavia"        
## [22,] "llamo"          
## [23,] "avisa"

Luego, cada mensaje puede ser representado utilizando esta bolsa de palabras. En donde por cada mensaje se construye un vector que contabiliza el numero de veces que una palabra esta presente en dicho mensaje. En este caso primero creamos una matriz de 2x23, donde cada columna está asociada a una palabra y cada fila esta asociada a cada mensaje.

matriz_de_palabras<-matrix(0, ncol=length(bolsa_de_palabras),nrow=2)
colnames(matriz_de_palabras)<-bolsa_de_palabras
rownames(matriz_de_palabras)<-c("msg_a","msg_b")

y luego en cada fila asignamos el vector que contiene la frecuencia absoluta de cada la palabra para obtener una matriz de palabras.

matriz_de_palabras[1,names(table(lista_palabras_msg_a))]<-unname(table(lista_palabras_msg_a))
matriz_de_palabras[2,names(table(lista_palabras_msg_b))]<-unname(table(lista_palabras_msg_b))

knitr::kable(matriz_de_palabras)
hola como estas hoy queria saber si te interesa comprar mi producto numero es 4241421 avisar que no tengo noticias todavia llamo avisa
msg_a 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 0 0 0 0 0 0 0 0
msg_b 1 0 0 0 1 0 0 2 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1

De esta manera vemos que en este caso, cada mensaje se encuentra representado en la matriz de palabras a partir de la distribución de frecuencia de las palabras de la bolsa de palabras.