2014-08-28 23 views
12

Tôi đã làm việc qua nhiều ví dụ trực tuyến về gói {tm} trong R, cố gắng tạo một TermDocumentMatrix. Việc tạo và làm sạch một kho văn bản khá đơn giản, nhưng tôi luôn gặp lỗi khi cố gắng tạo một ma trận. Lỗi này là:Lỗi TermDocumentMatrix trong R

Lỗi trong UseMethod ("meta", x): không có phương pháp áp dụng cho 'meta' áp dụng cho một đối tượng của lớp "nhân vật" Ngoài: Thông điệp cảnh báo: Trong mclapply (unname (nội dung (x)), termFreq, kiểm soát): tất cả các lõi dự kiến ​​gặp phải lỗi trong mã người dùng

Ví dụ, đây là mã từ Jon Starkweather của khai thác văn bản example. Xin lỗi trước cho mã dài như vậy, nhưng điều này tạo ra một ví dụ tái sản xuất. Xin lưu ý rằng lỗi xuất hiện ở cuối với hàm {tdm}.

#Read in data 
policy.HTML.page <- readLines("http://policy.unt.edu/policy/3-5") 

#Obtain text and remove mark-up 
policy.HTML.page[186:202] 
id.1 <- 3 + which(policy.HTML.page == "     TOTAL UNIVERSITY  </div>") 
id.2 <- id.1 + 5 
text.data <- policy.HTML.page[id.1:id.2] 
td.1 <- gsub(pattern = "<p>", replacement = "", x = text.data, 
    ignore.case = TRUE, perl = FALSE, fixed = FALSE, useBytes = FALSE) 

td.2 <- gsub(pattern = "</p>", replacement = "", x = td.1, ignore.case = TRUE, 
    perl = FALSE, fixed = FALSE, useBytes = FALSE) 

text.d <- td.2; rm(text.data, td.1, td.2) 

#Create corpus and clean 
library(tm) 
library(SnowballC) 
txt <- VectorSource(text.d); rm(text.d) 
txt.corpus <- Corpus(txt) 
txt.corpus <- tm_map(txt.corpus, tolower) 
txt.corpus <- tm_map(txt.corpus, removeNumbers) 
txt.corpus <- tm_map(txt.corpus, removePunctuation) 
txt.corpus <- tm_map(txt.corpus, removeWords, stopwords("english")) 
txt.corpus <- tm_map(txt.corpus, stripWhitespace); #inspect(docs[1]) 
txt.corpus <- tm_map(txt.corpus, stemDocument) 

# NOTE ERROR WHEN CREATING TDM 
tdm <- TermDocumentMatrix(txt.corpus) 
+1

Tôi đã xem bài đăng này và câu hỏi của bạn đã nhắc tôi nhớ điều đó. Có một cái nhìn của [liên kết này] (http://stackoverflow.com/questions/24771165/r-project-no-applicable-method-for-meta-applied-to-an-object-of-class-charact). Điều này có thể hữu ích. – jazzurro

+0

@jazzurro - cảm ơn rất nhiều vì đã chuyển hướng tôi đến bài đăng này! việc thêm content_transformer vào người cho phép trong hàm tm_map đã giải quyết được vấn đề –

+1

Tôi thực sự có cùng một vấn đề và thấy bài đăng đó. Tôi vui vì kịch bản của bạn đang hoạt động. – jazzurro

Trả lời

27

Liên kết được cung cấp bởi jazzurro trỏ đến giải pháp. Dòng mã sau đây

txt.corpus <- tm_map(txt.corpus, tolower) 

phải được thay đổi để

txt.corpus <- tm_map(txt.corpus, content_transformer(tolower)) 
5

Có 2 lý do cho vấn đề này trong tm v0.6.

  1. Nếu bạn đang làm biến đổi mức độ hạn như tolower vv tm_map lợi nhuận vector nhân vật thay vì PlainTextDocument.
    Giải pháp: Gọi tolower qua content_transformer hoặc gọi tm_map(corpus, PlainTextDocument) ngay sau khi tolower
  2. Nếu gói SnowballC không được cài đặt và nếu bạn đang cố gắng để ngăn chặn các tài liệu sau đó cũng điều này có thể xảy ra.
    Giải pháp: install.packages('SnowballC')
1

Có Không cần phải áp dụng content_transformer.

Tạo corpus theo cách này:

trainData_corpus <- Corpus((VectorSource(trainData$Comments))) 

Hãy thử nó.

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