2010-07-15 44 views
6

Tôi đang sử dụng gói tm để tính toán thuật ngữ-tài liệu-ma trận cho tập dữ liệu, bây giờ tôi phải viết thuật ngữ-tài liệu-ma trận vào tệp nhưng khi tôi sử dụng chức năng ghi trong R Tôi gặp lỗi.Viết một ma trận Triplet đơn giản vào một tệp?

Đây là mã mà tôi đang sử dụng và lỗi Tôi nhận:

data("crude") 
tdm <- TermDocumentMatrix(crude, control = list(weighting = weightTfIdf, stopwords = TRUE)) 
dtm <- DocumentTermMatrix(crude, control = list(weighting = weightTfIdf, stopwords = TRUE)) 

và đây là lỗi trong khi tôi sử dụng lệnh write.table trên dữ liệu này:

Error in cat(list(...), file, sep, fill, labels, append) : argument 1 (type 'list') cannot be handled by 'cat' 

Tôi hiểu rằng tbm là một đối tượng của loại Simple Triplet Matrix, nhưng làm thế nào tôi có thể viết nó vào một tập tin văn bản đơn giản.

Trả lời

6

Tôi nghĩ rằng tôi có thể hiểu lầm câu hỏi, nhưng nếu tất cả các bạn muốn làm là xuất ma trận tài liệu hạn vào một tập tin, sau đó như thế nào về vấn đề này:

m <- inspect(tdm) 
DF <- as.data.frame(m, stringsAsFactors = FALSE) 
write.table(DF) 

Có phải đó là những gì bạn đang sau khi người bạn đời ?

Hy vọng rằng sẽ giúp một chút,

Tony Breyal

+0

Cảm ơn Tony và Shane! Giải pháp đã giúp tôi rất nhiều thời gian! –

+0

Tôi không nghĩ rằng điều này hoạt động nữa, 'không thể ép buộc lớp ... thành data.frame' – wordsforthewise

+0

@wordsforthewise Làm việc cho tôi trong Windows 7, R phiên bản 3.4.3 và tm_0.7-3 –

2

Tệp có nên "có thể đọc được" không? Nếu không, hãy sử dụng dump, dput hoặc save. Nếu vậy, chuyển đổi danh sách của bạn thành một data.frame.

Chỉnh sửa: Bạn có thể chuyển đổi danh sách thành ma trận nếu mỗi phần tử danh sách có độ dài bằng nhau bằng cách thực hiện matrix(unlist(list.name), nrow=length(list.name[[1]])) hoặc một cái gì đó tương tự (hoặc với plyr).

Tại sao bạn không thực hiện phân tích SVM của mình trong R (ví dụ: bằng kernlab)?

Sửa 2: Ok, tôi nhìn vào dữ liệu của bạn, và nó không phải là dễ dàng để chuyển đổi thành một ma trận bởi vì các yếu tố danh sách không bằng nhau dài:

> is.list(tdm) 
[1] TRUE 
> str(tdm) 
List of 7 
$ i  : int [1:1475] 15 29 151 152 173 205 215 216 227 228 ... 
$ j  : int [1:1475] 1 1 1 1 1 1 1 1 1 1 ... 
$ v  : Named num [1:1475] 3.32 4.32 2.32 2 2.32 ... 
    ..- attr(*, "names")= chr [1:1475] "1.50" "16.00" "barrel," "barrel." ... 
$ nrow  : int 985 
$ ncol  : int 20 
$ dimnames :List of 2 
    ..$ Terms: chr [1:985] "(bpd)" "(bpd)." "(gcc)" "(it) appears to be nearing a crossroads with regard to\nderegulation, both as it pertains to investments and imports," ... 
    ..$ Docs : chr [1:20] "127" "144" "191" "194" ... 
$ Weighting: chr [1:2] "term frequency - inverse document frequency" "tf-idf" 
- attr(*, "class")= chr [1:2] "TermDocumentMatrix" "simple_triplet_matrix" 

Để chuyển đổi này đối với ma trận, bạn sẽ cần phải lấy các phần tử của danh sách này (ví dụ i, j) hoặc một số thao tác khác.

Chỉnh sửa 3: Chỉ để kết luận bình luận của tôi ở đây: các đối tượng này được dự định sẽ được sử dụng với hàm inspect (xem the package vignette). Như đã thảo luận, để sử dụng một chức năng như write.table, bạn sẽ cần phải chuyển đổi danh sách của bạn thành một ma trận, đòi hỏi một số thao tác của danh sách đó sao cho bạn có một số vectơ có độ dài bằng nhau. Nhìn vào cấu trúc của các đối tượng tm: điều này sẽ rất khó thực hiện và tôi khuyên bạn nên làm việc với các hàm trợ giúp được bao gồm trong gói đó.

+0

Hi Shane thực sự tôi muốn sử dụng ma trận thuật ngữ tài liệu này cho SVM không có hạt nhân nên tôi sẽ thích nó là ma trận. –

+0

Kernlab có các phương pháp dựa trên hạt nhân dựa trên chuỗi cho SVM, tôi đã sử dụng chúng, không nhận được một mô hình phân loại tốt và mạnh mẽ vì vậy muốn thử với một ma trận các thuật ngữ phổ biến. –

1
dtmMatrix <- as.matrix(dtm) 
write.csv(dtmMatrix, 'mydata.csv') 

chắc chắn này hiện công việc. Tuy nhiên, khi tôi thử nó trên một DTM rất lớn (25000 của 35000), nó đã cho các lỗi liên quan đến việc thiếu bộ nhớ.

tôi đã sử dụng phương pháp sau đây:

dtm <- DocumentTermMatrix(corpus) 
dtm1 <- removeSparseTerms(dtm,0.998) ##max allowed sparsity 0.998 

m <- inspect(dtm1) 
DF <- as.data.frame(m, stringsAsFactors = FALSE) 
write.csv(DF,"mydata0.998sparse.csv") 

nào giảm kích thước của ma trận hạn tài liệu đến một mức độ tuyệt vời! Ở đây bạn có thể tăng số lượng tối đa cho phép tối đa (gần 1) để bao gồm nhiều thuật ngữ hơn trong DF.

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