Записать простую тройную матрицу в файл? - PullRequest
6 голосов
/ 16 июля 2010

Я использую пакет tm для вычисления term-document-matrix для набора данных, теперь мне нужно записать term-document-matrix в файл, но когда я использую функции записи в RI,получаю ошибку.

Вот код, который я использую, и полученная ошибка:

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

, и это ошибка, когда я использую команду write.table для этих данных:

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

Я понимаю, что tbm - это объект типа Simple Triplet Matrix, но как я могу записать это в простой текстовый файл.

Ответы [ 3 ]

7 голосов
/ 16 июля 2010

Я думаю, что, возможно, неправильно понял вопрос, но если все, что вы хотите сделать, это экспортировать матрицу терминальных документов в файл, то как насчет этого:

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

Это то, что вам нужноприятель?

Надеюсь, это немного поможет,

Тони Бреял

2 голосов
/ 16 июля 2010

Должен ли файл быть "читаемым человеком"?Если нет, используйте dump, dput или save.Если это так, преобразуйте свой список в data.frame.

Редактировать: Вы можете преобразовать свой список в матрицу, если каждый элемент списка имеет одинаковую длину, выполнив matrix(unlist(list.name), nrow=length(list.name[[1]])) или что-то в этом роде.(или с plyr).

Почему вы не проводите анализ SVM в R (например, с помощью kernlab)?

Редактировать 2: Хорошо, я посмотрел на ваши данные, и это не такЕго легко преобразовать в матрицу, потому что элементы списка не равны по длине:

> 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"

Чтобы преобразовать это в матрицу, вам нужно будет либо взять элементы этого списка (например, i, j) или же выполните другие манипуляции.

Редактировать 3: Просто, чтобы завершить мой комментарий здесь: эти объекты предназначены для использования с функцией inspect (см. пакетвиньетка ).

Как уже говорилось, для использования функции, подобной write.table, вам нужно будет преобразовать ваш список в матрицу, что потребует некоторых манипуляций с этим списком, чтобы у вас было несколько векторов одинаковой длины.Рассматривая структуру этих tm объектов: это будет очень трудно сделать, и я предлагаю вам поработать с вспомогательными функциями, которые включены в этот пакет.

1 голос
/ 25 февраля 2016
dtmMatrix <- as.matrix(dtm)
write.csv(dtmMatrix, 'mydata.csv')

Это, безусловно, делает работу.Однако, когда я попробовал его на очень большом DTM (25000 на 35000), он выдавал ошибки, связанные с нехваткой памяти.

Я использовал следующий метод:

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")

, который уменьшилРазмер документа в терминах матрицы в значительной степени!Здесь вы можете увеличить максимально допустимую разреженность (ближе к 1), чтобы включить больше терминов в DF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...