R tm包升级 - 将语料库转换为数据框时出错

时间:2016-05-20 10:22:56

标签: r dataframe tm corpus

最新的tm升级似乎出现了问题。我的代码如下,带有测试数据 -

data = c('Lorem ipsum dolor sit amet, consectetur adipiscing elit',
           'Vestibulum posuere nisl vel lobortis vulputate',
           'Quisque eget sem in felis egestas sagittis')
ccorpus_clean = Corpus(VectorSource((data)))
ccorpus_clean = tm_map(ccorpus_clean,removePunctuation,lazy=TRUE)
ccorpus_clean = tm_map(ccorpus_clean,stripWhitespace,lazy=TRUE)
ccorpus_clean = tm_map(ccorpus_clean,tolower,lazy=TRUE)
ccorpus_clean = tm_map(ccorpus_clean,removeNumbers,lazy=TRUE)
ccorpus_clean = tm_map(ccorpus_clean,stemDocument,lazy=TRUE)
ccorpus_clean = tm_map(ccorpus_clean,removeWords,stopwords("english"),lazy=TRUE)
ccorpus_clean = tm_map(ccorpus_clean,removeWords,c("hi"),lazy=TRUE)
ccorpus_clean = tm_map(ccorpus_clean,removeWords,c("account","can"),lazy=TRUE)     
ccorpus_clean = tm_map(ccorpus_clean,PlainTextDocument,lazy=TRUE)
ccorpus_clean = tm_map(ccorpus_clean,stripWhitespace,lazy=TRUE);
ccorpus_clean;
df = data.frame(text=unlist(sapply(ccorpus_clean , `[[`, "content")), stringsAsFactors=FALSE)

之前一切都很好。但突然间我需要使用“,lazy = TRUE”。没有它,语料库转换就停止了。 这里记录了一个懒惰的问题 - R tm In mclapply(content(x), FUN, ...) : all scheduled cores encountered errors in user code

使用Lazy,转换可以正常工作,但是语料库转换回数据帧会因以下错误而停止 -

ccorpus_clean = tm_map(ccorpus_clean,stripWhitespace,lazy=TRUE)
ccorpus_clean
  

<>
   元数据:语料库特定:0,文档级别(索引):0
   内容:文件:5

df = data.frame(text=unlist(sapply(ccorpus_clean , `[[`, "content")), stringsAsFactors=FALSE)
  

UseMethod(“meta”,x)中的错误:
        没有适用于'meta'的方法适用于类“try-error”的对象
      另外:警告信息:
      在mclapply(x $ content [i],函数(d)tm_reduce(d,x $ lazy $ maps)):
        所有计划的核心在用户代码中遇到错误

修改 - 这也失败了

data.frame(text = sapply(ccorpus_clean, as.character), stringsAsFactors = FALSE)
  

UseMethod(“meta”,x)中的错误:         没有适用于“meta”的方法应用于类“try-error”的对象

R Version - version.string R version 3.2.3(2015-12-10)/ tm - 0.6-2

2 个答案:

答案 0 :(得分:1)

看起来很复杂。怎么样:

data <- c("Lorem ipsum dolor sit amet account: 999 red balloons.",
          "Some English words are just made for stemming!")

require(quanteda)

# makes the texts into a list of tokens with the same treatment
# as your tm mapped functions
toks <- tokenize(toLower(data), removePunct = TRUE, removeNumbers = TRUE)
# toks is just a named list
toks
## tokenizedText object from 2 documents.
## Component 1 :
## [1] "lorem"    "ipsum"    "dolor"    "sit"      "amet"     "account"  "red"      "balloons"
## 
## Component 2 :
## [1] "some"     "english"  "words"    "are"      "just"     "made"     "for"      "stemming"

# remove selected terms
toks <- removeFeatures(toks, c(stopwords("english"), "hi", "account", "can"))

# apply stemming
toks <- wordstem(toks)

# make into a data frame by reassembling the cleaned tokens
(df <- data.frame(text = sapply(toks, paste, collapse = " ")))
##                                     text
## 1 lorem ipsum dolor sit amet red balloon
## 2            english word just made stem

答案 1 :(得分:1)

我遇到了类似的问题,似乎并不是因为升级tm软件包引起的。如果您不想使用quanteda,那么另一种解决方案是将核心数设置为1(而不是使用Lazy = TRUE)。不知道为什么,但它对我有用。

corpus = tm_map(corpus, tolower, mc.cores = 1)

如果您有兴趣诊断此问题是否由并行计算问题引起,请尝试键入此行

getOption("mc.cores", 2L)

如果它返回2个核心,则将核心设置为1将解决问题。有关详细说明,请参阅this answer