2016-04-07 9 views
1

Ich versuche, eine Schlagwortwolke der Publikationen Schlüsselwörter zu bilden. zum Beispiel: Bildungs-Data Mining; Kollaboratives Lernen; Informatik ... etcEine Wordcloud erstellen, aber mit kombinierten Wörtern?

Mein aktueller Code ist wie folgt:

KeywordsCorpus <- Corpus(VectorSource(subset(Words$Author.Keywords, Words$Year==2012))) 
KeywordsCorpus <- tm_map(KeywordsCorpus, removePunctuation) 
KeywordsCorpus <- tm_map(KeywordsCorpus, removeNumbers) 

# added tolower 
KeywordsCorpus <- tm_map(KeywordsCorpus, tolower) 
KeywordsCorpus <- tm_map(KeywordsCorpus, removeWords, stopwords("english")) 

# moved stripWhitespace 
KeywordsCorpus <- tm_map(KeywordsCorpus, stripWhitespace) 

KeywordsCorpus <- tm_map(KeywordsCorpus, PlainTextDocument) 

dtm4 <- TermDocumentMatrix(KeywordsCorpus) 
m4 <- as.matrix(dtm4) 
v4 <- sort(rowSums(m4),decreasing=TRUE) 
d4 <- data.frame(word = names(v4),freq=v4) 

jedoch Mit diesem Code wird jedes Wort von selbst spalten, aber was ich brauche, ist ein kombinierte Worte haben/Sätze. Zum Beispiel: Educational Data Mining ist eine Phrase, die ich zeigen muss, anstatt was passiert: "Educational" "Data" "Mining". Gibt es eine Möglichkeit, jede Wortverbindung zusammenzuhalten? das Semikolon könnte als Trennzeichen helfen.

Danke.

Antwort

3

Hier ist eine Lösung mit einem anderen Text-Paket verwenden, die Sie aus mehreren Wörtern Ausdrücke entweder statistisch erfasst Collocationen, oder einfach nur, indem alle Bi-Gramm erlaubt zu bilden. Das Paket heißt quanteda.

library(quanteda) 
packageVersion("quanteda") 
## [1] ‘0.9.5.14’ 

Zuerst wird das Verfahren für den Top-1.500-Bigramm Collocationen Erfassen und Ersetzen dieser Kollokationen in den Texten mit ihrem Single-Token-Varianten (durch den verketteten "_" character). Hier verwende ich das eingebaute Corpus der US-Präsidentschaftsansprachetexte.

### for just the top 1500 collocations 
# detect the collocations 
colls <- collocations(inaugCorpus, n = 1500, size = 2) 

# remove collocations containing stopwords 
colls <- removeFeatures(colls, stopwords("SMART")) 
## Removed 1,224 (81.6%) of 1,500 collocations containing one of 570 stopwords. 

# replace the phrases with single-token versions 
inaugCorpusColl2 <- phrasetotoken(inaugCorpus, colls) 

# create the document-feature matrix 
inaugColl2dfm <- dfm(inaugCorpusColl2, ignoredFeatures = stopwords("SMART")) 
## Creating a dfm from a corpus ... 
## ... lowercasing 
## ... tokenizing 
## ... indexing documents: 57 documents 
## ... indexing features: 9,741 feature types 
## ... removed 430 features, from 570 supplied (glob) feature types 
## ... complete. 
## ... created a 57 x 9311 sparse dfm 
## Elapsed time: 0.163 seconds. 

# plot the wordcloud 
set.seed(1000) 
png("~/Desktop/wcloud1.png", width = 800, height = 800) 
plot(inaugColl2dfm["2013-Obama", ], min.freq = 2, random.order = FALSE, 
    colors = sample(colors()[2:128])) 
dev.off() 

Daraus ergibt sich die folgende Grafik. Beachten Sie die Kollokationen wie "generation's_task" und "fellow_americans".

wcloud1.png

Die Version mit allen Bigrams gebildet ist einfacher, führt jedoch zu einer großen Anzahl von niedrigeren Frequenz Bigramm Funktionen. Für die Wortwolke habe ich einen größeren Satz von Texten ausgewählt, nicht nur die Obama-Adresse von 2013.

### version with all bi-grams 
inaugbigramsDfm <- dfm(inaugCorpusColl2, ngrams = 2, ignoredFeatures = stopwords("SMART")) 
## Creating a dfm from a corpus ... 
## ... lowercasing 
## ... tokenizing 
## ... indexing documents: 57 documents 
## ... removed 54,200 features, from 570 supplied (glob) feature types 
## ... indexing features: 64,108 feature types 
## ... created a 57 x 9908 sparse dfm 
## ... complete. 
## Elapsed time: 3.254 seconds. 

# plot the bigram wordcloud - more texts because for a single speech, 
# almost none occur more than once 
png("~/Desktop/wcloud2.png", width = 800, height = 800) 
plot(inaugbigramsDfm[40:57, ], min.freq = 2, random.order = FALSE, 
    colors = sample(colors()[2:128])) 
dev.off() 

Dies erzeugt:

wcloud2.png

+0

Falls sich jemand über den Fehler stolpert 'keine anwendbare Methode für‚Collocationen‘auf ein Objekt der Klasse„C (‚VCorpus‘ angelegt, "Corpus") "', versuche '' unlist (corpus) ''. –

+0

An welchem ​​Punkt kann man 'stemDocument()' & 'stemCompletion()' hinzufügen, um zwei verwandte Phrasen in demselben Bigramm zu kombinieren? Wie "freie Gesellschaft" & "freie Gesellschaft" zu "freie_Gesellschaft" in der Wordcloud direkt darüber. –

+1

Nicht sicher, dass ich die Frage verstehe, aber: Sie können diese Funktionen nicht für ein ** Quanteda ** -Objekt verwenden, da sie aus einem anderen Paket stammen. –

0

Ok..Nach einer Menge Forschung fand ich die perfekte Antwort. vor allem, wenn Sie mehrere Wörter wordcloud wollen, wird dies Bigrams genannt. Es gibt R verfügbare Pakete wie "Tau" und "Rweka".

werden Sie diesen Link helfen: This

-2

Der beste Vorschlag für Sie ist es, die kurze Fünf-Minuten-Video (Link unten) folgen:

https://youtu.be/HellsQ2JF2k

Wenn Sie möchten, direkt der R-Code, hier ist es:

mycorpus <- Corpus(VectorSource(subset(Words$Author.Keywords,Words$Year==2012))) 

Text Reinigung Konvertieren Sie den Text in Kleinbuchstaben

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

entfernen Zahlen

mycorpus <- tm_map(mycorpus, removeNumbers) 

entfernen Englisch gemeinsamen Stoppwörter

mycorpus <- tm_map(mycorpus, removeWords, stopwords("english")) 

entfernen Interpunktion

mycorpus <- tm_map(mycorpus, removePunctuation) 

beseitigen zusätzliche Leerräume

mycorpus <- tm_map(mycorpus, stripWhitespace) 
as.character(mycorpus[[1]]) 

Bigramme

minfreq_bigram<-2 
token_delim <- " \\t\\r\\n.!?,;\"()" 
bitoken <- NGramTokenizer(mycorpus, Weka_control(min=2,max=2, delimiters = token_delim)) 
two_word <- data.frame(table(bitoken)) 
sort_two <- two_word[order(two_word$Freq,decreasing=TRUE),] 
wordcloud(sort_two$bitoken,sort_two$Freq,random.order=FALSE,scale = c(2,0.35),min.freq = minfreq_bigram,colors = brewer.pal(8,"Dark2"),max.words=150)