RMeCabFunctions の変更点 - RとLinuxと...

RとLinuxと...


RMeCabFunctions の変更点


[[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] "モ"     "モ"    



* &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

名詞と形容詞を対象にトライグラムで行列  
 > (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);
   }
 }