2016-05-01 15 views
6

Sto facendo del text mining (PCA, HC, K-Means) e finora sono riuscito a codificare tutto correttamente. Tuttavia, c'è un piccolo difetto che mi piacerebbe risolvere.L'espressione di parole che utilizza il pacchetto tm in R non funziona correttamente?

Quando provo a bloccare il mio Corpus non funziona correttamente in quanto vi sono parole diverse con lo stesso radicale che non sono identificate nel modo corretto. Sono queste le parole che sono particolarmente interessato a (è in spagnolo e significa "bambini" o correlati):

niñera, niños, niñas, niña, niño 

Ma quando ho eseguito il codice ottengo che queste parole sono ancora gli stessi tranne che per

niña, niño --> niñ 

Ma l'altro rimane lo stesso quindi finisco solo per derivare per niña/niño ma non per gli altri.

Questo è il mio codice per la creazione del corpus:

corp <- Corpus(DataframeSource(data.frame(x$service_name))) 
docs <- tm_map(corp, removePunctuation) 
docs <- tm_map(docs, removeNumbers) 
docs <- tm_map(docs, tolower) 
docs <- tm_map(docs, removeWords, stopwords("spanish")) 
docs <- tm_map(docs, stemDocument, language = "spanish") 
docs <- tm_map(docs, PlainTextDocument) 
dtm <- DocumentTermMatrix(docs) 
dtm 

mi piacerebbe davvero apprezzare qualche suggerimento! Grazie

risposta

15

Sembra che la trasformazione di derivazione possa essere applicata solo ai tipi di PlainTextDocument. Vedi ? stemDocument.

sp.corpus = Corpus(VectorSource(c("la niñera. los niños. las niñas. la niña. el niño."))) 
docs <- tm_map(sp.corpus, removePunctuation) 
docs <- tm_map(docs, removeNumbers) 
docs <- tm_map(docs, tolower) 
docs <- tm_map(docs, removeWords, stopwords("spanish")) 
docs <- tm_map(docs, PlainTextDocument) # needs to come before stemming 
docs <- tm_map(docs, stemDocument, "spanish") 
print(docs[[1]]$content) 

# " niñer niñ niñ niñ niñ" 

contro

# WRONG 
sp.corpus = Corpus(VectorSource(c("la niñera. los niños. las niñas. la niña. el niño."))) 
docs <- tm_map(sp.corpus, removePunctuation) 
docs <- tm_map(docs, removeNumbers) 
docs <- tm_map(docs, tolower) 
docs <- tm_map(docs, removeWords, stopwords("spanish")) 
docs <- tm_map(docs, stemDocument, "spanish") # WRONG: apply PlainTextDocument first 
docs <- tm_map(docs, PlainTextDocument) 
print(docs[[1]]$content) 

# " niñera niños niñas niña niñ" 

A mio parere, questo dettaglio non è ovvio e che sarebbe stato bello avere almeno un avviso quando stemDocument viene richiamato su un non-PlainTextDocument.

1

ho cambiato da

corpus <- tm_map(corpus, tolower) 

a

corpus <- tm_map(corpus, content_transformer(tolower)) 

e poi stemDocument lavorato.

Problemi correlati