2015-02-02 18 views
5

Tôi đang cố gắng để làm một số mô hình chủ đề nhưng muốn sử dụng cụm từ nơi chúng tồn tại chứ không phải là những từ đơn lẻ tứcTopic mô hình trong các cụm từ R sử dụng chứ không phải là những từ đơn lẻ

library(topicmodels) 
library(tm) 
my.docs = c('the sky is blue, hot sun', 'flowers,hot sun', 'black cats, bees, rats and mice') 
my.corpus = Corpus(VectorSource(my.docs)) 
my.dtm = DocumentTermMatrix(my.corpus) 
inspect(my.dtm) 

Khi tôi kiểm tra dtm của tôi nó chia tách tất cả các từ lên, nhưng tôi muốn tất cả các cụm từ lại với nhau tức là cần có một cột cho mỗi: bầu trời là màu xanh nóng mặt trời hoa mèo đen ong chuột và chuột

thế nào làm cho Ma trận Thuật ngữ Tài liệu nhận ra các cụm từ và từ? họ là dấu phẩy tách

Các giải pháp cần phải được hiệu quả như tôi muốn chạy nó trên rất nhiều dữ liệu

+0

ngram hoạt động tốt nếu tất cả cụm từ của bạn có cùng số từ (có vẻ như không chắc), nếu không bạn phải tự tạo dtm mà không sử dụng gói tm. – Ben

+0

OK - mọi mẹo tạo DTM của riêng tôi? Câu trả lời của – shecode

+0

@ lawyeR dưới đây cho bạn biết cách thực hiện. – Ben

Trả lời

4

Bạn có thể thử một cách tiếp cận sử dụng một tokenizer tùy chỉnh. Bạn xác định các điều khoản nhiều từ mà bạn muốn như cụm từ (Tôi không nhận thức được một mã số thuật toán để làm điều đó bước):

tokenizing.phrases <- c("sky is blue", "hot sun", "black cats") 

Lưu ý rằng không có bắt nguồn được thực hiện, vì vậy nếu bạn muốn cả hai "mèo đen" và "con mèo đen", sau đó bạn sẽ cần phải nhập cả hai biến thể. Trường hợp bị bỏ qua.

Sau đó, bạn cần phải tạo một hàm:

phraseTokenizer <- function(x) { 
     require(stringr) 

     x <- as.character(x) # extract the plain text from the tm TextDocument object 
     x <- str_trim(x) 
     if (is.na(x)) return("") 
     #warning(paste("doing:", x)) 
     phrase.hits <- str_detect(x, ignore.case(tokenizing.phrases)) 

     if (any(phrase.hits)) { 
     # only split once on the first hit, so you don't have to worry about multiple occurrences of the same phrase 
     split.phrase <- tokenizing.phrases[which(phrase.hits)[1]] 
     # warning(paste("split phrase:", split.phrase)) 
     temp <- unlist(str_split(x, ignore.case(split.phrase), 2)) 
     out <- c(phraseTokenizer(temp[1]), split.phrase, phraseTokenizer(temp[2])) 
     } else { 
     out <- MC_tokenizer(x) 
     } 


out[out != ""] 
} 

Sau đó, bạn tiến hành như bình thường để tạo ra một ma trận tài liệu dài, nhưng lần này bạn bao gồm các cụm từ tokenized trong corpus bằng phương tiện của các đối số kiểm soát.

tdm <- TermDocumentMatrix(corpus, control = list(tokenize = phraseTokenizer)) 
+0

tôi có thể thấy giải pháp này thực sự hữu ích khi tôi muốn xác định cụm từ từ một số dữ liệu từ bẩn. nhưng cụm từ của tôi đã được xác định. Điều này sẽ bỏ qua bất kỳ từ hoặc cụm từ nào không được xác định. Tôi về cơ bản có một vectơ dài các cụm từ/từ mà không cần phải được làm sạch. là có một giải pháp đơn giản, nơi tôi có thể giả định tất cả mọi thứ trong mỗi lĩnh vực riêng biệt dấu phẩy là một từ hoặc cụm từ mà tôi muốn bao gồm? – shecode

+0

Câu trả lời này để lại tất cả các từ/thuật ngữ khác. Không thay đổi. Những gì nó làm là cho phép tm để xử lý các thuật ngữ được định nghĩa là đơn vị (thẻ). Theo giải pháp đơn giản, chắc chắn, chỉ cần xử lý các cụm từ nhiều từ được phân tách bằng dấu phẩy của bạn làm các mã thông báo. – lawyeR

+0

Tuyệt vời. Tôi đang chạy nó ngay bây giờ. nó rất chậm. đó là điều khác – shecode

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