RMeCabFunctions のバックアップソース(No.4) - アールメカブ

アールメカブ


RMeCabFunctions のバックアップソース(No.4)

[[RMeCab]]



#contents

詳細は &ref(SoftArchive/manual081108.pdf);を参照してください.

+ [[RMeCab]] パッケージを利用するには以下のコードを画面の ''&color(blue){>};'' の右に入力して、''Enter'' を押して実行します.
なお[[試用データセット>#data]]を用意しました.


* &size(20){&color(blue){docDF()関数};}; 2009年3月5日追加 [#icae4377]
2009 年 3月 5日 新規追加
『Rによるテキストマイニング入門』森北書店には記載がありません.

第 1 引数で指定されたファイル (フォルダが指定された場合は,その中の全ファイル),あるいは第1引数でデータフレームを,また第 2 引数で列(番号あるいは名前)を指定して,Ngram行列,あるいはターム・文書行列を作成する.なお[[LESS-THAN-1]] と [[TOTAL-TOKENS]] の情報行は追加されない 
指定可能な引数は
target, column = 0, type = 0, pos = c("名詞","形容詞"), minFreq = 1, N = 2, sym = 0, kigo = "記号", Genkei = 0, weight = ""
- target 引数はファイル名ないしフォルダ名,あるいはデータフレーム
- column はデータフレームを指定する場合,列(番号あるいは名前)を指定する
- pos 引数は pos = c("名詞", "形容詞","記号") のように指定する
- minFreq 引数には頻度の閾値を指定するが,docMatrix() 関数の場合とは異なり,全テキストを通じての総頻度を判定対象とする.例えば minFreq=2 と指定した場合,どれか一つの文書で頻度が二つ以上のタームは,これ以外の各文書に一度しか出現していなくとも,出力のターム・文書行列に含まれる.  docMatrix() 関数では,文書のごとの最低頻度であった. したがって,doc1という文書で二度以上出現しているタームが,他の文書で一度しか出現していない場合,このタームは出力のターム.文書行列に含まれるが,doc1以外の文書の頻度は一律 0 にされる
- N は Ngram の場合の N の数
- sym 未実装.
//引数は,抽出タームに句読点なので記号を含めるかを指定する.デフォルトでは sym = 0 とセットされており,記号はカウントされないが,sym = 1 とすると,記号を含めてカウントした結果が出力される.pos 引数に記号が含まれた場合は自動的に sym = 1 とセットされる
- kigo = "記号" は総計に記号を含むか含まないか.sym = 1 が指定された場合は数える
-  Genkei = 0 活用語を原型 (0) にするか,表層形(1) にするか
- weight = "tf*idf*norm" などを指定可能


 > setwd("C:/data")
 > (res <- docDF("doc")) # docフォルダの全ファイルを対象に
                         # 文字の Bi-gram
 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 = 19
      Ngram doc1.txt doc2.txt doc3.txt
 1  [い-ま]        0        0        1
 2  [す-。]        1        1        1
 3  [で-い]        0        0        1
 4  [で-す]        1        1        0
 5  [の-学]        0        1        0
 6  [は-学]        1        0        0
 7  [は-数]        0        1        1
 8  [ま-す]        0        0        1
 9  [を-学]        0        0        1
 10 [ん-で]        0        0        1
 11 [女-は]        0        1        1
 12 [学-の]        0        1        0
 13 [学-を]        0        0        1
 14 [学-ん]        0        0        1
 15 [学-生]        1        1        0
 16 [彼-女]        0        1        1
 17 [数-学]        0        1        1
 18 [生-で]        1        1        0
 19 [私-は]        1        0        0
 >  (res <- docDF("doc", type = 1, N=1))
  # 名詞と形容詞を対象にターム・文章行列
 ...
 number of extracted terms = 4
   TERM POS1   POS2 doc1.txt doc2.txt doc3.txt
 1 学生 名詞   一般        1        1        0
 2 彼女 名詞 代名詞        0        1        1
 3 数学 名詞   一般        0        1        1
 4   私 名詞 代名詞        1        0        0
 
 > (res <- docDF("doc", pos = c("名詞","形容詞"), type = 1, N=3))
 # 名詞と形容詞を対象にTri-gramで行列  
 number of extracted terms = 1
            TERM           POS1             POS2
 
 1 彼女-数学-学生 名詞-名詞-名詞 代名詞-一般-一般 
                       doc1.txt doc2.txt  doc3.txt
                        0        1        0

 > (res <- docDF("doc", type=1, N=1,pos = c("名詞","動詞")))
   # 名詞と動詞対象にターム・文章行列  
 number of extracted terms = 6
   TERM POS1   POS2 doc1.txt doc2.txt doc3.txt
 1 いる 動詞 非自立        0        0        1
 2 学ぶ 動詞   自立        0        0        1
 3 学生 名詞   一般        1        1        0
 4 彼女 名詞 代名詞        0        1        1
 5 数学 名詞   一般        0        1        1
 6   私 名詞 代名詞        1        0        0
 > 
 > # データフレームを解析する
 > (target <- read.csv("photo.csv"))
   ID Sex              Reply
 1  1   M   写真とってくれよ
 2  2   F 写真とってください
 3  3   M       写真とってね
 4  4   F 写真とってください
 5  5   M     写真とってっす
 > (res <- docDF(target, col = 3)) 
        # col はデータフレーム列あるいは名前
 # データフレームの3列目からBi-gram行列
 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, N=1, col = 3))
  # データフレームの3列目から文字頻度
 number of extracted terms = 13
    Ngram Row1 Row2 Row3 Row4 Row5
 1   [い]    0    1    0    1    0
 2   [く]    1    1    0    1    0
 3   [さ]    0    1    0    1    0
 4   [す]    0    0    0    0    1
 5   [だ]    0    1    0    1    0
 6   [っ]    1    1    1    1    2
 7   [て]    1    1    1    1    1
 8   [と]    1    1    1    1    1
 9   [ね]    0    0    1    0    0
 10  [よ]    1    0    0    0    0
 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 = 1,
          pos = c("名詞","動詞")))
 # データフレームの3列目からターム・文章行列
 number of extracted terms = 4
       TERM POS1   POS2 Row1 Row2 Row3 Row4 Row5
 1 くださる 動詞 非自立    0    1    0    1    0
 2   くれる 動詞 非自立    1    0    0    0    0
 3     とる 動詞   自立    1    1    1    1    1
 4     写真 名詞   一般    1    1    1    1    1

 > res <- docDF("writers", type = 1, N=1)
 ## 鴎外と漱石あわせて 8 テキスト.解析に数分かかります
 > head(res)
       TERM   POS1     POS2 ogai_gan.txt ...
 1        '   名詞 サ変接続            0  ...
 2        ,   名詞 サ変接続            0  ...   
 3     あい   名詞     一般            0  ...      
 4     あか   名詞     一般            0  ...     
 5 あかるい 形容詞     自立            0  ...
 6 あざやか   名詞     一般            0  ...
 ...


* &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行を実行しないと動作しないかもしれません
 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()関数};};    : 文書ターム行列(および重み付け)を作成 [#v66bb233]

# デフォルトでは名詞と動詞,形容詞のみを抽出するが,pos 引数で変更可能.
 # 対象ファイルのみが収まっているディレクトリ data を用意して
 > 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

* &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)
#  上記の結果にノード語である「極楽」を指定して,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でご利用の場合は
 # 以下の3行を実行しないと動作しないかもしれません
 Encoding(kekka$Term) <- "UTF-8"

* &size(20){&color(blue){rmSign()  関数};}; : MeCabの出力から 「記号」を取り除く [#rf2adf8d]

* &size(20){&color(blue){docMatrixDF()  関数};}; : データフレームの指定列を対象にターム文書行列を作成する. [#y33b354f]

なお引数 minFreq は各被験者(テキスト)全体を通じての,タームの総頻度の閾値を指定する