web-dev-qa-db-ja.com

MacのR3.0.1でtm_mapにparallel :: mclapplyエラーが発生する

プラットフォームでR3.0.1を使用しています:x86_64-Apple-darwin10.8.0(64ビット)

Tmライブラリのtm_mapを使用しようとしています。しかし、私がこのコードを実行すると

library(tm)
data('crude')
tm_map(crude, stemDocument)

このエラーが発生します:

Warning message:
In parallel::mclapply(x, FUN, ...) :
  all scheduled cores encountered errors in user code

誰かがこれの解決策を知っていますか?

17
Dominik

SnowballCパッケージがインストールされていないようです。これは必須のようです。 tm_mapは、stemDocumentを使用してすべてのドキュメントでmclapplyを実行することになっています。 1つのドキュメントでstemDocument関数を実行してみてください。そうすれば、エラーを抽出できます。

stemDocument(crude[[1]])

私の場合、エラーが発生しました:

Error in loadNamespace(name) : there is no package called ‘SnowballC’

だから私は先に進んでSnowballCをインストールしました、そしてそれはうまくいきました。明らかに、SnowballCは依存関係である必要があります。

29
nograpes

私はちょうどこれに遭遇しました。少し掘り下げましたが、何が起こっているのかがわかりました。

  1. コード行がありました 'rdevel <-tm_map(rdevel、asPlainTextDocument)'

  2. これを実行するとエラーが発生しました

 
並列:: mclapply(x、FUN、...):
スケジュールされたすべてのコアでユーザーコード
 
でエラーが発生しました。
  1. 'tm_map'が 'parallel'のコードを呼び出し、コアの数を把握しようとしていることがわかりました。何を考えているかを確認するには、次のように入力します
 
> getOption( "mc.cores"、2L)
 [1] 2 
> 
 
  1. ああ瞬間! 'tm_map'呼び出しに、1つのコアのみを使用するように指示してください。
 
> rdevel <-tm_map(rdevel、asPlainTextDocument、mc.cores = 1)
 match.fun(FUN)のエラー:オブジェクト 'asPlainTextDocument'が見つかりません
> rdevel <-tm_map(rdevel、asPlainTextDocument、mc.cores = 4)
警告メッセージ:
並列:: mclapply(x、FUN、...):
スケジュールされたすべてのコアでユーザーコードでエラーが発生しました
> 
 

つまり...複数のコアがある場合、エラーメッセージを表示するのではなく、「parallel」は各コアにエラーがあったことを示します。役に立たない、並行して!ドットを忘れました-関数名は 'as.PlainTextDocument'であるはずです!

したがって、このエラーが発生した場合は、「mc.cores = 1」を「tm_map」呼び出しに追加して、再度実行してください。

17
znmeb

私はこれに対する答えを見つけました 質問 :チャールズコプリーは彼の 答え で、新しいtmパッケージにはlazy = TRUEが必要だと彼が考えていることを示しています明示的に定義する。

したがって、コードは次のようになります

library(tm)
data('crude')
tm_map(crude, stemDocument, lazy = TRUE)

また、SnowballCを使用せずに試して、これら2つの答えの組み合わせかどうかを確認しました。どちらの方法でも結果に影響を与えるようには見えませんでした。

11
magsgiust

Mac OS X10.10.5で実行されているIntelクアッドコアI7を使用してtmで同じ問題が発生し、次の警告が表示されました。

Mclapply(content(x)、FUN、...)で、スケジュールされたコア1でユーザーコードでエラーが発生した場合、ジョブのすべての値が影響を受けます

Twitterのデータをダウンロードしてコーパスを作成していました。

CharlesCopleyのソリューションは私にも役立ちました。コーパスを作成した後、tm_map(*filename*, stemDocument, lazy = TRUE)を使用しましたが、tmは正しく機能しました。

3
Carlos Davila

私は同じ問題に直面していますが、最終的にそれを修正しました。私の推測では、コーパスに「longName」または「companyNewsCorpus」という名前を付けると問題が発生しますが、コーパス値を「a」として使用するとうまく機能します。本当に変だ。

以下のコードは、このスレッドで言及されているのと同じエラーメッセージを示しています

companyNewsCorpus  <-Corpus(DirSource("SourceDirectory"),
                            readerControl = list(language="english"))
companyNewsCorpus <- tm_map(companyNewsCorpus, 
                            removeWords, stopwords("english")) 

しかし、これを以下に変換すると、問題なく動作します。

a  <-Corpus(DirSource("SourceDirectory"), 
            readerControl = list(language="english"))
a <- tm_map(a, removeWords, stopwords("english")) 
3
Sudarshan

また、tmライブラリのremoveWords関数を使用しているときに、この同じ問題が発生しました。コア数を1に設定するなど、他のいくつかの回答は英語のストップワードのセットを削除するのに役立ちましたが、コーパスから名と姓のカスタムリストも削除したかったので、これらのリストは100,000以上でしたそれぞれ長い言葉。

他の提案はどれもこの問題を助けません、そして、いくつかの試行錯誤を通して、removeWordsがベクトルで1000語の制限を持っているように思われたことがわかりました。だから私は私のために問題を解決するこの関数を書きました:

# Let x be a corpus
# Let y be a vector containing words to remove
removeManyWords <- function (x, y) {

      n <- ceiling(length(y)/1000)
      s <- 1
      e <- 1000

      for (i in 1:n) {

            x <- tm_map(x, content_transformer(removeWords), y[s:e])
            s <- s + 1000
            e <- e + 1000

      }

      x

 }

この関数は、基本的に、削除する単語のベクトルに含まれる単語の数をカウントし、それを1000で除算して、最も近い整数nに切り上げます。次に、単語のベクトルをループしてn回削除します。このメソッドでは、関数内の実際のremoveWords呼び出しからわかるように、lazy = TRUEを使用したり、使用するコアの数を変更したりする必要はありませんでした。お役に立てれば!

1
mgiglia

Twitterデータで作業していて、tm_map()関数を使用してすべてのテキストを下位に変換しようとしたときに、元の質問で同じエラーが発生しました

Warning message: In parallel::mclapply(x, FUN, ...) :   
all scheduled cores encountered errors in user code

パッケージSnowballCをインストールしてロードすると、問題は完全に解決しました。お役に立てれば。

0
karunakarantk