web-dev-qa-db-ja.com

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's 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
_

何を見るべきかわからない-すべてのモジュールがロードされた。

32
user990137

tmの最新バージョン(0.60)により、_tm_map_で単純な文字値を操作する関数を使用できなくなりました。したがって、問題はtolowerステップです。これは「標準的な」変換ではないためです(getTransformations()を参照)。に置き換えるだけです

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

_content_transformer_関数ラッパーは、すべてをコーパス内の正しいデータ型に変換します。 _content_transformer_パイプラインで機能するように、文字ベクトルを操作することを目的とした任意の関数で_tm_map_を使用できます。

90
MrFlick

これは少し古いですが、後のグーグル検索の目的のためだけです:代替ソリューションがあります。 corpus <- tm_map(corpus, tolower)の後、corpus <- tm_map(corpus, PlainTextDocument)を使用して、正しいデータ型に戻すことができます。

29
Paul Gowder

私は同じ問題を抱えていて、最終的に解決策に到達しました:

コーパスオブジェクト内のmeta情報は、変換を適用した後に破損するようです。

私がやったのは、完全に準備が整った後、プロセスの最後にコーパスを再度作成することです。他の問題を克服する必要があるため、テキストをデータフレームにコピーするためのループも作成しました。

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.
1
Gonzalo Sanchez

テキストに対する操作の順序が重要です。句読点を削除する前にストップワードを削除する必要があります。

以下を使用してテキストを準備します。私のテキストはcleanData $ LikeMostに含まれています。

ソースによっては、最初に次のものが必要になる場合があります。

textData$LikeMost <- iconv(textData$LikeMost, to = "utf-8")

いくつかのストップワードは重要なので、改訂されたセットを作成できます。

#create revised stopwords list
newWords <- stopwords("english")
keep <- c("no", "more", "not", "can't", "cannot", "isn't", "aren't", "wasn't",
          "weren't", "hasn't", "haven't", "hadn't", "doesn't", "don't", "didn't", "won't")


newWords <- newWords [! newWords %in% keep]

その後、tm関数を実行できます。

like <- Corpus(VectorSource(cleanData$LikeMost))
like <- tm_map(like,PlainTextDocument)
like <- tm_map(like, removeWords, newWords)
like <- tm_map(like, removePunctuation)
like <- tm_map(like, removeNumbers)
like <- tm_map(like, stripWhitespace)
0
Bryan Butler