#author("2019-09-26T09:36:50+09:00","","") [[RMeCab]] #contents 詳細は &ref(SoftArchive/manual081108.pdf);と,追加関数の解説を加えた &ref{ism091124doc.pdf}; を参照してください.簡単な紹介スライド &ref(tokei2010prosper2.pdf); // ただし、このファイルには2009年以降実装された関数や機能の説明は書かれていません。 * ユーザー辞書 [#x4790c10] すべての関数に,実行時にユーザー辞書を指定できるようにしました.ただし Mac や Linux ,Windows でMeCab へのパス設定を行っている場合は,システム側でmecabrc ファイルを設定ください.この引数は,Windowsユーザーで環境設定が難しいと感じているユーザーのための仕様です.詳しくは, [[RMeCab:http://groups.google.co.jp/group/rmecab]]をご覧ください. かならず mecab で正しくコンパイルした辞書ファイルを指定してください. + テキスト59ページのユーザー辞書の作成方法は Windows を対象とした説明です.Mac および Linux では http://mecab.sourceforge.net/dic.html の説明に従ってください.一部を以下の引用いたします. ++ 適当なディレクトリに移動 (例: /home/foo/bar) ++ foo.csv という辞書ファイルを作成(例はテキスト58ページのishida.csv) 基広,-1,-1,1000,名詞,固有名詞,人名,名,*,*,基広,モトヒロ,モトヒロ ++ 辞書のコンパイル % /usr/local/libexec/mecab/mecab-dict-index -d/usr/local/lib/mecab/dic/ipadic \ -u foo.dic -f utf8 -t utf8 foo.csv -d DIR: システム辞書があるディレクトリ -u FILE: FILE というユーザファイルを作成 -f charset: CSVの文字コード -t charset: バイナリ辞書の文字コード ++ /home/foo/bar/foo.dic ができていることを確認 // * /usr/local/lib/mecab/dic/ipadic/dicrc もしくは /usr/local/etc/mecabrc に以下を追加 // /// // userdic = /home/foo/bar/foo.dic // * /usr/local/etc/mecabrc を編集する権限が無い場合は /usr/local/etc/mecabrc を ~/.mecabrc にコピーし, 上記のエントリを追加 ++ 実行方法 res <- RMeCabC("石田基広", dic = "/home/ishida/foo.dic") res + [[RMeCab]] パッケージを利用するには以下のコードを画面の ''&color(blue){>};'' の右に入力して、''Enter'' を押して実行します. なお[[試用データセット>#data]]を用意しました. * &size(20){&color(blue){RMeCabC()関数};}; : 短文の処理 [#j4792093] > library(RMeCab) > kekka <- RMeCabC("すもももももももものうち") > unlist(kekka) 第二引数 1 を加えると形態素原型を返します. //1.1ヴァージョンより > kekka <- RMeCabC("ご飯を食べた", 1) > unlist(kekka) # 名詞 助詞 動詞 助動詞 # "ご飯" "を" "食べる" "た" # 第二引数なしだと > kekka <- RMeCabC("ご飯を食べた") > unlist(kekka) # 名詞 助詞 動詞 助動詞 # "ご飯" "を" "食べ" "た" # 名詞だけ取り出したければ unlist(kekka) [names(unlist(kekka)) == "名詞"] # ご飯 # R-2.8.0 をMacOSXやLinuxでご利用の場合は # 以下の3行を実行しないと動作しないかもしれません # R-2.7 や R-2.8.1 では必要ありません # kekka <- unlist(kekka) # Encoding(kekka) <- "UTF-8" # Encoding(names(kekka)) <- "UTF-8" ///////////////////////////////////////////////////////////// //# 入力する文章が長い場合は第三引数を指定してください.デフォルトでは全角256文字までに限定しています. // # 目安は入力する文章の文字数の2倍です。 // > kekka <- RMeCabC("...を食べた",0, 2056) ///////////////////////////////////////////////////////////// * &size(20){&color(blue){RMeCabText()関数};}; : ファイルの解析結果をそのまま表示 [#ka92b2ed] # その他,和布蕪の出力をそのままリスト形式で出力する関数 > RMeCabText("data/sakura.txt") # こんな結果 #[[1]] # [1] "昨日" "名詞" "副詞可能" "*" "*" "*" # [7] "*" "昨日" "キノウ" "キノー" # #[[2]] # [1] "も" "助詞" "係助詞" "*" "*" "*" "*" "も" # [9] "モ" "モ" なお、サイズの大きなファイルを処理する場合、直前にガベージコレクションを実行しておくと良いかも知れません。 gc();gc()# ガベージコレクションを実行 またRStudioでは、重い処理の途中で落ちてしまう可能性もあります。この場合は素のRを単独で起動して実行すると良いかもしれません。 * &size(20){&color(blue){RMeCabDF()関数};}; : データフレームの指定列を解析 [#t839a622] ID,Sex,Reply 1,F,写真とってくれよ 2,M,写真とってください 3,F,写真とってね 4,F,写真とってください 5,M,写真とってっす と言うファイルが c:/data/photo.csv にあったとして > dat <- read.csv("c:/data/photo.csv", head = T) と読み込んで > RMeCabDF(dat, 3) > RMeCabDF(dat, "Reply") # 列名でも良い # datという読み込んだデータの 3 列目に日本語がある とすると,3 列目のデータをすべて形態素解析にかけます. [[1]] 名詞 動詞 助詞 動詞 助詞 "写真" "撮っ" "て" "くれ" "よ" [[2]] 名詞 動詞 助詞 動詞 "写真" "とっ" "て" "ください" また RMeCabDF(dat, 3, 1) とすると,形態素原型を返します. ////////////////////////////////////////////////// //# 入力する文章が長い場合は第四引数を指定してください // RMeCabDF(dat, 2, 1, 5120) # 全角2560文字 (5120/2)を想定 ////////////////////////////////////////////////// * &size(20){&color(blue){RMeCabFreq()関数};}; : ファイルから頻度表を作成 [#s29698eb] > (kekka <- RMeCabFreq("c:/data/sakura.txt") ) # こんな結果 # length = 13 # Term Info1 Info2 Freq #1 。 記号 句点 2 #2 、 記号 読点 1 #3 を 助詞 格助詞 1 ... # 10 桜餅 名詞 一般 3 # 11 今日 名詞 副詞可能 1 # 芥川龍之介 『蜘蛛の糸』(青空文庫より借用) # ただし主人公の名前の「かん陀多」の # 「かん」にあたる漢字は特殊文字なので削っている 実行時間を計る > pt1 <- proc.time() > kekka <- RMeCabFreq("c:/data/kumo.txt") pt2 <- proc.time() > kekka # 結果を見る Term Info1 Info2 Freq 1 あの フィラー * 1 2 いくら 副詞 一般 2 3 いつの間にか 副詞 一般 1 4 うようよ 副詞 一般 1 5 きっと 副詞 一般 1 # 実行時間を見る > pt2 - pt1 頻度表をグラフにしてみる # 『蜘蛛の糸』から、一般名詞かつ頻度が 7 以上の語を選ぶ kekka <- kekka [kekka[, 2] == "名詞" & kekka[, 3] == "一般" & kekka[,4] > 6, ] k.col <- rainbow(nrow(kekka)) matplot(1:nrow(kekka), kekka[,4], type = "n") for(i in 1:nrow(kekka)){ matlines(i, kekka[i,4], type = "h", col = k.col[i], lwd =5) } legend(1, max(kekka$Freq), legend = kekka$Term, col = k.col, lwd = 5) //# 上記をもっと簡単に行うコードを近く追加します #ref(RMeCab/kumo.PNG,nolink) //# カレントディレクトリ(getwd()で確認できます)にこんな中身のファイル sushi.txt &ref(sushi.txt); (中身はShift Jis なので,このままダブルクリックしても,ブラウザ上では文字化けします)があったとして //#昨日寿司を食べたけど,今日も寿司を食べたいな.明日も寿司を食べたいな.寿司は体にとても良い.きっと頭にも良いだろう. // // > kekka <- RMeCabFreq("sushi.txt") // > kekka // Term Morph1 Morph2 Freq // 1 きっと 副詞 一般 1 // 2 とても 副詞 助詞類接続 1 // 3 う 助動詞 * 1 // 4 た 助動詞 * 1 // 5 たい 助動詞 * 2 // 6 だ 助動詞 * 1 // 7 は 助詞 係助詞 1 // 8 も 助詞 係助詞 3 // 9 けど 助詞 接続助詞 1 // 10 に 助詞 格助詞 2 // 11 を 助詞 格助詞 3 // 12 な 助詞 終助詞 2 // 13 食べる 動詞 自立 3 // 14 体 名詞 一般 1 // 15 寿司 名詞 一般 4 // 16 頭 名詞 一般 1 // 17 今日 名詞 副詞可能 1 // 18 明日 名詞 副詞可能 1 // 19 昨日 名詞 副詞可能 1 // 20 良い 形容詞 自立 2 // 21 . 記号 句点 4 // 22 , 記号 読点 1 * &size(20){&color(blue){docMatrix()関数, docMatrix2()関数};}; : 通常はdocMatrix()を使ってください.文書ターム行列(および重み付け),あるいはターム共起頻度行列(2009年3月追加)を作成 [#v66bb233] デフォルトでは名詞と動詞,形容詞のみを抽出するが,pos 引数で変更可能. # 対象ファイルのみが収まっているディレクトリ doc を用意して > res <- docMatrix("doc", pos = c("名詞","形容詞","助詞") ) > res docs terms doc1.txt doc2.txt doc3.txt [[LESS-THAN-1]] 0 0 0 [[TOTAL-TOKENS]] 4 6 8 は 1 1 1 学生 1 1 0 私 1 0 0 の 0 1 0 数学 0 1 1 彼女 0 1 1 で 0 0 1 を 0 0 1 あるいはフォルダを別に指定して > targetDir <- "c:/data/file" > test <- docMatrix(targetDir) > test # 名詞と動詞のみを抽出する場合 > test <- docMatrix(targetDir, pos = c("名詞","動詞") ) > test # こんな結果 # docs # terms dat1.txt dat2.txt dat3.txt # 季節 2 0 0 # 今 1 0 0 # 春 2 0 0 # 人 1 0 1 # 大好き 1 0 0 # 日本 2 2 2 各テキストで頻度数が 2 以上のタームのみで構成する場合 通常は以下のようにします. これはあるタームがすべてのテキストで出現した総数を指定することになります. > test <- docMatrix(targetDir) ## 総頻度が 2 以上のタームを残す > test <- test[rowSums(test) > 2, ] 各テキスト別に,最低頻度を満たすタームだけを残す # 指定頻度以下のタームが何種類あったかは表示される > test <- docMatrix(targetDir, minFreq = 2 ) > test # こんな結果 # docs #terms dat1.txt dat2.txt dat3.txt # 季節 2 0 0 # 春 2 0 0 # 日本 2 2 2 # 犬 0 2 2 # 柴犬 0 2 0 # 特産 0 2 0 TF と IDF を組み合わせた重みをつける場合 > test <- docMatrix(targetDir, weight = "tf*idf" ) > test # こんな結果 # docs #terms dat1.txt dat2.txt dat3.txt # あり 2.584963 0.000000 0.000000 # い 1.584963 1.584963 0.000000 # し 1.584963 1.584963 0.000000 # 季節 5.169925 0.000000 0.000000 # 迎えよ 2.584963 0.000000 0.000000 co 引数はタームの共起行列を作成する. ## ただし,共起行列は巨大になり, ## パソコンのスペックによっては ## 途中でR,場合によってはパソコンがフリーズすることもあります. ## その場合 Matrix パッケージを使って,疎な行列に変換すると ## 有効な場合もあります.詳しくは,サンプルデータ data.zip ## あるいは data.tar.gz 内の RMeCab.R をご覧ください > ## 行名のタームと列名のタームが共起した回数 > ## 対称行列である > res <- docMatrix("doc", pos = c("名詞","形容詞","助詞"), co = 1) > res # 対角要素は出現回数 terms terms は 学生 私 の 数学 彼女 で を は 3 2 1 1 2 2 1 1 学生 2 2 1 1 1 1 0 0 私 1 1 1 0 0 0 0 0 の 1 1 0 1 1 1 0 0 数学 2 1 0 1 2 2 1 1 彼女 2 1 0 1 2 2 1 1 で 1 0 0 0 1 1 1 1 を 1 0 0 0 1 1 1 1 行名のタームと列名のタームが共起したか否か > ## 対称行列である > res <- docMatrix("doc", pos = c("名詞","形容詞","助詞"), co = 2) > res は 学生 私 の 数学 彼女 で を は 1 1 1 1 1 1 1 1 学生 1 1 1 1 1 1 0 0 私 1 1 1 0 0 0 0 0 の 1 1 0 1 1 1 0 0 数学 1 1 0 1 1 1 1 1 彼女 1 1 0 1 1 1 1 1 で 1 0 0 0 1 1 1 1 を 1 0 0 0 1 1 1 1 * &size(20){&color(blue){Ngram()関数};}; : N-gram のカウント [#z98bc249] 引数で指定されたファイルについて,N-gram を計る.引数 type が 0 なら文字単位で,1 なら形態素原形を単位として,また 2 なら品詞情報を単位に N-gram をカウントする.なお N は引数 N で指定. また pos 引数を指定すれば(pos = "名詞"など),品詞の指定もできる. > target <- "data/file/dat1.txt" > (kekka <- Ngram( target, type = 0, N = 2)) # file = РNgram = 2 # length = 54 # Ngram Freq # 1 [J-a] 1 # 2 [a-n] 1 # 3 [a-p] 1 # 4 [n-は] 1 # 5 [p-a] 1 # 6 [、-春] 1 # 7 [。-か] 1 # 8 [。-日] 1 > (kekka <- Ngram( target, type = 1, N = 3)) # Ngram Freq # 1 [Japan-は-今] 1 # 2 [、-春-の] 1 # 3 [。-かく-言う] 1 > (kekka <- Ngram( target, type = 2, N = 3)) # Ngram Freq # 1 [副詞-動詞-名詞] 1 # 2 [助動詞-助動詞-記号] 1 # 3 [助動詞-助詞-動詞] 2 出力から特定の N-gram を取り出すには %in% 演算子を利用する.詳細は &ref(SoftArchive/manual081108.pdf);を参照してください. * &size(20){&color(blue){docNgram()関数, docNgram2()関数};}; : 指定されたディレクトリ内のすべてのファイル(あるいは単一のファイル)を対象に Ngramを抽出. [#vb8ab5bd] Ngram()関数を適用し,その結果を行にテキスト名,列に Ngramセットとしたデータフレームで返す. Ngram()関数の引数はすべて指定可能 * &size(20){&color(blue){NgramDF() 関数, NgramDF2() 関数};}; : 基本的にNgram() 関数と同じであるが,N-gram を構成する各要素ごとに列に取ったデータフレームを出力. [#x638e83e] > kekkaDF <- NgramDF("kumo.txt", type = 1, N = 3) file =kumo.txt Ngram = 3 > kekkaDF[1:5,] Ngram1 Ngram2 Ngram3 Freq 1 、 「 いや 1 2 、 「 こら 1 3 、 「 しめる 1 4 、 ある 時 1 5 、 いくら 何 1 # ... 以下略 * &size(20){&color(blue){collocate()関数}; }; : コロケーションのカウント [#n8d2103b] 指定されたファイルについて,node で指定された語(ただし形態素原形)の前後に出てくる単語頻度を計算する.なおスパンは引数 span で指定する. > (kekka <- collocate(file = target, node = "春", span =3)) # length = 12 # Term Span Total # 1 、 1 5 # 2 が 2 3 # 3 で 1 11 * &size(20){&color(blue){collScores() 関数};}; : collocate() 関数の出力から T値, MI値 を返す [#k2fbe28b] //出力未確認です.検証した上で出力も調整し,近日中に再アップします. 芥川「蜘蛛の糸」 > target <- "c:/data/kumo.txt" # 「極楽」と前後3語の共起語を探す > kekka <- collocate(file = target, node = "極楽", span = 3) collocate()関数の結果にノード語である「極楽」を指定して,Tスコア,MIスコアを求める //,対数尤度比 (G2) を求める > collScores(kekka,"極楽") # こんな結果 (一部) Term Span Total Tscore Mutual G2 26 様 2 7 1.38668 11.2976 5.618497 27 蓮池 4 4 1.98887 11.4902 27.464578 28 蜘蛛 2 14 1.35915 12.2976 2.972814 29 行く 1 4 0.97775 9.4902 2.518165 30 釈迦 2 7 1.38668 11.2976 5.618497 31 間 1 3 0.98331 9.0752 3.130900 # R-2.8.0 をMacOSXやLinuxでご利用の場合は # 以下を実行しないと動作しないかもしれません # R-2.7 や R-2.8.1 では必要ありません # Encoding(kekka$Term) <- "UTF-8" * &size(20){&color(blue){rmSign() 関数};}; : MeCabの出力から 「記号」を取り除く [#rf2adf8d] * &size(20){&color(blue){docMatrixDF() 関数};}; : データフレームの指定列を対象にターム文書行列,あるいはターム共起頻度行列(2009年3月追加)を作成する. [#y33b354f] なお引数 minFreq は各被験者(テキスト)全体を通じての,タームの総頻度の閾値を指定する > targetText <- "photo.csv" > dat <- read.csv(targetText, head = T) # 男性の被験者だけを見る dat[dat$Sex == "M",] res <- docMatrixDF(dat[,"Reply"]) res ## OBS.1 OBS.2 OBS.3 OBS.4 OBS.5 ## くださる 0 1 0 1 0 ## くれる 1 0 0 0 0 ## とる 1 1 1 1 1 ## 写真 1 1 1 1 1 テキスト(被験者)全体を通じて,総頻度が 2 以上のタームを抽出 ## ここで総頻度とは、各タームごとに、各文書での出現した頻度 ## を合計した頻度をいう res <- docMatrixDF(dat[,"Reply"], minFreq = 2) res ## OBS.1 OBS.2 OBS.3 OBS.4 OBS.5 ## くださる 0 1 0 1 0 ## とる 1 1 1 1 1 ## 写真 1 1 1 1 1 co 引数はタームの共起行列を作成する.下記の例を参照.2009 年 3月実装.テキストに記載はありません. ## ただし,共起行列は巨大になり, ## パソコンのスペックによっては ## 途中でR,場合によってはパソコンがフリーズすることもあります ## その場合 Matrix パッケージを使って,疎な行列に変換すると ## 有効な場合もあります.詳しくは,サンプルデータ data.zip ## あるいは data.tar.gz 内の RMeCab.R をご覧ください 行名のタームに対して,列名のタームが出現した回数 ## 行名のタームと列名のタームが共起した回数 ## 対称行列 res <- docMatrixDF(dat[,"Reply"], co = 1) res ### 行名のタームと列名のタームが共起したか否か ## 対称行列 res <- docMatrixDF(dat[,"Reply"], co = 2) res * &size(20){&color(blue){docNgramDF() 関数};}; : データフレームの指定列を対象にN-gram 文字行列 あるいは N-gram ターム・文書行列,あるいはターム共起頻度行列を作成する. [#ca39df7e] なお引数 minFreq は各被験者(テキスト)全体を通じての,タームの総頻度の閾値を指定する > res <- docNgramDF(dat[, "opinion"]) * * * * * * * * * * * * * * * * * * * * * * * * * * * number of extracted terms = 1077 to make matrix now > nrow(res);ncol(res) [1] 331 [1] 1077 > res[1:10, 1000:1005] [約] [訳] [愉] [癒] [優] [友] Row1 0 0 0 0 0 0 Row2 0 0 0 0 0 0 Row3 0 0 0 0 0 0 Row4 0 0 0 0 0 1 Row5 0 0 0 0 0 0 Row6 0 0 0 0 0 0 Row7 0 0 0 0 0 0 Row8 0 0 0 0 0 0 Row9 0 0 0 0 0 0 Row10 0 0 0 0 0 0 > res <- docNgramDF(dat[, "opinion"], N = 2) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * number of extracted terms = 7368 to make matrix now > nrow(res);ncol(res) [1] 331 [1] 7368 > res[1:10, 1000:1005] [う-店] [う-配] [う-旅] [え-、] [え-P] [え-ず] Row1 0 0 0 0 0 0 Row2 0 0 0 0 0 0 Row3 0 0 0 0 0 0 Row4 0 0 0 0 0 0 Row5 0 0 0 0 0 0 Row6 0 0 0 0 0 0 Row7 0 0 0 0 0 0 Row8 0 0 0 0 0 0 Row9 0 0 0 0 0 0 Row10 0 0 0 0 0 0 > res <- docNgramDF(dat[, "opinion"], type = 1) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * number of extracted terms = 1418 to make matrix now > nrow(res);ncol(res) [1] 331 [1] 1418 > res[1:10, 1000:1005] [体] [体験] [対応] [対向] [対象] [待ち時間] Row1 0 0 0 0 0 0 Row2 0 0 0 0 0 0 Row3 0 0 0 0 0 0 Row4 0 0 0 0 0 0 Row5 0 0 1 0 0 0 Row6 0 0 0 0 0 0 Row7 0 0 0 0 0 0 Row8 0 0 0 0 0 0 Row9 0 0 0 0 0 0 Row10 0 0 0 0 0 0 > res <- docNgramDF(dat[, "opinion"], type = 1, N = 2) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * number of extracted terms = 4368 to make matrix now > nrow(res);ncol(res) [1] 331 [1] 4368 > res[1:10, 1000:1003] [テーマパーク-いつか] [テーマパーク-改装] [テーマパーク-古い] Row1 0 0 0 Row2 0 0 0 Row3 0 0 0 Row4 0 0 0 Row5 0 0 0 Row6 0 0 0 Row7 0 0 0 Row8 0 0 0 Row9 0 0 0 Row10 0 0 0 [テーマパーク-良い] Row1 0 Row2 0 Row3 0 Row4 0 Row5 0 Row6 0 Row7 0 Row8 0 Row9 0 Row10 0 > res <- docNgramDF(dat[,"opinion"], pos = "名詞", type = 1, N = 2) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * to make matrix now > res[1:3, 1000:1002] [モノレール-利用] [モラル-皆] [ライト-ため] Row1 0 0 0 Row2 0 0 0 Row3 0 0 0 > * &size(20){&color(blue){docDF()関数};}; 2009年3月5日追加 [#icae4377] 2009 年 3月 5日 新規追加 実験中 『Rによるテキストマイニング入門』森北書店には記載がありません. 第 1 引数で指定されたファイル (フォルダが指定された場合は,その中の全ファイル),あるいは第1引数でデータフレームを,また第 2 引数で列(番号あるいは名前)を指定して,Ngram行列,あるいはターム・文書行列を作成する.指定可能な引数は //target, column = 0, type = 0, pos = c("名詞","形容詞"), minFreq = 1, N = 2, sym = 0, kigo = "記号",Genkei = 0, weight = "" -- target : 引数はファイル名ないしフォルダ名,あるいはデータフレーム -- column : はデータフレームを指定する場合,列(番号あるいは名前)を指定する -- type : 0 は文字のGramを 1はタームのGramを作成.デフォルトは0 -- pos : 引数は pos = c("名詞", "形容詞","記号") のように指定する.指定されない場合は記号を含め,すべてを抽出. -- minFreq : 引数には全ファイルを通じての合計頻度の閾値を指定する.デフォルトは1.つまり,どれか一つのファイルに一度でも出現していれば,データフレームに登録する.対象文書の分量が多い場合は 3 などを指定することを検討ください. //が,docMatrix() 関数の場合とは異なり,全テキストを通じての総頻度を判定対象とする.例えば minFreq=2 と指定した場合,どれか一つの文書で頻度が二つ以上のタームは,これ以外の各文書に一度しか出現していなくとも,出力のターム・文書行列に含まれる. docMatrix() 関数では,文書のごとの最低頻度であった. したがって,doc1という文書で二度以上出現しているタームが,他の文書で一度しか出現していない場合,このタームは出力のターム.文書行列に含まれるが,doc1以外の文書の頻度は一律 0 にされる -- N: は Ngram の場合の N の数.デフォルトは1 //-- sym: 未実装. //引数は,抽出タームに句読点なので記号を含めるかを指定する.デフォルトでは sym = 0 とセットされており,記号はカウントされないが,sym = 1 とすると,記号を含めてカウントした結果が出力される.pos 引数に記号が含まれた場合は自動的に sym = 1 とセットされる //-- kigo = "記号": は総計に記号を含むか含まないか.sym = 1 が指定された場合は数える -- Genkei:活用語を原型 (0) にするか,表層形(1) にするか.デフォルトは 0. -- weight = "tf*idf*norm" などの重みを指定可能.デフォルトは重み無し. -- nDF : N個のタームそれぞれを独立した列に取る.デフォルトは 0: nDF = 1 とするとNgramDF() 関数, NgramDF2() 関数に似た出力になります. -- co :共起行列の作成 --- ただし,共起行列は巨大になり,パソコンのスペックによっては途中で R,場合によってはパソコンがフリーズすることもあります.その場合 Matrix パッケージを使って,疎な行列に変換すると有効かもしれません.詳しくは,サンプルデータ data.zip,あるいは data.tar.gz 内の RMeCab.R をご覧ください > setwd("C:/data") > (res <- docDF("doc")) # docフォルダの全ファイルを対象に file = doc1.txt file = doc2.txt file = doc3.txt file_name = doc/doc1.txt opened file_name = doc/doc2.txt opened file_name = doc/doc3.txt opened number of extracted terms = 15 now making a data frame. wait a while! Ngram doc1.txt doc2.txt doc3.txt 1 。 1 1 1 2 い 0 0 1 3 す 1 1 1 4 で 1 1 1 5 の 0 1 0 6 は 1 1 1 7 ま 0 0 1 8 を 0 0 1 9 ん 0 0 1 10 女 0 1 1 11 学 1 2 2 12 彼 0 1 1 13 数 0 1 1 14 生 1 1 0 15 私 1 0 0 ターム・文章行列 > (res <- docDF("doc", type = 1, N=1)) file = doc1.txt file = doc2.txt file = doc3.txt file_name = doc/doc1.txt opened file_name = doc/doc2.txt opened file_name = doc/doc3.txt opened number of extracted terms = 13 now making a data frame. wait a while! TERM POS1 POS2 doc1.txt doc2.txt doc3.txt 1 。 記号 句点 1 1 1 2 いる 動詞 非自立 0 0 1 3 で 助詞 接続助詞 0 0 1 4 です 助動詞 * 1 1 0 5 の 助詞 連体化 0 1 0 6 は 助詞 係助詞 1 1 1 7 ます 助動詞 * 0 0 1 8 を 助詞 格助詞 0 0 1 9 学ぶ 動詞 自立 0 0 1 10 学生 名詞 一般 1 1 0 11 彼女 名詞 代名詞 0 1 1 12 数学 名詞 一般 0 1 1 13 私 名詞 代名詞 1 0 0 品詞細分類情報が POS2 列にあるので、*dplyr* の filter() とあわせて、必要なレコードをさらに絞り込むことができます。 res %>% filter(POS2 %in% c("一般", "自立")) 名詞と形容詞を対象にトライグラムで行列 > (res <- docDF("doc", pos = c("名詞","形容詞"), type = 1, N=3)) number of extracted terms = 1 TERM POS1 POS2 1 彼女-数学-学生 名詞-名詞-名詞 代名詞-一般-一般 doc1.txt doc2.txt doc3.txt 0 1 0 データフレームを解析する > (target <- read.csv("photo.csv")) ID Sex Reply 1 1 M 写真とってくれよ 2 2 F 写真とってください 3 3 M 写真とってね 4 4 F 写真とってください 5 5 M 写真とってっす データフレームの3列目からバイグラム行列 > (res <- docDF(target, col = 3, N = 2)) # col はデータフレーム列あるいは名前 number of extracted terms = 13 Ngram Row1 Row2 Row3 Row4 Row5 1 く-だ 0 1 0 1 0 2 く-れ 1 0 0 0 0 3 さ-い 0 1 0 1 0 4 だ-さ 0 1 0 1 0 5 っ-す 0 0 0 0 1 6 っ-て 1 1 1 1 1 7 て-く 1 1 0 1 0 8 て-っ 0 0 0 0 1 9 て-ね 0 0 1 0 0 10 と-っ 1 1 1 1 1 11 れ-よ 1 0 0 0 0 12 写-真 1 1 1 1 1 13 真-と 1 1 1 1 1 タームのバイグラム > (res <- docDF(target, col = 3, type = 1, N = 2)) number of extracted terms = 7 now making a data frame. wait a while! TERM POS1 POS2 Row1 Row2 Row3 Row4 Row5 1 くれる-よ 動詞-助詞 非自立-終助詞 1 0 0 0 0 2 て-くださる 助詞-動詞 接続助詞-非自立 0 1 0 1 0 3 て-くれる 助詞-動詞 接続助詞-非自立 1 0 0 0 0 4 て-っす 助詞-助動詞 接続助詞-* 0 0 0 0 1 5 て-ね 助詞-助詞 接続助詞-終助詞 0 0 1 0 0 6 とる-て 動詞-助詞 自立-接続助詞 1 1 1 1 1 7 写真-とる 名詞-動詞 一般-自立 1 1 1 1 1 タームのバイグラム.活用語は表層型で > (res <- docDF(target, col = 3, type = 1, N = 2, Genkei = 1)) number of extracted terms = 7 now making a data frame. wait a while! TERM POS1 POS2 Row1 Row2 Row3 Row4 Row5 1 くれ-よ 動詞-助詞 非自立-終助詞 1 0 0 0 0 2 て-ください 助詞-動詞 接続助詞-非自立 0 1 0 1 0 3 て-くれ 助詞-動詞 接続助詞-非自立 1 0 0 0 0 4 て-っす 助詞-助動詞 接続助詞-* 0 0 0 0 1 5 て-ね 助詞-助詞 接続助詞-終助詞 0 0 1 0 0 6 とっ-て 動詞-助詞 自立-接続助詞 1 1 1 1 1 7 写真-とっ 名詞-動詞 一般-自立 1 1 1 1 1 タームごとに列を分けて作成 > (res <- docDF("doc", type=1, N=2,pos = c("名詞","動詞"), Genkei = 1, nDF = 1)) number of extracted terms = 5 now making a data frame. wait a while! N1 N2 POS1 POS2 doc1.txt doc2.txt doc3.txt 1 学ん い 動詞-動詞 自立-非自立 0 0 1 2 彼女 数学 名詞-名詞 代名詞-一般 0 1 1 3 数学 学ん 名詞-動詞 一般-自立 0 0 1 4 数学 学生 名詞-名詞 一般-一般 0 1 0 5 私 学生 名詞-名詞 代名詞-一般 1 0 0 ## 鴎外と漱石あわせて 8 テキスト.解析に数分かかります > res <- docDF("writers", type = 1, N=1) > head(res) TERM POS1 POS2 ogai_gan.txt ... 1 ' 名詞 サ変接続 0 ... 2 , 名詞 サ変接続 0 ... 3 あい 名詞 一般 0 ... 4 あか 名詞 一般 0 ... 5 あかるい 形容詞 自立 0 ... 6 あざやか 名詞 一般 0 ... ... * 文字列ベクトルをファイルに偽装する方法 [#t9aa01d7] tempfile()関数で一時ファイルを作成し、ここにwrite()関数で文字列を書き込む方法などがあります。 dummy <- c ("私は真面目な学生です。", "彼女は数学専攻の学生です。", "彼らは物理学を専攻している。") tmpdir <- tempdir () for (i in seq(dummy) ){ td <- tempfile("tmp", tmpdir = tmpdir) write( dummy [i] , file = td) if (file.exists (td)) cat( td, "exists", "\n") } library (RMeCab) x <- docMatrix (tmpdir) x # 以下のコードは、通常は実行する必要はありません# # unlink (tmpdir, recursive = TRUE) # tmpファイルを削除 * サイズの大きいテキストを解析する場合 [#h6961e00] RMeCabおよびRでサイズの大きいテキストを解析するには限界があります。 応急的には、ファイルを分割して、別々に解析し、その結果を後でmergeすることが可能かもしれません。 > # 二つの頻度データフレーム > X <- data.frame(TERM = c("春","秋","冬","自然","数学"), DOC1 = 1:5, DOC2 = 101:105) > X TERM DOC1 DOC2 1 春 1 101 2 秋 2 102 3 冬 3 103 4 自然 4 104 5 数学 5 105 > Y <- data.frame(TERM = c("秋","春","科学","冬","温暖"), DOC1 = 11:15, DOC2 = 1001:1005) > Y TERM DOC1 DOC2 1 秋 11 1001 2 春 12 1002 3 科学 13 1003 4 冬 14 1004 5 温暖 15 1005 > # dplyrパッケージを使ってマージする > install.packages("dplyr") > library (dplyr) > merge(X, Y, all = TRUE) %.% group_by(TERM) %.% summarise (doc1 = sum(DOC1), doc2 = sum(DOC2)) Source: local data frame [7 x 3] TERM doc1 doc2 1 自然 4 104 2 秋 13 1103 3 春 13 1103 4 数学 5 105 5 冬 17 1107 6 温暖 15 1005 7 科学 13 1003 * 青空文庫からファイルをダウンロードして解凍、ルビ取り、文字コード変換するRコード [#b1945a7c] 青空文庫で公開されている圧縮zipファイルのダウンロードリンク(URL)を文字列として引数に指定すると ダウンロードして解凍、ルビなどのメタ情報を削除します。処理後のファイルは、実行フォルダ内に新規に 作成されたNORUBYフォルダに保存されます。なお、MacやLinuxで実行した場合、処理の途中で文字コードをUTF-8に変換します。 第二引数に処理後のファイル名を指定することもできます。 実行例 太宰治 『走れメロス』http://www.aozora.gr.jp/cards/000035/card1567.html source ("Aozora.R") Aozora ("http://www.aozora.gr.jp/cards/000035/files/1567_ruby_4948.zip") #' @param url txtname #' Aozora <- function(url = NULL, txtname = NULL){ enc <- switch(.Platform$pkgType, "win.binary" = "CP932", "UTF-8") if (is.null(url)) stop ("specify URL") tmp <- unlist (strsplit (url, "/")) tmp <- tmp [length (tmp)] curDir <- getwd() tmp <- paste(curDir, tmp, sep = "/") download.file (url, tmp) textF <- unzip (tmp) unlink (tmp) if(!file.exists (textF)) stop ("something wrong!") if (is.null(txtname)) txtname <- paste(unlist(strsplit(basename (textF), ".txt$"))) if (txtname != "NORUBY") { newDir <- paste(dirname (textF), "NORUBY", sep = "/") if (! file.exists (newDir)) dir.create (newDir) newFile <- paste (newDir, "/", txtname, "2.txt", sep = "") con <- file(textF, 'r', encoding = "CP932" ) outfile <- file(newFile, 'w', encoding = enc) flag <- 0; reg1 <- enc2native ("\U005E\U5E95\U672C") reg2 <- enc2native ("\U3010\U5165\U529B\U8005\U6CE8\U3011") reg3 <- enc2native ("\UFF3B\UFF03\U005B\U005E\UFF3D\U005D\U002A\UFF3D") reg4 <- enc2native ("\U300A\U005B\U005E\U300B\U005D\U002A\U300B") reg5 <- enc2native ("\UFF5C") while (length(input <- readLines(con, n=1, encoding = "CP932")) > 0){ if (grepl(reg1, input)) break ; if (grepl(reg2, input)) break; if (grepl("^------", input)) { flag <- !flag next; } if (!flag){ input <- gsub (reg3, "", input, perl = TRUE) input <- gsub (reg4, "", input, perl = TRUE) input <- gsub (reg5, "", input, perl = TRUE) writeLines(input, con=outfile) } } close(con); close(outfile) return (newDir); } }