詳細は manual081108.pdfを参照してください.
2009 年 3月 5日 新規追加 『Rによるテキストマイニング入門』森北書店には記載がありません.
第 1 引数で指定されたファイル (フォルダが指定された場合は,その中の全ファイル),あるいは第1引数でデータフレームを,また第 2 引数で列(番号あるいは名前)を指定して,Ngram行列,あるいはターム・文書行列を作成する.なおLESS-THAN-1? と TOTAL-TOKENS? の情報行は追加されない 指定可能な引数は target, column = 0, type = 0, pos = c("名詞","形容詞"), minFreq = 1, N = 2, kigo = "記号", Genkei = 0
> 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
> 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("data/sakura.txt") # こんな結果 #[[1]] # [1] "昨日" "名詞" "副詞可能" "*" "*" "*" # [7] "*" "昨日" "キノウ" "キノー" # #[[2]] # [1] "も" "助詞" "係助詞" "*" "*" "*" "*" "も" # [9] "モ" "モ"
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) # とすると,形態素原型を返します.
> (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(): File not found: "RMeCab#kumo.PNG" at page "RMeCabFunctions"
# デフォルトでは名詞と動詞,形容詞のみを抽出するが,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
引数で指定されたファイルについて,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% 演算子を利用する.詳細は manual081108.pdfを参照してください.
Ngram()関数を適用し,その結果を行にテキスト名,列に Ngramセットとしたデータフレームで返す. Ngram()関数の引数はすべて指定可能
> 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 # ... 以下略
指定されたファイルについて,node で指定された語(ただし形態素原形)の前後に出てくる単語頻度を計算する.なおスパンは引数 span で指定する.
(kekka <- collocate(file = target, node = "春", span =3)) # length = 12 # Term Span Total # 1 、 1 5 # 2 が 2 3 # 3 で 1 11
# 芥川「蜘蛛の糸」 > 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"
なお引数 minFreq は各被験者(テキスト)全体を通じての,タームの総頻度の閾値を指定する