【问题标题】:R tm package Upgrade - Error in converting corpus to data frameR tm 包升级 - 将语料库转换为数据框时出错
【发布时间】:2016-05-20 10:22:55
【问题描述】:

最近的 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,转换工作,但语料库转换回 Data Frame 停止并出现以下错误 -

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) 中的错误:
没有适用于“尝试错误”类对象的“元”方法
另外:警告信息:
在 mclapply(x$content[i], function(d) tm_reduce(d, x$lazy$maps)) 中:
所有计划的核心都在用户代码中遇到错误

编辑 - 这也失败了

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

UseMethod("meta", x) 中的错误: 没有适用于“尝试错误”类对象的“元”方法

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

【问题讨论】:

  • 将options(mc.cores=1) 放入 .Rprofile 文件(并重新启动 R)有帮助吗?

标签: r dataframe tm corpus


【解决方案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

【讨论】:

  • 谢谢肯。让我试试这个然后回来。我希望从 tm 到 quanteda 的功能不会有太大变化。我们有绝对不想重新运行的历史数据。
  • 功能相同但 API 更简单。您可以使用quanteda::corpus(yourTmCorpus) 直接从 tm 语料库创建 quanteda 语料库。我很乐意为此提供帮助。
  • HI Ken.. 有没有办法删除稀疏术语。除了“dfmSparse-class”之外,我在文档中看不到任何内容。我们之前做过这样的事情 - TrigramTokenizer
  • 是的,它是trim()。参见?trim和dfm对象的方法。
【解决方案2】:

我也遇到过类似的问题,好像不是升级tm包引起的。如果您不想使用 quanteda,则另一种替代解决方案是将核心数设置为 1(而不是执行 Lazy = TRUE)。不知道为什么,但它对我有用。

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

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

getOption("mc.cores", 2L)

如果返回 2 个核心,则将核心设置为 1 即可解决问题。详细解释见this answer。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-28
    • 2018-03-31
    • 2015-05-26
    • 2020-02-16
    • 2023-04-08
    • 1970-01-01
    • 2013-03-08
    • 2014-08-16
    相关资源
    最近更新 更多