R Language
Elaborazione del linguaggio naturale
Ricerca…
introduzione
L'elaborazione del linguaggio naturale (NLP) è il campo delle scienze informatiche incentrato sul recupero di informazioni da input testuali generati da esseri umani.
Crea una matrice di frequenza del termine
L'approccio più semplice al problema (e il più usato finora) è quello di dividere le frasi in token . Semplificando, le parole hanno significati astratti e soggettivi per le persone che le usano e le ricevono, i token hanno un'interpretazione oggettiva: una sequenza ordinata di caratteri (o byte). Una volta che le frasi vengono divise, l'ordine del token viene ignorato. Questo approccio al problema è noto come modello di borsa delle parole .
Un termine frequenza è un dizionario in cui a ciascun token è assegnato un peso . Nel primo esempio, costruiamo un termine a matrice di frequenza da un corpus corpus (una raccolta di documenti ) con il pacchetto 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))
In questo esempio, abbiamo creato un corpus di classe Corpus
definito dal pacchetto tm
con due funzioni Corpus
e VectorSource
, che restituisce un oggetto VectorSource
da un vettore di caratteri. L'oggetto tm_corpus
è un elenco dei nostri documenti con metadati aggiuntivi (e facoltativi) per descrivere ciascun 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 volta che abbiamo un Corpus
, possiamo procedere al preprocesso dei token contenuti nel Corpus
per migliorare la qualità dell'output finale (il termine matrice di frequenza). Per fare ciò usiamo la funzione tm
tm_map
, che similmente alla famiglia di funzioni apply
, trasforma i documenti nel corpus applicando una funzione a ciascun 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)
Seguendo queste trasformazioni, alla fine creiamo il termine matrix frequency con
tdm <- TermDocumentMatrix(tm_corpus)
che dà un
<<TermDocumentMatrix (terms: 8, documents: 4)>>
Non-/sparse entries: 12/20
Sparsity : 62%
Maximal term length: 9
Weighting : term frequency (tf)
che possiamo vedere trasformandolo in una matrice
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
Ogni riga rappresenta la frequenza di ciascun token - che come si è notato è stato arginato (ad es. Da environment
ad environ
) - in ogni documento (4 documenti, 4 colonne).
Nelle righe precedenti, abbiamo pesato ogni coppia token / documento con la frequenza assoluta (cioè il numero di istanze del token che appaiono nel documento).