R Language
Procesamiento natural del lenguaje
Buscar..
Introducción
El procesamiento del lenguaje natural (PNL) es el campo de las ciencias de la computación que se enfoca en recuperar información a partir de datos textuales generados por seres humanos.
Crear una matriz de frecuencia de término
El enfoque más simple del problema (y el más utilizado hasta ahora) es dividir las oraciones en tokens . Simplificando, las palabras tienen significados abstractos y subjetivos para las personas que las usan y reciben, los tokens tienen una interpretación objetiva: una secuencia ordenada de caracteres (o bytes). Una vez que las oraciones se dividen, el orden del token se ignora. Este acercamiento al problema se conoce como modelo de bolsa de palabras .
Un término frecuencia es un diccionario, en el que a cada token se le asigna un peso . En el primer ejemplo, construimos un término matriz de frecuencia a partir de un corpus corpus (una colección de documentos ) con el paquete R tm
.
require(tm)
doc1 <- "drugs hospitals doctors"
doc2 <- "smog pollution environment"
doc3 <- "doctors hospitals healthcare"
doc4 <- "pollution environment water"
corpus <- c(doc1, doc2, doc3, doc4)
tm_corpus <- Corpus(VectorSource(corpus))
En este ejemplo, creamos un corpus de clase Corpus
definido por el paquete tm
con dos funciones Corpus
y VectorSource
, que devuelve un objeto VectorSource
de un vector de caracteres. El objeto tm_corpus
es una lista de nuestros documentos con metadatos adicionales (y opcionales) para describir cada documento.
str(tm_corpus)
List of 4
$ 1:List of 2
..$ content: chr "drugs hospitals doctors"
..$ meta :List of 7
.. ..$ author : chr(0)
.. ..$ datetimestamp: POSIXlt[1:1], format: "2017-06-03 00:31:34"
.. ..$ description : chr(0)
.. ..$ heading : chr(0)
.. ..$ id : chr "1"
.. ..$ language : chr "en"
.. ..$ origin : chr(0)
.. ..- attr(*, "class")= chr "TextDocumentMeta"
..- attr(*, "class")= chr [1:2] "PlainTextDocument" "TextDocument"
[truncated]
Una vez que tengamos un Corpus
, podemos proceder a preprocesar las fichas contenidas en el Corpus
para mejorar la calidad de la salida final (el término matriz de frecuencia). Para ello utilizamos el tm
función tm_map
, que de manera similar al apply
familia de funciones, transformar los documentos en el corpus mediante la aplicación de una función a cada documento.
tm_corpus <- tm_map(tm_corpus, tolower)
tm_corpus <- tm_map(tm_corpus, removeWords, stopwords("english"))
tm_corpus <- tm_map(tm_corpus, removeNumbers)
tm_corpus <- tm_map(tm_corpus, PlainTextDocument)
tm_corpus <- tm_map(tm_corpus, stemDocument, language="english")
tm_corpus <- tm_map(tm_corpus, stripWhitespace)
tm_corpus <- tm_map(tm_corpus, PlainTextDocument)
Siguiendo estas transformaciones, finalmente creamos el término matriz de frecuencia con
tdm <- TermDocumentMatrix(tm_corpus)
lo que da una
<<TermDocumentMatrix (terms: 8, documents: 4)>>
Non-/sparse entries: 12/20
Sparsity : 62%
Maximal term length: 9
Weighting : term frequency (tf)
que podemos ver al transformarlo en una matriz
as.matrix(tdm)
Docs
Terms character(0) character(0) character(0) character(0)
doctor 1 0 1 0
drug 1 0 0 0
environ 0 1 0 1
healthcar 0 0 1 0
hospit 1 0 1 0
pollut 0 1 0 1
smog 0 1 0 0
water 0 0 0 1
Cada fila representa la frecuencia de cada ficha - que a medida que se han dado cuenta de tallo (por ejemplo, environment
a environ
) - en cada documento (4 documentos, 4 columnas).
En las líneas anteriores, hemos ponderado cada par de token / documento con la frecuencia absoluta (es decir, el número de instancias del token que aparecen en el documento).