2015-06-23 25 views
7

Sto cercando di pulire il corpus e ho usato le fasi tipiche, come il codice qui sotto:Preventivo e trattini non rimossi con le funzioni del pacchetto tm durante la pulizia corpus

docs<-Corpus(DirSource(path)) 
docs<-tm_map(docs,content_transformer(tolower)) 
docs<-tm_map(docs,content_transformer(removeNumbers)) 
docs<-tm_map(docs,content_transformer(removePunctuation)) 
docs<-tm_map(docs,removeWords,stopwords('en')) 
docs<-tm_map(docs,stripWhitespace) 
docs<-tm_map(docs,stemDocument) 
dtm<-DocumentTermMatrix(docs) 

Eppure, quando ho ispezionare la matrice ci sono poche parole che vengono con le citazioni, come ad esempio: "noi" "azienda" "codice linee guida" -known accelerato via

sembra che le parole stesse sono dentro le virgolette, ma quando provo per eseguire rimuovere Il codice di punteggiatura di nuovo non funziona. Inoltre ci sono alcune parole con i proiettili di fronte a quello che non posso rimuovere.

Qualsiasi aiuto sarebbe molto apprezzato.

+1

Potresti fornire un esempio riproducibile? –

+0

Mi dispiace, non capisco perfettamente 'esempio riproducibile'? – anonymous

+0

http://stackoverflow.com/help/mcve – RHertel

risposta

8

removePunctuation utilizza gsub('[[:punct:]]','',x), ad esempio rimuove i simboli: !"#$%&'()*+, \-./:;<=>[email protected][\\\]^_ {|} ~ `. Per rimuovere altri simboli, come le virgolette tipografiche o segni di proiettile (o qualsiasi altro), dichiarare la propria funzione di trasformazione:

removeSpecialChars <- function(x) gsub("“•”","",x) 
docs <- tm_map(docs, removeSpecialChars) 

Oppure si può andare oltre e rimuovere tutto ciò che non è il simbolo alfanumerico o spazio:

removeSpecialChars <- function(x) gsub("[^a-zA-Z0-9 ]","",x) 
docs <- tm_map(docs, removeSpecialChars) 
+0

Ho utilizzato il codice di cui sopra per un documento che conteneva la frase: "Ai fini del presente accordo," Separazione dalla data di servizio "indica la data della separazione dal servizio ai sensi dell'articolo 409A (a) (2) (i) (A) del Codice e determinati in conformità con le regole predefinite di cui alla Sezione 409A del Codice ». Ancora non si pulisce correttamente. – anonymous

+0

Oh, capisco, sono citazioni tipografiche. Non fanno parte della classe di caratteri di punteggiatura POSIX. Modificato la mia risposta. – cyberj0g

+0

Funziona alla grande, grazie – anonymous

1

Un tokenizer costruito meglio gestirà questo automaticamente. Prova questo:

> require(quanteda) 
> text <- c("Enjoying \"my time\".", "Single 'air quotes'.") 
> toktexts <- tokenize(toLower(text), removePunct = TRUE, removeNumbers = TRUE) 
> toktexts 
[[1]] 
[1] "enjoying" "my"  "time"  

[[2]] 
[1] "single" "air" "quotes" 

attr(,"class") 
[1] "tokenizedTexts" "list"   
> dfm(toktexts, stem = TRUE, ignoredFeatures = stopwords("english"), verbose = FALSE) 
Creating a dfm from a tokenizedTexts object ... 
    ... indexing 2 documents 
    ... shaping tokens into data.table, found 6 total tokens 
    ... stemming the tokens (english) 
    ... ignoring 174 feature types, discarding 1 total features (16.7%) 
    ... summing tokens by document 
    ... indexing 5 feature types 
    ... building sparse matrix 
    ... created a 2 x 5 sparse dfm 
    ... complete. Elapsed time: 0.016 seconds. 
Document-feature matrix of: 2 documents, 5 features. 
2 x 5 sparse Matrix of class "dfmSparse" 
     features 
docs air enjoy quot singl time 
    text1 0  1 0  0 1 
    text2 1  0 1  1 0