TermDocumentMatrix не работает с корпусом

Попытка загрузить много файлов электронной почты и позволить R узнать, что такое спам, а что нет. Сначала я создал корпус, хочу создать терминологический документ, я получил ошибку. Как это исправить?

email_corpus <- Corpus(VectorSource(NA))

setwd("C:/ham_spam/")

library(tm)
library(stringr)

email_corpus <- Corpus(VectorSource(NA))

folders <- c("easy_ham/", "spam_2/")

for(n in 1:2){
  folder <- folders[n]
  for(i in 1:length(list.files(folder))){
    email <- list.files(folder)[i]
    tmp <- readLines(str_c(folder, email))
    tmp <- str_c(tmp, collapse = "")
    tmp_corpus <- Corpus(VectorSource(tmp))
    email_corpus <- c(email_corpus, tmp_corpus)
  }
}

dtm_email <- DocumentTermMatrix(email_corpus)

Вот полученная мной ошибка

Ошибка в UseMethod ("TermDocumentMatrix", x): к объекту класса "список" не применяется применимый метод для TermDocumentMatrix.

ниже приведен пример email_corpus, email_corpus - это список фреймов данных.

$meta
$language
[1] "en"

attr(,"class")
[1] "CorpusMeta"

$dmeta
data frame with 0 columns and 1 row

$content
[1] "From [email protected]  Thu Aug 22 12:46:39 2002Return-Path: <[email protected]>Delivered-To: [email protected]: from localhost (localhost [127.0.0.1])\tby phobos.labs.netnoteinc.com (Postfix) with ESMTP id BE12E43C34\tfor... <truncated>

person Lin Ye    schedule 06.11.2017    source источник


Ответы (2)


Объединение двух корпусов с c() удаляет тип Corpus, преобразовывая его в простой list.

С другой стороны, использование VCorpus и c() сохранит тип VCorpus.

Замените все свои Corpus функции на VCorpus, и проблема должна быть решена.

person AshOfFire    schedule 06.11.2017

Вы можете попробовать такой подход:

Установите рабочий каталог в папку, которая содержит папки для спама и радиолюбителей:

setwd('/path/to/dir/that/contains/folders/')

folders <- c("easy_ham/", "spam_2/")

Затем вы можете перечислить все (в данном случае '.txt') файлы в вашем рабочем каталоге (по умолчанию path в list.files() - '.')

emails <- list.files(pattern = ".txt", # assuming all emails are .txt files
                     recursive = TRUE) # recurse listing in subdirs

library(stringr)
library(tm)

Затем вы можете использовать lapply() для чтения файлов:

email_txt <- lapply(emails, function(x) {
  tmp <- readLines(x)
  tmp <- str_c(tmp, collapse = "")
  return(tmp)
})

Создайте корпус из прочитанного текста:

email_corpus <- VCorpus(VectorSource(email_txt))

И, наконец, создайте DocumentTermMatrix из этого корпуса:

dtm_email <- DocumentTermMatrix(email_corpus)
person clemens    schedule 06.11.2017