質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Q&A

解決済

3回答

1687閲覧

Rで、大きめのlistにsapplyできないです…

hacosato

総合スコア48

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

0グッド

0クリップ

投稿2018/06/16 03:11

編集2018/06/17 03:08

これを見ながらRでワードクラウドを書こうとしています。
http://langstat.hatenablog.com/entry/20170509/1494291821

幸いやりたいことは一旦できたのですが、大きめのデータを読ませるとうまく動かないです。

R

1sapply(RMeCabText.result, "[[", 1)

この部分(ライブラリ読み終わってから2行目の一部)がうまく動きません。

R

1 lapply(X = X, FUN = FUN, ...) でエラー: 2 cannot have attributes on a CHARSXP

という感じのエラーが出てしまいます…。

その前の行のMeCabは動いてるみたいなので今回MeCabは関係なくて、単純に長いリスト(lengthは30万ぐらいです)をsapplyできてないとおもっています。

lengthが5000ぐらいのデータならうまくうごきます!

なにか手の施しようはありますでしょうか…。

追加:
KojiDoiさまご回答ありがとうございます!
てさぐりながら、lapply部分をforに書き換えました!
合っていますでしょうか…。

R

1word2 <- list() 2for (i in (1:length(RMeCabText.result))) { 3 class(RMeCabText.result[[i]][1]) 4 word2 <- append(word2, RMeCabText.result[[i]][1]) 5} 6word2 <- unlist(word2)

しかし、今度はRMeCabが重くて?動かなくなってしまった
(Rstudio.appが「R session aborted」と言っている)ので、
今度はテキストファイルを分割して、別々でMeCabにかけてから統合しようとおもいます…。

時間かかってしまいそうだったので途中経過でした。
また書きます〜!

追加(2018/06/17 12:10)

テキストファイルを読み込むところを書き直し、1行ずつ読み込むようにしました!
リストを整形する方法がわからずつまづいているので、もう少しです…!

R

1f<-file("ファイルパス〜〜.txt","r") 2word3 <- list() 3repeat { 4 # for (line in lines) { 5 a<-readLines(con=f,1) 6 print(a) 7 if (length(a) == 0) { 8 break 9 } 10 if (a == "") { 11 next 12 } 13 word3 <- append(word3, RMeCabC(a)) 14}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

たくさんお付き合いいただきありがとうございました!

以下のように、RMeCabTextで一括処理ではなく、RMeCabCを使って1行ずつ処理することで、
30万行のデータも処理することができました。
きちんと測っていないですが、数分(<10分)かかる感じでした。
この処理の中ではpaste()がapplyに近い処理をしていると思いますが、この行は一瞬でした!

R

1library(RMeCab) 2 3f<-file("ファイルパス〜〜.txt","r") 4word3 <- list() 5# RMeCabTextで一括処理ではなく、RMeCabCを使って1行ずつ処理する。 6repeat { 7 a<-readLines(con=f,1) 8 if (length(a) == 0) { 9 break 10 } 11 if (a == "") { 12 next 13 } 14 word3 <- append(word3, RMeCabC(a)) 15} 16word3_unlist <- unlist(word3) 17wordvector <- paste(word3_unlist, names(word3_unlist), sep="_") 18 19# ファイルを閉じるの忘れてたので閉じる。 20close(f) 21 22# 続きはとくに手を加えてません。

もともとタイトルに入れていた問題は直接解決していない(っていうか再現しなくなってしまいました…)のですが、
やりたかったことはできるようになったので解決にします。
このたびはどうもありがとうございました〜!

投稿2018/06/18 12:02

hacosato

総合スコア48

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ライブラリの読み込みとテキスト処理の順序を変えただけですが、こんな感じでもエラーは起きますか?

R

1library(RMeCab) 2RMeCabText.result <- RMeCabText(file.choose()) # Abe.txtを指定 3word <- unlist(sapply(RMeCabText.result, "[[", 1)) 4pos <- unlist(sapply(RMeCabText.result, "[[", 2)) 5word.vector <- paste(word, pos, sep = "_") 6 7search.word <- "^国民_名詞$" # 検索語「単語_品詞」 8span <- 5 # スパン左右5語まで 9span <- (-span : span) 10 11library(stringr) 12positions.of.matches <- grep(search.word, word.vector, perl = TRUE) 13results <- NULL 14for(i in 1 : length(span)) { 15collocate.positions <- positions.of.matches + span[i] 16collocates <- word.vector[collocate.positions] 17results <- append(results, collocates) 18} 19results <- str_replace_all(string = results, pattern = search.word, replacement = "") 20not.blank <- which(results != "") 21results <- results[not.blank] 22 23positions.of.matches.2 <- grep("_名詞", results, perl = TRUE) # 名詞 24results.2 <- results[positions.of.matches.2] 25results.3 <- str_replace_all(string = results.2, pattern = "_名詞", replacement = "") # "_名詞"の部分を削除 26 27library(wordcloud) 28wordcloud(results.3, min.freq = 1, colors = brewer.pal(8, "Dark2")) 29

####追記
エラーの原因はよくわかりませんが、扱うファイルが大きくなると問題が起きる傾向があるようなので RMeCab は使用せずに system() から シェルの mecab を使用して処理させる方法を試してみました。
中間ファイル word_POS.txt を生成してしまいますが、こちらの方法だとエラーは全く起きませんでした。60万語でも大丈夫でした。

R

1library(stringr) 2library(wordcloud) 3 4system('mecab -b 32768 -F"%m_%f[0]\n" -E "" extrabig.txt > word_POS.txt') 5word.vector <- scan("word_POS.txt", what = character(), sep = "\n") 6 7# あとは全く同じ 8search.word <- "^国民_名詞$" # 検索語を「単語_品詞」という形式で指定 9span <- 5 # スパンの指定(ここでは、左右5語まで) 10span <- (-span : span) 11 12positions.of.matches <- grep(search.word, word.vector, perl = TRUE) 13results <- NULL 14for(i in 1 : length(span)) { 15collocate.positions <- positions.of.matches + span[i] 16collocates <- word.vector[collocate.positions] 17results <- append(results, collocates) 18} 19 20results <- str_replace_all(string = results, pattern = search.word, replacement = "") 21not.blank <- which(results != "") 22results <- results[not.blank] 23 24positions.of.matches.2 <- grep("_名詞", results, perl = TRUE) # ここでは名詞 25results.2 <- results[positions.of.matches.2] 26results.3 <- str_replace_all(string = results.2, pattern = "_名詞", replacement = "") # 品詞の情報(ここでは、"_名詞"の部分)を削除 27 28wordcloud(results.3, min.freq = 1, colors = brewer.pal(8, "Dark2"))

投稿2018/06/16 16:42

編集2018/06/19 03:41
fiwa

総合スコア1192

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hacosato

2018/06/17 01:56

回答ありがとうございました! やってみましたがだめでした…。軽いデータなら最後まで描画できますが、重いデータだとMeCabが動かなかったです…。昨日寝るときに思いついたんですけど、テキストファイルはそのまま、1行ずつ読み込むように書き換えたらいいかもしれないと思ったので、あとでやってみます〜!
fiwa

2018/06/17 02:04

重いデータということですが、一体どれくらいの大きさなのでしょうか。 library(RMeCab) RMeCabText.result <- RMeCabText(file.choose()) # ここでテキスト選択 str(RMeCabText.result) で出力の最初に読み込まれたリストの数が出てくるかと思いますが、いくつくらいになりますか?
hacosato

2018/06/17 03:05

いま重いデータだとRMeCabText動かなくなってしまったんですが、たしか30万ぐらいだったとおもいます。軽いデータで試してみたところ、lengthは23000でした!(こちらはうごきました!!)
KojiDoi

2018/06/17 04:15

本当に「重い」のが原因なのかですね。たとえば入力データの15万行目に何か想定外なものが含まれている可能性は考えられませんか?
fiwa

2018/06/17 08:43

ちょっと手許の環境で試してみましたが、回答内容のようにコードを変更した上で 10万、20万、30万のリストになるテキストで実行させてみたところ、10万&20万では成功しますが、30万では Value of SET_STRING_ELT() must be a 'CHARSXP' not a 'character' とか *** caught segfault *** address 0x30, cause 'memory not mapped' が出るようになりました。 30万の場合でも source() せずにコンソールから一行ずつ実行すると成功しています。 [R.app GUI 1.70 (7521) x86_64-apple-darwin15.6.0], R version 3.5.0 (2018-04-23) そしてなぜか RStudio Desktop で実行するとすべての場合で同様のエラーが出ます。 segfault が出るようになったのでこのへんでやめておきます...
hacosato

2018/06/18 12:06

KojiDoiさん 入力データの途中でおかしな行が、みたいなことは今回ありませんでしたが、そういう視点をすっかりわすれていました。勉強になります! fiwaさん わざわざ実験までしていただきありがとうございます。今回はトークンと品詞だけあればよかったので、RMeCabCを使うことにしました。
guest

0

「単語の情報と品詞の情報を結合し、「単語_品詞」のベクトルを作成」の部分をsapplyではなくforループで書き直してみてはどうでしょうか。適当なエラー処理を仕込めば、問題がどこで発生したかを特定できそうな気がします。

投稿2018/06/16 03:34

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hacosato

2018/06/16 14:33

ありがとうございました! 書き直してみたのですが今度はRMeCabが動かなくなってしまいました…(なぜ)。テキストファイルを分割してやってみます。また報告します!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問