Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在tm软件包(R)中使用大型自定义停止字列表时出现的问题_R_Tm - Fatal编程技术网

在tm软件包(R)中使用大型自定义停止字列表时出现的问题

在tm软件包(R)中使用大型自定义停止字列表时出现的问题,r,tm,R,Tm,我相信你们中的许多人以前都看到过这一点: Warnmeldung: In mclapply(content(x), FUN, ...) : all scheduled cores encountered errors in user code 这一次,当我试图从语料库中删除自定义的停止词列表时,出现了错误 asdf <- tm_map(asdf, removeWords ,mystops) 我正在考虑一个函数,将removeWords命令循环用于列表的一小部分,但我也很想理解,

我相信你们中的许多人以前都看到过这一点:

Warnmeldung:

In mclapply(content(x), FUN, ...) :

  all scheduled cores encountered errors in user code
这一次,当我试图从语料库中删除自定义的停止词列表时,出现了错误

asdf <- tm_map(asdf, removeWords ,mystops)
我正在考虑一个函数,将removeWords命令循环用于列表的一小部分,但我也很想理解,为什么列表的长度是一个问题

这里是我的sessionInfo():

编辑:

我只使用20news-bydate.tar.gz和train文件夹

我不会分享我正在做的所有预处理,因为它包括对整个事情的形态学分析(不是使用R)

这是我的R代码:

library(tm)
library(topicmodels)
library(SnowballC)

asdf <- Corpus(DirSource("/path/to/20news-bydate/train",encoding="UTF-8"),readerControl=list(language="en"))
asdf <- tm_map(asdf, content_transformer(tolower))
asdf <- tm_map(asdf, removeWords, stopwords(kind="english"))
asdf <- tm_map(asdf, removePunctuation)
asdf <- tm_map(asdf, removeNumbers)
asdf <- tm_map(asdf, stripWhitespace)  
# until here: preprocessing


# building DocumentTermMatrix with term frequency
dtm <- DocumentTermMatrix(asdf, control=list(weighting=weightTf))


# building a matrix from the DTM and wordvector (all words as titles, 
# sorted by frequency in corpus) and wordlengths (length of actual 
# wordstrings in the wordvector)
m <- as.matrix(dtm)
wordvector <- sort(colSums(m),decreasing=T)
wordlengths <- nchar(names(wordvector))

names(wordvector[wordlengths>22]) -> mystops1  # all words longer than 22 characters
names(wordvector)[wordvector<3] -> mystops2 # all words with occurence <3
mystops <- c(mystops1,mystops2) # the stopwordlist

# going back to the corpus to remove the chosen words
asdf <- tm_map(asdf, removeWords ,mystops) 
library(tm)
库(topicmodels)
图书馆(SnowballC)

asdf正如我在评论中所怀疑的:
removeWords
tm
包中使用perl正则表达式。所有单词都使用or
|
管道连接起来。在您的情况下,结果字符串包含的字符太多:

gsub(regex,“”,txt,perl=TRUE)中出错:规则无效 表达 “(*UCP)\b(zxmkrstudservzdvunituebingende | zxmkrstudservzdvunituebingende |……|毫不犹豫地| 另外:警告消息:在gsub(regex,“”,txt,perl=TRUE)中: 处的PCRE模式编译错误“正则表达式太大” ''

一种解决方案:定义自己的
removeWords
函数,该函数拆分字符限制过大的正则表达式,然后分别应用每个拆分的正则表达式,使其不再达到限制:

f <- content_transformer({function(txt, words, n = 30000L) {
  l <- cumsum(nchar(words)+c(0, rep(1, length(words)-1)))
  groups <- cut(l, breaks = seq(1,ceiling(tail(l, 1)/n)*n+1, by = n))
  regexes <- sapply(split(words, groups), function(words) sprintf("(*UCP)\\b(%s)\\b", paste(sort(words, decreasing = TRUE), collapse = "|")))
  for (regex in regexes)  txt <- gsub(regex, "", txt, perl = TRUE)
  return(txt)
}})
asdf <- tm_map(asdf, f, mystops) 

f正如我在评论中所怀疑的:
removeWords
tm
包中使用perl正则表达式。所有单词都使用or
|
管道连接。在您的情况下,生成的字符串包含太多字符:

gsub(regex,“”,txt,perl=TRUE)中出错:规则无效 表达 “(*UCP)\b(zxmkrstudservzdvunituebingende | zxmkrstudservzdvunituebingende |……|毫不犹豫地| 另外:警告消息:在gsub(regex,“”,txt,perl=TRUE)中: 处的PCRE模式编译错误“正则表达式太大” ''

一种解决方案:定义自己的
removeWords
函数,该函数拆分字符限制过大的正则表达式,然后分别应用每个拆分的正则表达式,使其不再达到限制:

f <- content_transformer({function(txt, words, n = 30000L) {
  l <- cumsum(nchar(words)+c(0, rep(1, length(words)-1)))
  groups <- cut(l, breaks = seq(1,ceiling(tail(l, 1)/n)*n+1, by = n))
  regexes <- sapply(split(words, groups), function(words) sprintf("(*UCP)\\b(%s)\\b", paste(sort(words, decreasing = TRUE), collapse = "|")))
  for (regex in regexes)  txt <- gsub(regex, "", txt, perl = TRUE)
  return(txt)
}})
asdf <- tm_map(asdf, f, mystops) 

f您的自定义停止字太大,因此您必须将其分解:

group <- 100
n <- length(myStopwords)
r <- rep(1:ceiling(n/group),each=group)[1:n]
d <- split(myStopwords,r)

for (i in 1:length(d)) {
  asdf <- removeWords(asdf, c(paste(d[[i]])))
 }

group您自定义的stopwords太大,因此您必须将其分解:

group <- 100
n <- length(myStopwords)
r <- rep(1:ceiling(n/group),each=group)[1:n]
d <- split(myStopwords,r)

for (i in 1:length(d)) {
  asdf <- removeWords(asdf, c(paste(d[[i]])))
 }

group长度可能是个问题,因为afaik
removeWords
将所有单词连接到正则表达式中(由or管道分隔).我不知道字符限制在哪里,但我猜一些thounsand单词显然太多了。此外,请编辑您的帖子,并按照R标签的要求复制示例(悬停在上面)。
tm
有一个示例语料库
数据(“原油”)
并且您可以使用例如
stringi::stri_rand_strings
轻松创建人工停止字。长度可能是一个问题,因为afaik
removeWords
将所有字连接到一个正则表达式中(由or管道分隔
).我不知道字符限制在哪里,但我猜一些thounsand单词显然太多了。此外,请编辑您的帖子,并按照R标签的要求复制示例(悬停在上面)。
tm
有一个示例语料库
数据(“原油”)
并且您可以使用例如
stringi::stri_rand_strings
轻松创建人工停止字。感谢我使用了这个。奇怪的是,我的同一代码在R更新之前没有抛出这个错误-正则表达式实现中一定发生了一些变化。感谢我使用了这个。奇怪的是,我的同一代码在R更新之前没有抛出这个错误-什么的ng在正则表达式实现中必须已更改。
group <- 100
n <- length(myStopwords)
r <- rep(1:ceiling(n/group),each=group)[1:n]
d <- split(myStopwords,r)

for (i in 1:length(d)) {
  asdf <- removeWords(asdf, c(paste(d[[i]])))
 }