Подтвердить что ты не робот

R-Project не применимый метод для "мета", применяемый к объекту класса "характер",

Я пытаюсь запустить этот код (Ubuntu 12.04, R 3.1.1)

# Load requisite packages
library(tm)
library(ggplot2)
library(lsa)

# Place Enron email snippets into a single vector.
text <- c(
  "To Mr. Ken Lay, I’m writing to urge you to donate the millions of dollars you made from selling Enron stock before the company declared bankruptcy.",
  "while you netted well over a $100 million, many of Enron employees were financially devastated when the company declared bankruptcy and their retirement plans were wiped out",
  "you sold $101 million worth of Enron stock while aggressively urging the company’s employees to keep buying it",
  "This is a reminder of Enron’s Email retention policy. The Email retention policy provides as follows . . .",
  "Furthermore, it is against policy to store Email outside of your Outlook Mailbox and/or your Public Folders. Please do not copy Email onto floppy disks, zip disks, CDs or the network.",
  "Based on our receipt of various subpoenas, we will be preserving your past and future email. Please be prudent in the circulation of email relating to your work and activities.",
  "We have recognized over $550 million of fair value gains on stocks via our swaps with Raptor.",
  "The Raptor accounting treatment looks questionable. a. Enron booked a $500 million gain from equity derivatives from a related party.",
  "In the third quarter we have a $250 million problem with Raptor 3 if we don’t "enhance" the capital structure of Raptor 3 to commit more ENE shares.")
view <- factor(rep(c("view 1", "view 2", "view 3"), each = 3))
df <- data.frame(text, view, stringsAsFactors = FALSE)

# Prepare mini-Enron corpus
corpus <- Corpus(VectorSource(df$text))
corpus <- tm_map(corpus, tolower)
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, function(x) removeWords(x, stopwords("english")))
corpus <- tm_map(corpus, stemDocument, language = "english")
corpus # check corpus

# Mini-Enron corpus with 9 text documents

# Compute a term-document matrix that contains occurrance of terms in each email
# Compute distance between pairs of documents and scale the multidimentional semantic space (MDS) onto two dimensions
td.mat <- as.matrix(TermDocumentMatrix(corpus))
dist.mat <- dist(t(as.matrix(td.mat)))
dist.mat  # check distance matrix

# Compute distance between pairs of documents and scale the multidimentional semantic space onto two dimensions
fit <- cmdscale(dist.mat, eig = TRUE, k = 2)
points <- data.frame(x = fit$points[, 1], y = fit$points[, 2])
ggplot(points, aes(x = x, y = y)) + geom_point(data = points, aes(x = x, y = y, color = df$view)) + geom_text(data = points, aes(x = x, y = y - 0.2, label = row.names(df)))

Однако, когда я запускаю его, я получаю эту ошибку (в строке td.mat <- as.matrix(TermDocumentMatrix(corpus))):

Error in UseMethod("meta", x) : 
  no applicable method for 'meta' applied to an object of class "character"
In addition: Warning message:
In mclapply(unname(content(x)), termFreq, control) :
  all scheduled cores encountered errors in user code

Я не уверен, что посмотреть - все модули загружены.

4b9b3361

Ответ 1

Последняя версия tm (0.60) сделала так, чтобы вы не могли использовать функции с tm_map, которые больше работают с символами. Таким образом, проблема заключается в вашем шаге tolower, поскольку это не является "каноническим" преобразованием (см. getTransformations()). Просто замените его на

corpus <- tm_map(corpus, content_transformer(tolower))

Оболочка функций content_transformer преобразует все в правильный тип данных внутри корпуса. Вы можете использовать content_transformer с любой функцией, которая предназначена для управления символьными векторами, чтобы она работала в конвейере tm_map.

Ответ 2

Это немного старо, но только для целей последующих поисковых запросов Google: есть альтернативное решение. После corpus <- tm_map(corpus, tolower) вы можете использовать corpus <- tm_map(corpus, PlainTextDocument), который возвращает его обратно в правильный тип данных.

Ответ 3

У меня была такая же проблема и, наконец, пришла к решению:

Кажется, что метаинформация внутри объекта corpus повреждается после применения преобразований на нем.

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

a<- list()
for (i in seq_along(corpus)) {
    a[i] <- gettext(corpus[[i]][[1]]) #Do not use $content here!
}

df$text <- unlist(a) 
corpus <- Corpus(VectorSource(df$text)) #This action restores the corpus.