2016-04-19 8 views
1

Ich möchte eine Liste von Wörtern erstellen, die mindestens zwei Mal basierend auf einer bestimmten Webseite angezeigt werden. Es ist mir gelungen, die Daten zu bekommen und eine Liste mit Anzahl pro Wort zu bekommen, aber Ich muss die Wörter behalten, die einen Großbuchstaben haben, um so zu bleiben. Jetzt erzeugt der Code die Wörterliste nur in Kleinbuchstaben. Zum Beispiel wird das Wort "Miami" zu "Miami", während ich es als "Miami" brauche.So bewahren Sie die ursprüngliche Struktur eines Worts während Textmining

Wie kann ich die Wörter in ihrer ursprünglichen Struktur erhalten?

Beigefügt ist der Code:

library(XML) 
web_page <- htmlTreeParse("http://www.larryslist.com/artmarket/the-talks/dennis-scholls-multiple-roles-from-collecting-art-to-winning-emmy-awards/" 
          ,useInternal = TRUE) 

doctext = unlist(xpathApply(web_page, '//p', xmlValue)) 
doctext = gsub('\\n', ' ', doctext) 
doctext = paste(doctext, collapse = ' ') 

library(tm) 
SampCrps<- Corpus(VectorSource(doctext)) 
corp <- tm_map(SampCrps, PlainTextDocument) 

oz <- tm_map(corp, removePunctuation, preserve_intra_word_dashes = FALSE) # remove punctuation 
oz <- tm_map(corp, removeWords, stopwords("english")) # remove stopwords 
dtm <-DocumentTermMatrix(oz) 

findFreqTerms(dtm,2) # words that apear at least 2 times 
dtmMatrix <- as.matrix(dtm) 
wordsFreq <- colSums(dtmMatrix) 
wordsFreq <- sort(wordsFreq, decreasing=TRUE) 
head(wordsFreq) 
wordsFreq <- as.data.frame(wordsFreq) 
wordsFreq <- data.frame(word = rownames(wordsFreq), count = wordsFreq, row.names = NULL) 
head(wordsFreq,50) 

Das gleiche Problem tritt auf, wenn ich diese Zeilen Code verwenden, um ein Drei-Wort-Grame zu erhalten:

library(RWeka) 
BigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 3, max = 3)) 
tdm <- TermDocumentMatrix(oz, control = list(tokenize = BigramTokenizer)) 
inspect(tdm) 

Antwort

2

Das Problem ist, dass standardmäßig gibt es eine Option in DocumentTermMatrix(), die Ihre Bedingungen klein hält. Schalten Sie das aus und Sie behalten den Fall.

dtm <- DocumentTermMatrix(oz, control = list(tolower = FALSE)) 
colnames(dtm)[grep(".iami", colnames(dtm))] 
## [1] "Miami" "Miami," "Miami." "Miami’s" 

Hier ist eine andere Möglichkeit, es zu tun, um die quanteda Paket verwenden, kann einfacher sein:

require(quanteda) 
# straight from text to the matrix 
dfmMatrix <- dfm(doctext, removeHyphens = TRUE, toLower = FALSE, 
       ignoredFeatures = stopwords("english"), verbose = FALSE) 
# gets frequency counts, sorted in descending order of total term frequency 
termfreqs <- topfeatures(dfmMatrix, n = nfeature(dfmMatrix)) 
# remove those with frequency < 2 
termfreqs <- termfreqs[termfreqs >= 2] 
head(termfreqs, 20) 
##  art   I  artists collecting   work   We collection collectors 
##  35   29   19   17   15   14   13   12 
##  What contemporary   The  world   us   It  Miami   one 
##  11   10   10   10   10   9   9   8 
## always   many   make   Art 
##  8   8   8   7 

Wir, dass der Fall für "Miami" sehen kann (zB) erhalten wird:

termfreqs[grep(".iami", names(termfreqs))] 
## Miami Miami’s 
##  9  2 
+1

Vielen Dank @Ken Benoit. Paket Quanteda scheint großartig. – mql4beginner

Verwandte Themen