2014-07-01 17 views
8

Tôi đã tìm kiếm stackoverflow và web và chỉ có thể tìm thấy một phần giải pháp HOẶC một số giải pháp không hoạt động do thay đổi trong TM hoặc qdap. Vấn đề dưới đây:Giữ ID tài liệu với R corpus

Tôi có một dataframe: IDchữ (Simple tài liệu id/tên và sau đó một số văn bản)

Tôi có hai vấn đề:

Phần 1: Làm cách nào để tạo tdm hoặc dtm và duy trì tên/id tài liệu? Nó chỉ hiển thị "ký tự (0)" khi kiểm tra (tdm).
Phần 2: Tôi chỉ muốn giữ một danh sách các thuật ngữ cụ thể, tức là đối diện với việc xóa các từ khóa tùy chỉnh. Tôi muốn điều này xảy ra trong kho văn bản, không phải là tdm/dtm.

Đối với phần 2, tôi đã sử dụng một giải pháp tôi nhận được tại đây: How to implement proximity rules in tm dictionary for counting words?

Điều này xảy ra trên phần tdm! Có giải pháp nào tốt hơn cho Phần 2 khi bạn sử dụng một cái gì đó như "tm_map (my.corpus, keepOnlyWords, danh sách tùy chỉnh)"?

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn nhiều!

Trả lời

14

Thứ nhất, đây là một data.frame mẫu

dd<-data.frame(
    id=10:13, 
    text=c("No wonder, then, that ever gathering volume from the mere transit ", 
     "So that in many cases such a panic did he finally strike, that few ", 
     "But there were still other and more vital practical influences at work", 
     "Not even at the present day has the original prestige of the Sperm Whale") 
    ,stringsAsFactors=F 
) 

Bây giờ, để đọc các thuộc tính đặc biệt từ một data.frame, chúng tôi sẽ sử dụng readTabular chức năng để làm cho người đọc tùy chỉnh data.frame của chúng ta. Đây là tất cả những gì chúng ta cần làm

library(tm) 
myReader <- readTabular(mapping=list(content="text", id="id")) 

Chúng tôi chỉ định cột để sử dụng cho nội dung và id trong data.frame. Bây giờ chúng tôi đọc nó với DataframeSource nhưng sử dụng trình đọc tùy chỉnh của chúng tôi.

tm <- VCorpus(DataframeSource(dd), readerControl=list(reader=myReader)) 

Bây giờ nếu chúng ta chỉ muốn giữ một nhóm từ nào đó, chúng ta có thể tạo hàm content_transformer riêng. Một cách để làm điều này là

keepOnlyWords<-content_transformer(function(x,words) { 
    regmatches(x, 
     gregexpr(paste0("\\b(", paste(words,collapse="|"),"\\b)"), x) 
    , invert=T)<-" " 
    x 
}) 

Điều này sẽ thay thế mọi thứ không có trong danh sách từ. Lưu ý rằng bạn có thể muốn chạy stripWhitespace sau này. Do đó sự biến đổi của chúng ta sẽ trông giống như

keep<-c("wonder","then","that","the") 

tm<-tm_map(tm, content_transformer(tolower)) 
tm<-tm_map(tm, keepOnlyWords, keep) 
tm<-tm_map(tm, stripWhitespace) 

Và sau đó chúng ta có thể biến chúng thành một ma trận hạn tài liệu

dtm<-DocumentTermMatrix(tm) 
inspect(dtm) 

# <<DocumentTermMatrix (documents: 4, terms: 4)>> 
# Non-/sparse entries: 7/9 
# Sparsity   : 56% 
# Maximal term length: 6 
# Weighting   : term frequency (tf) 

#  Terms 
# Docs that the then wonder 
# 10 1 1 1  1 
# 11 2 0 0  0 
# 12 0 1 0  0 
# 13 0 3 0  0 

và bạn có thể nó nó có danh sách các từ và các ID tài liệu thích hợp từ các dữ liệu. khung

+0

Công cụ tuyệt vời! Làm việc một giấc mơ! – RUser

+0

Cảm ơn bạn. Làm tốt lắm! – imriss

+1

nhưng làm cách nào để biến nó thành một khung dữ liệu có ID được ánh xạ để chúng tôi có thể sử dụng nó cho các thử nghiệm khác? – bicepjai

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