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

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

ただいまの
回答率

90.49%

  • R

    306questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 612

hacosato

score 24

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

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

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


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

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


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

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

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

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

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

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


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

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

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

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

f<-file("ファイルパス〜〜.txt","r")
word3 <- list()
repeat {
  # for (line in lines) {
  a<-readLines(con=f,1)
  print(a)
  if (length(a) == 0) {
    break
  }
  if (a == "") {
    next
  }
  word3 <- append(word3, RMeCabC(a))
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

check解決した方法

0

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

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

library(RMeCab)

f<-file("ファイルパス〜〜.txt","r")
word3 <- list()
# RMeCabTextで一括処理ではなく、RMeCabCを使って1行ずつ処理する。
repeat {
  a<-readLines(con=f,1)
  if (length(a) == 0) {
    break
  }
  if (a == "") {
    next
  }
  word3 <- append(word3, RMeCabC(a))
}
word3_unlist <- unlist(word3)
wordvector <- paste(word3_unlist, names(word3_unlist), sep="_")

# ファイルを閉じるの忘れてたので閉じる。
close(f)

# 続きはとくに手を加えてません。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/16 23:33

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

    キャンセル

0

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

library(RMeCab)
RMeCabText.result <- RMeCabText(file.choose()) # Abe.txtを指定
word <- unlist(sapply(RMeCabText.result, "[[", 1))
pos <- unlist(sapply(RMeCabText.result, "[[", 2))
word.vector <- paste(word, pos, sep = "_")

search.word <- "^国民_名詞$" # 検索語「単語_品詞」
span <- 5 # スパン左右5語まで
span <- (-span : span)

library(stringr)
positions.of.matches <- grep(search.word, word.vector, perl = TRUE)
results <- NULL
for(i in 1 : length(span)) {
collocate.positions <- positions.of.matches + span[i]
collocates <- word.vector[collocate.positions]
results <- append(results, collocates)
}
results <- str_replace_all(string = results, pattern = search.word, replacement = "")
not.blank <- which(results != "")
results <- results[not.blank]

positions.of.matches.2 <- grep("_名詞", results, perl = TRUE) # 名詞
results.2 <- results[positions.of.matches.2]
results.3 <- str_replace_all(string = results.2, pattern = "_名詞", replacement = "") # "_名詞"の部分を削除

library(wordcloud)
wordcloud(results.3, min.freq = 1, colors = brewer.pal(8, "Dark2"))

追記

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

library(stringr)
library(wordcloud)

system('mecab -b 32768 -F"%m_%f[0]\n" -E "" extrabig.txt > word_POS.txt')
word.vector <- scan("word_POS.txt", what = character(), sep = "\n")

# あとは全く同じ
search.word <- "^国民_名詞$" # 検索語を「単語_品詞」という形式で指定
span <- 5 # スパンの指定(ここでは、左右5語まで)
span <- (-span : span)

positions.of.matches <- grep(search.word, word.vector, perl = TRUE)
results <- NULL
for(i in 1 : length(span)) {
collocate.positions <- positions.of.matches + span[i]
collocates <- word.vector[collocate.positions]
results <- append(results, collocates)
}

results <- str_replace_all(string = results, pattern = search.word, replacement = "")
not.blank <- which(results != "")
results <- results[not.blank]

positions.of.matches.2 <- grep("_名詞", results, perl = TRUE) # ここでは名詞
results.2 <- results[positions.of.matches.2]
results.3 <- str_replace_all(string = results.2, pattern = "_名詞", replacement = "") # 品詞の情報(ここでは、"_名詞"の部分)を削除

wordcloud(results.3, min.freq = 1, colors = brewer.pal(8, "Dark2"))

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/17 10:56

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

    キャンセル

  • 2018/06/17 11:04

    重いデータということですが、一体どれくらいの大きさなのでしょうか。

    library(RMeCab)
    RMeCabText.result <- RMeCabText(file.choose())
    # ここでテキスト選択
    str(RMeCabText.result)

    で出力の最初に読み込まれたリストの数が出てくるかと思いますが、いくつくらいになりますか?

    キャンセル

  • 2018/06/17 12:05

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

    キャンセル

  • 2018/06/17 13:15

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

    キャンセル

  • 2018/06/17 17: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 が出るようになったのでこのへんでやめておきます...

    キャンセル

  • 2018/06/18 21:06

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

    キャンセル

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

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    mecab-asyncによる文字化け

    mecab-asyncの例にあった var MeCab = new require('mecab-async') , mecab = new MeCab() ; var

  • 解決済

    mecab 品詞 選択

    やりたいこと 選択したテキストファイル内の文章をmecabを用いて形態素解析し、 品詞(名詞、動詞など)を絞り込みたいと考えています。 現在、テキストファイルの文章を形態素解析する

  • 解決済

    複数のテキストファイルをLDAモデルに

    やりたいこと 複数のテキストファイルを入力とし、指定したトピック数に分類するプログラムを作成したいと考えています。 現在、一つのテキストファイルをLDAモデルに投入するプログラムは

  • 解決済

    指定した言葉を排除したい

    やりたいこと テキストファイルからトピックモデルを作成するプログラムを実装中なのですが、コーパスを生成するのに用いる辞書に指示語(あれ、ここ、そちら)や、それ自体に重要な意味を持た

  • 解決済

    テキストに番号を付けて管理したい

    困っていること 入力したファイルのトピックを抽出するための前段階として 指定したディレクトリ内の.txtファイルを用いてLDAモデルを作成するプログラムを実装したのですが、 現在の

  • 受付中

    1つのファイルのトピックを調べたい(LDAモデル)

    質問 LDAモデルに詳しい方に質問です。 また、以下に記すプログラムで 複数の小説のテキストファイルからLDAモデルを作成したとき、その中に含まれる 1つの文書のトピックを参照

  • 解決済

    mecabで出力したデータの型と内容

    python3でmecabを用いた形態要素解析をしています。 from natto import MeCab m = MeCab() s = ”散歩したい。” l = m.p

  • 解決済

    Rで、listのnames属性を取得したい

    Rで、listのnames属性を取得して、あたらしいベクトルを作りたいです! library(RMeCab) (word <- RMeCabC("いつも答えてくれてありがとう

同じタグがついた質問を見る

  • R

    306questions

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