2015-08-20 43 views
6

Aggiornamento:Come rimuovere esattamente la punteggiatura quando si utilizza R con il pacchetto tm

penso che io possa avere una soluzione per risolvere questo problema, solo per aggiungere un codice: dtms = removeSparseTerms(dtm,0.1) Sarà rimuovere il carattere sparse nel corpus. Ma penso che questo sia SOLO una soluzione alternativa, aspetto ancora la risposta degli esperti!


Recentemente sto imparando il text mining in R utilizzando il pacchetto tm. E ho un'idea di disegnare una nuvola di parole sulle parole del mio programma ABAP nella massima frequenza. Quindi ho scritto un programma R per realizzare questo.

library(tm) 
library(SnowballC) 
library(wordcloud) 

# set path 
path = system.file("texts","abapcode",package = "tm") 

# make corpus 
code = Corpus(DirSource(path),readerControl = list(language = "en")) 

# cleanse text 
code = tm_map(code,stripWhitespace) 
code = tm_map(code,removeWords,stopwords("en")) 
code = tm_map(code,removePunctuation) 
code = tm_map(code,removeNumbers) 

# make DocumentTermMatrix 
dtm = DocumentTermMatrix(code) 

#freqency 
freq = sort(colSums(as.matrix(dtm)),decreasing = T) 

#wordcloud(code,scale = c(5,1),max.words = 50,random.order = F,colors = brewer.pal(8, "Dark2"),rot.per = 0.35,use.r.layout = F) 
wordcloud(names(freq),freq,scale = c(5,1),max.words = 50,random.order = F,colors = brewer.pal(8, "Dark2"),rot.per = 0.35,use.r.layout = F) 

Ma nel mio codice ABAP, alcune varianti contengono "_" e "-" nel nome variante, quindi se ho eseguito questo:

code = tm_map(code,removePunctuation) 

Il contenuto corpus non è così corretto e quindi la nuvola di parole è così: enter image description here

Alcune parole sono così strane se si rimuove il "_" o "-".

E poi io commento che il codice e la nuvola parola è come questo: enter image description here

Questa volta le parole sono corrette, ma qualche personaggio inaspettato saltate fuori, come ad esempio il mio codice ABAP COMMET ...

Quindi abbiamo alcuni metodi che possono rimuovere esattamente la punteggiatura che non vogliamo e mantenere quelli che vogliamo?

+0

Near-duplicate: [tm rimuovi la punteggiatura personalizzata ad eccezione dell'hashtag] (http://stackoverflow.com/questions/27951377/tm-removepunctuation-except-hashtag) – smci

risposta

0

Ok ... quindi le seguenti opere ... convertire il corpus in una cornice di dati, rimuovere i caratteri indesiderati e successivamente riconvertire a Corpus ...

dataframe<-data.frame(text=unlist(sapply(code, [, "content")), stringsAsFactors=F) dataframe$text <- gsub("[][!#$%()*,.:;<=>@^_|~.{}]", "", dataframe$text)

code <- corpus(Vectorsource(dataframe$text))

4

Inserimento come risposta per la formattazione del codice, ma è un adattamento dalla documentazione di content_transformer trovato da getTransformtions trovato in tm_map documentazione:

Principalmente si sta usando gsub in un content_transformer di fare lo stesso removePunctuation meno _ e - (la classe [:punct:] regex). removePunctuation ha un'opzione per mantenere i trattini - ma non per mantenere i caratteri di sottolineatura _.

f <- content_transformer(function(x, pattern) gsub(pattern, "", x)) 
code <- tm_map(code, f, "[!\"#$%&'*+,./)(:;<=>[email protected]\][\\^`{|}~]") 

Nella classe di caratteri che si devono sfuggire alla \, il " e la parentesi di chiusura ].