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

アールメカブ


RMeCabFunctions のバックアップ(No.5)


RMeCab

詳細は filemanual081108.pdfを参照してください.

  1. RMeCab パッケージを利用するには以下のコードを画面の > の右に入力して、Enter を押して実行します. なお試用データセットを用意しました.

_ docDF()関数 2009年3月5日追加

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 = 0: はデータフレームを指定する場合,列(番号あるいは名前)を指定する
  • type = 0: 0 は文字のGramを 1はタームのGramを作成
  • pos : 引数は pos = c("名詞", "形容詞","記号") のように指定する
  • minFreq : 引数には頻度の閾値を指定するが,docMatrix() 関数の場合とは異なり,全テキストを通じての総頻度を判定対象とする.例えば minFreq=2 と指定した場合,どれか一つの文書で頻度が二つ以上のタームは,これ以外の各文書に一度しか出現していなくとも,出力のターム・文書行列に含まれる. docMatrix() 関数では,文書のごとの最低頻度であった. したがって,doc1という文書で二度以上出現しているタームが,他の文書で一度しか出現していない場合,このタームは出力のターム.文書行列に含まれるが,doc1以外の文書の頻度は一律 0 にされる
  • N: は Ngram の場合の N の数
  • sym: 未実装.
  • kigo = "記号": は総計に記号を含むか含まないか.sym = 1 が指定された場合は数える
  • Genkei = 0 :活用語を原型 (0) にするか,表層形(1) にするか
  • weight = "tf*idf*norm" などを指定可能
  • nDF =0: type=1 の場合で,N個のタームそれぞれを独立した列に取る.
> 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  ...
...

_ RMeCabC()関数 : 短文の処理

> library(RMeCab)
> kekka <- RMeCabC("すもももももももものうち")
> unlist(kekka)

# 第二引数 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"

_ RMeCabText?()関数 : ファイルの解析結果をそのまま表示

# その他,和布蕪の出力をそのままリスト形式で出力する関数

>  RMeCabText("data/sakura.txt")

# こんな結果
#[[1]]
# [1] "昨日"     "名詞"     "副詞可能" "*"        "*"        "*"       
# [7] "*"        "昨日"     "キノウ"   "キノー"  
#
#[[2]]
# [1] "も"     "助詞"   "係助詞" "*"      "*"      "*"      "*"      "も"    
# [9] "モ"     "モ"    

_ RMeCabDF()関数 : データフレームの指定列を解析

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)
# とすると,形態素原型を返します.

_ RMeCabFreq?()関数 : ファイルから頻度表を作成

> (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)
kumo.PNG

_ docMatrix()関数, docMatrix2()関数 : 文書ターム行列(および重み付け)を作成

# デフォルトでは名詞と動詞,形容詞のみを抽出するが,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

_ Ngram()関数 : N-gram のカウント

引数で指定されたファイルについて,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% 演算子を利用する.詳細は filemanual081108.pdfを参照してください.

_ docNgram()関数, docNgram2()関数 : 指定されたディレクトリ内のすべてのファイル(あるいは単一のファイル)を対象に Ngramを抽出.

Ngram()関数を適用し,その結果を行にテキスト名,列に Ngramセットとしたデータフレームで返す. Ngram()関数の引数はすべて指定可能

_ NgramDF() 関数, NgramDF2() 関数 : 基本的にNgram() 関数と同じであるが,N-gram を構成する各要素ごとに列に取ったデータフレームを出力.

	> 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
	# ... 以下略

_ collocate()関数 : コロケーションのカウント

指定されたファイルについて,node で指定された語(ただし形態素原形)の前後に出てくる単語頻度を計算する.なおスパンは引数 span で指定する.

(kekka <- collocate(file = target, node  = "春", span =3))
# length = 12 
#   Term   Span  Total
# 1    、    1     5
# 2    が    2     3
# 3    で    1    11

_ collScores() 関数 : collocate() 関数の出力から T値, MI値 を返す

# 芥川「蜘蛛の糸」
> target <- "c:/data/kumo.txt"
# 「極楽」と前後3語の共起語を探す
> kekka <- collocate(file = target, node = "極楽", span = 3)

# 上記の結果にノード語である「極楽」を指定して,Tスコア,MIスコアを求める

> 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"

_ rmSign() 関数 : MeCab?の出力から 「記号」を取り除く

_ docMatrixDF() 関数 : データフレームの指定列を対象にターム文書行列を作成する.

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