2014-11-14 15 views
7

Tôi đang cố gắng tạo một đám mây từ trong danh sách cụm từ, nhiều cụm từ được lặp lại thay vì từ riêng lẻ. Dữ liệu của tôi trông giống như thế này, với một cột trong khung dữ liệu của tôi là danh sách các cụm từ.Tạo cụm từ "đám mây", không phải các từ riêng lẻ trong R

df$names <- c("John", "John", "Joseph A", "Mary A", "Mary A", "Paul H C", "Paul H C") 

Tôi muốn tạo một đám mây từ trong đó tất cả các tên này được coi là cụm từ riêng lẻ có tần suất hiển thị chứ không phải các từ tạo nên chúng. Mã tôi đã sử dụng trông giống như:

df.corpus <- Corpus(DataframeSource(data.frame(df$names))) 
df.corpus <- tm_map(client.corpus, function(x) removeWords(x, stopwords("english"))) 
#turning that corpus into a tDM 
tdm <- TermDocumentMatrix(df.corpus) 
m <- as.matrix(tdm) 
v <- sort(rowSums(m),decreasing=TRUE) 
d <- data.frame(word = names(v),freq=v) 
pal <- brewer.pal(9, "BuGn") 
pal <- pal[-(1:2)] 
#making a worcloud 
png("wordcloud.png", width=1280,height=800) 
wordcloud(d$word,d$freq, scale=c(8,.3),min.freq=2,max.words=100, random.order=T, rot.per=.15, colors="black", vfont=c("sans serif","plain")) 
dev.off() 

Điều này tạo ra một đám mây từ, nhưng nó là từ của từng thành phần, không phải của cụm từ. Vì vậy, tôi thấy tần số tương đối của "A". "H", "John" vv thay vì tần số tương đối của "Joseph A", "Mary A", vv, đó là những gì tôi muốn.

Tôi chắc rằng điều này không phức tạp để khắc phục, nhưng tôi không thể hiểu được! Tôi sẽ đánh giá cao sự giúp đỡ nào.

Trả lời

8

Khó khăn của bạn là mỗi thành phần của df$names đang được coi là "tài liệu" theo các chức năng của tm. Ví dụ: tài liệu John A chứa các từ JohnA. Có vẻ như bạn muốn giữ nguyên tên như vậy và chỉ đếm số lần xuất hiện của chúng - bạn chỉ có thể sử dụng table cho điều đó.

library(wordcloud) 
df<-data.frame(theNames=c("John", "John", "Joseph A", "Mary A", "Mary A", "Paul H C", "Paul H C")) 
tb<-table(df$theNames) 
wordcloud(names(tb),as.numeric(tb), scale=c(8,.3),min.freq=1,max.words=100, random.order=T, rot.per=.15, colors="black", vfont=c("sans serif","plain")) 

enter image description here

+0

Cảm ơn bạn, điều này đã giải quyết được hoàn toàn vấn đề của tôi và rất rõ ràng! – verybadatthis

+1

tốt - xem ra đối số 'min.freq' của' wordcloud' có thể dẫn đến kết quả mong đợi. – keegan

3

Install RWeka và phụ thuộc của nó, sau đó thử này:

library(RWeka) 
BigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 2, max = 2)) 
# ... other tokenizers 
tok <- BigramTokenizer 
tdmgram <- TermDocumentMatrix(df.corpus, control = list(tokenize = tok)) 
#... create wordcloud 

Các tokenizer-line trên sườn văn bản của bạn vào cụm từ có độ dài 2.
Cụ thể hơn, nó tạo ra cụm từ của MINLENGTH 2 và maxlength 2.
Sử dụng thuật toán NGramTokenizer chung của Weka, Bạn có thể tạo các trình mã thông báo khác nhau (ví dụ minlength 1, maxlength 2) và có thể bạn sẽ muốn thử nghiệm với các độ dài khác nhau. Bạn cũng có thể gọi cho họ tok1, tok2 thay vì verbose "BigramTokenizer" tôi đã sử dụng ở trên.

+0

Xin lỗi, bạn có thể giải thích như thế nào tokenizer làm việc hơn một chút? Tôi không hiểu những thông số đó làm gì, hoặc những gì nó làm, sau khi chạy nó. – verybadatthis

+1

Tôi đã cập nhật câu trả lời của mình. – knb

Các vấn đề liên quan