2011-09-11 37 views
5

Tôi đã tạo DocumentTermMatrix chứa 1859 tài liệu (hàng) và 25722 (cột). Để thực hiện các phép tính tiếp theo trên ma trận này, tôi cần phải chuyển đổi nó thành ma trận thông thường. Tôi muốn sử dụng lệnh as.matrix(). Tuy nhiên, nó trả về lỗi sau: không thể phân bổ vectơ có kích thước 364,8 MB.lỗi gói tm "Không thể chuyển đổi DocumentTermMatrix thành ma trận chuẩn vì vector quá lớn"

> corp 
A corpus with 1859 text documents 
> mat<-DocumentTermMatrix(corp) 
> dim(mat) 
[1] 1859 25722 
> is(mat) 
[1] "DocumentTermMatrix" 
> mat2<-as.matrix(mat) 
Fehler: kann Vektor der Größe 364.8 MB nicht allozieren # cannot allocate vector of size 364.8 MB 
> object.size(mat) 
5502000 bytes 

Vì lý do nào đó kích thước của đối tượng dường như tăng đột ngột bất cứ khi nào nó được chuyển thành ma trận thông thường. Làm thế nào tôi có thể tránh điều này?

Hoặc có cách nào khác để thực hiện các phép toán ma trận thông thường trên DocumentTermMatrix không?

Trả lời

0

DocumentTermMatrix sử dụng biểu diễn sparse matrix, do đó, nó không chiếm tất cả bộ nhớ đó lưu trữ tất cả các số 0 đó. Tùy thuộc vào những gì bạn muốn làm bạn có thể có một số may mắn với gói SparseM cung cấp một số thói quen đại số tuyến tính sử dụng ma trận thưa thớt ..

+0

Cảm ơn câu trả lời nhanh. Thật không may SparseM không có vẻ như nó sẽ là hữu ích vì tôi cần tính toán tương tự Jaccard giữa mỗi cặp dòng. Tôi làm điều này bằng cách sử dụng hàm vegdist() từ gói thuần chay. Điều này không hoạt động trên một ma trận thưa thớt. – Christian

10

Cách nhanh chóng và dơ bẩn là xuất dữ liệu của bạn vào đối tượng ma trận thưa thớt từ gói bên ngoài như Ma trận.

> attributes(dtm) 
$names 
[1] "i"  "j"  "v"  "nrow"  "ncol"  "dimnames" 

$class 
[1] "DocumentTermMatrix" "simple_triplet_matrix" 

$Weighting 
[1] "term frequency" "tf"    

Đối tượng dtm có thuộc tính i, j và v là biểu diễn bên trong của documenttermmatrix của bạn. Sử dụng:

library("Matrix") mat <- sparseMatrix(i=dtm$i, j=dtm$j, x=dtm$v, 
    dims=c(dtm$nrow, dtm$ncol)) 

và bạn đã hoàn tất.

Một so sánh ngây thơ giữa các đối tượng của bạn:

> mat[1,1:100] 
> head(as.vector(dtm[1,]), 100) 

mỗi sẽ cung cấp cho bạn cùng đầu ra chính xác.

0

Số lượng tài liệu không phải là vấn đề nhưng bạn có thể muốn thử xóa cụm từ thưa thớt, điều này có thể làm giảm kích thước của ma trận thuật ngữ tài liệu.

inspect(removeSparseTerms(dtm, 0.7)) 

Loại bỏ các cụm từ có ít nhất là 0,7.

Một tùy chọn khác có sẵn cho bạn là bạn xác định chiều dài từ tối thiểu và tần số tài liệu tối thiểu khi bạn tạo ma trận hạn tài liệu

a.dtm <- DocumentTermMatrix(a.corpus, control = list(weighting = weightTfIdf, minWordLength = 2, minDocFreq = 5)) 

sử dụng inspect(dtm) trước và sau khi thay đổi, bạn sẽ thấy sự khác biệt rất lớn, quan trọng hơn là bạn sẽ không làm hỏng các mối quan hệ quan trọng ẩn trong tài liệu và điều khoản của bạn.

0

Vì bạn chỉ có 1859 tài liệu, ma trận khoảng cách bạn cần tính là khá nhỏ. Sử dụng gói slam (và đặc biệt là hàm crossapply_simple_triplet_matrix), bạn có thể tính trực tiếp ma trận khoảng cách, thay vì chuyển đổi DTM thành một ma trận dày đặc trước tiên. Điều này có nghĩa rằng bạn sẽ phải tính toán tương tự Jaccard mình.Tôi đã thử thành công something similar for the cosine distance matrix on a large number of documents.

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