トップ
新規
一覧
単語検索
最終更新
ヘルプ
ログイン
アールメカブ
RMeCabFunctions
をテンプレートにして作成
開始行:
[[RMeCab]]
#contents
詳細は &ref(SoftArchive/manual081108.pdf);と,追加関数の...
// ただし、このファイルには2009年以降実装された関数や機能...
* ユーザー辞書 [#x4790c10]
すべての関数に,実行時にユーザー辞書を指定できるようにしま...
+ テキスト59ページのユーザー辞書の作成方法は Windows を対...
++ 適当なディレクトリに移動 (例: /home/foo/bar)
++ foo.csv という辞書ファイルを作成(例はテキスト58ページ...
基広,-1,-1,1000,名詞,固有名詞,人名,名,*,*,基広,モトヒロ,...
++ 辞書のコンパイル
% /usr/local/libexec/mecab/mecab-dict-index -d/usr/...
-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 もしくは /u...
//
/// // userdic = /home/foo/bar/foo.dic
// * /usr/local/etc/mecabrc を編集する権限が無い場合は...
++ 実行方法
res <- RMeCabC("石田基広", dic = "/home/ishida/foo.dic")
res
+ [[RMeCab]] パッケージを利用するには以下のコードを画面の...
なお[[試用データセット>#data]]を用意しました.
* &size(20){&color(blue){RMeCabC()関数};}; : 短文の処理 [...
> 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"
/////////////////////////////////////////////////////////...
//# 入力する文章が長い場合は第三引数を指定してください....
// # 目安は入力する文章の文字数の2倍です。
// > kekka <- RMeCabC("...を食べた",0, 2056)
/////////////////////////////////////////////////////////...
* &size(20){&color(blue){RMeCabText()関数};}; : ファイ...
# その他,和布蕪の出力をそのままリスト形式で出力する関数
> RMeCabText("data/sakura.txt")
# こんな結果
#[[1]]
# [1] "昨日" "名詞" "副詞可能" "*" "*" ...
# [7] "*" "昨日" "キノウ" "キノー"
#
#[[2]]
# [1] "も" "助詞" "係助詞" "*" "*" "*" ...
# [9] "モ" "モ"
なお、サイズの大きなファイルを処理する場合、直前にガベー...
gc();gc()# ガベージコレクションを実行
またRStudioでは、重い処理の途中で落ちてしまう可能性もあり...
* &size(20){&color(blue){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)
とすると,形態素原型を返します.
//////////////////////////////////////////////////
//# 入力する文章が長い場合は第四引数を指定してください
// RMeCabDF(dat, 2, 1, 5120) # 全角2560文字 (5120/2)を想定
//////////////////////////////////////////////////
* &size(20){&color(blue){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], l...
}
legend(1, max(kekka$Freq), legend = kekka$Term, col = k....
lwd = 5)
//# 上記をもっと簡単に行うコードを近く追加します
#ref(RMeCab/kumo.PNG,nolink)
//# カレントディレクトリ(getwd()で確認できます)にこんな中...
//#昨日寿司を食べたけど,今日も寿司を食べたいな.明日も寿...
//
// > 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()関...
デフォルトでは名詞と動詞,形容詞のみを抽出するが,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...
## あるいは data.tar.gz 内の RMeCab.R をご覧ください
> ## 行名のタームと列名のタームが共起した回数
> ## 対称行列である
> res <- docMatrix("doc", pos = c("名詞","形容詞","助詞"...
> 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("名詞","形容詞","助詞"...
> 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 のカ...
引数で指定されたファイルについて,N-gram を計る.引数 typ...
> 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% 演算子を利用す...
* &size(20){&color(blue){docNgram()関数, docNgram2()関数}...
Ngram()関数を適用し,その結果を行にテキスト名,列に Ngram...
* &size(20){&color(blue){NgramDF() 関数, NgramDF2() 関数}...
> 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()関数}; }; : コロケ...
指定されたファイルについて,node で指定された語(ただし形...
> (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() 関数};}; : colloc...
//出力未確認です.検証した上で出力も調整し,近日中に再ア...
芥川「蜘蛛の糸」
> target <- "c:/data/kumo.txt"
# 「極楽」と前後3語の共起語を探す
> kekka <- collocate(file = target, node = "極楽", span ...
collocate()関数の結果にノード語である「極楽」を指定して,...
//,対数尤度比 (G2) を求める
> collScores(kekka,"極楽")
# こんな結果 (一部)
Term Span Total Tscore Mutual ...
26 様 2 7 1.38668 11.2976 5...
27 蓮池 4 4 1.98887 11.4902 27.4...
28 蜘蛛 2 14 1.35915 12.2976 2....
29 行く 1 4 0.97775 9.4902 2...
30 釈迦 2 7 1.38668 11.2976 5...
31 間 1 3 0.98331 9.0752 ...
# R-2.8.0 をMacOSXやLinuxでご利用の場合は
# 以下を実行しないと動作しないかもしれません
# R-2.7 や R-2.8.1 では必要ありません
# Encoding(kekka$Term) <- "UTF-8"
* &size(20){&color(blue){rmSign() 関数};}; : MeCabの出力...
* &size(20){&color(blue){docMatrixDF() 関数};}; : データ...
なお引数 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...
## ただし,共起行列は巨大になり,
## パソコンのスペックによっては
## 途中で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() 関数};}; : データ...
なお引数 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 ...
Row2 0 0 ...
Row3 0 0 ...
Row4 0 0 ...
Row5 0 0 ...
Row6 0 0 ...
Row7 0 0 ...
Row8 0 0 ...
Row9 0 0 ...
Row10 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 ...
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日追加...
2009 年 3月 5日 新規追加 実験中
『Rによるテキストマイニング入門』森北書店には記載がありま...
第 1 引数で指定されたファイル (フォルダが指定された場合は...
//target, column = 0, type = 0, pos = c("名詞","形容詞"),...
-- target : 引数はファイル名ないしフォルダ名,あるいはデー...
-- column : はデータフレームを指定する場合,列(番号ある...
-- type : 0 は文字のGramを 1はタームのGramを作成.デフォ...
-- pos : 引数は pos = c("名詞", "形容詞","記号") のように...
-- minFreq : 引数には全ファイルを通じての合計頻度の閾値...
//が,docMatrix() 関数の場合とは異なり,全テキストを通じ...
-- N: は Ngram の場合の N の数.デフォルトは1
//-- sym: 未実装.
//引数は,抽出タームに句読点なので記号を含めるかを指定す...
//-- kigo = "記号": は総計に記号を含むか含まないか.sym =...
-- Genkei:活用語を原型 (0) にするか,表層形(1) にするか...
-- weight = "tf*idf*norm" などの重みを指定可能.デフォル...
-- nDF : N個のタームそれぞれを独立した列に取る.デフォル...
-- co :共起行列の作成
--- ただし,共起行列は巨大になり,パソコンのスペックによ...
> 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 = ...
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...
1 くれる-よ 動詞-助詞 非自立-終助詞 1 0 0...
2 て-くださる 助詞-動詞 接続助詞-非自立 0 1 0...
3 て-くれる 助詞-動詞 接続助詞-非自立 1 0 0...
4 て-っす 助詞-助動詞 接続助詞-* 0 0 0...
5 て-ね 助詞-助詞 接続助詞-終助詞 0 0 1...
6 とる-て 動詞-助詞 自立-接続助詞 1 1 1...
7 写真-とる 名詞-動詞 一般-自立 1 1 1...
タームのバイグラム.活用語は表層型で
> (res <- docDF(target, col = 3, type = 1, N = 2, Genkei...
number of extracted terms = 7
now making a data frame. wait a while!
TERM POS1 POS2 Row1 Row2 Row3...
1 くれ-よ 動詞-助詞 非自立-終助詞 1 0 0...
2 て-ください 助詞-動詞 接続助詞-非自立 0 1 0...
3 て-くれ 助詞-動詞 接続助詞-非自立 1 0 0...
4 て-っす 助詞-助動詞 接続助詞-* 0 0 0...
5 て-ね 助詞-助詞 接続助詞-終助詞 0 0 1...
6 とっ-て 動詞-助詞 自立-接続助詞 1 1 1...
7 写真-とっ 名詞-動詞 一般-自立 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...
1 学ん い 動詞-動詞 自立-非自立 0 0 ...
2 彼女 数学 名詞-名詞 代名詞-一般 0 1 ...
3 数学 学ん 名詞-動詞 一般-自立 0 0 ...
4 数学 学生 名詞-名詞 一般-一般 0 1 ...
5 私 学生 名詞-名詞 代名詞-一般 1 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でサイズの大きいテキストを解析するには限界が...
応急的には、ファイルを分割して、別々に解析し、その結果を...
> # 二つの頻度データフレーム
> X <- data.frame(TERM = c("春","秋","冬","自然","数学")...
> X
TERM DOC1 DOC2
1 春 1 101
2 秋 2 102
3 冬 3 103
4 自然 4 104
5 数学 5 105
> Y <- data.frame(TERM = c("秋","春","科学","冬","温暖")...
> 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) %.% summa...
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
* 青空文庫からファイルをダウンロードして解凍、ルビ取り、...
青空文庫で公開されている圧縮zipファイルのダウンロードリン...
ダウンロードして解凍、ルビなどのメタ情報を削除します。処...
作成されたNORUBYフォルダに保存されます。なお、MacやLinux...
第二引数に処理後のファイル名を指定することもできます。
実行例 太宰治 『走れメロス』http://www.aozora.gr.jp/cards...
source ("Aozora.R")
Aozora ("http://www.aozora.gr.jp/cards/000035/files/1567...
#' @param url txtname
#'
Aozora <- function(url = NULL, txtname = NULL){
enc <- switch(.Platform$pkgType, "win.binary" = "CP932...
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(...
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\U...
reg3 <- enc2native ("\UFF3B\UFF03\U005B\U005E\UFF3D\U...
reg4 <- enc2native ("\U300A\U005B\U005E\U300B\U005D\U...
reg5 <- enc2native ("\UFF5C")
while (length(input <- readLines(con, n=1, encoding =...
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);
}
}
終了行:
[[RMeCab]]
#contents
詳細は &ref(SoftArchive/manual081108.pdf);と,追加関数の...
// ただし、このファイルには2009年以降実装された関数や機能...
* ユーザー辞書 [#x4790c10]
すべての関数に,実行時にユーザー辞書を指定できるようにしま...
+ テキスト59ページのユーザー辞書の作成方法は Windows を対...
++ 適当なディレクトリに移動 (例: /home/foo/bar)
++ foo.csv という辞書ファイルを作成(例はテキスト58ページ...
基広,-1,-1,1000,名詞,固有名詞,人名,名,*,*,基広,モトヒロ,...
++ 辞書のコンパイル
% /usr/local/libexec/mecab/mecab-dict-index -d/usr/...
-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 もしくは /u...
//
/// // userdic = /home/foo/bar/foo.dic
// * /usr/local/etc/mecabrc を編集する権限が無い場合は...
++ 実行方法
res <- RMeCabC("石田基広", dic = "/home/ishida/foo.dic")
res
+ [[RMeCab]] パッケージを利用するには以下のコードを画面の...
なお[[試用データセット>#data]]を用意しました.
* &size(20){&color(blue){RMeCabC()関数};}; : 短文の処理 [...
> 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"
/////////////////////////////////////////////////////////...
//# 入力する文章が長い場合は第三引数を指定してください....
// # 目安は入力する文章の文字数の2倍です。
// > kekka <- RMeCabC("...を食べた",0, 2056)
/////////////////////////////////////////////////////////...
* &size(20){&color(blue){RMeCabText()関数};}; : ファイ...
# その他,和布蕪の出力をそのままリスト形式で出力する関数
> RMeCabText("data/sakura.txt")
# こんな結果
#[[1]]
# [1] "昨日" "名詞" "副詞可能" "*" "*" ...
# [7] "*" "昨日" "キノウ" "キノー"
#
#[[2]]
# [1] "も" "助詞" "係助詞" "*" "*" "*" ...
# [9] "モ" "モ"
なお、サイズの大きなファイルを処理する場合、直前にガベー...
gc();gc()# ガベージコレクションを実行
またRStudioでは、重い処理の途中で落ちてしまう可能性もあり...
* &size(20){&color(blue){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)
とすると,形態素原型を返します.
//////////////////////////////////////////////////
//# 入力する文章が長い場合は第四引数を指定してください
// RMeCabDF(dat, 2, 1, 5120) # 全角2560文字 (5120/2)を想定
//////////////////////////////////////////////////
* &size(20){&color(blue){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], l...
}
legend(1, max(kekka$Freq), legend = kekka$Term, col = k....
lwd = 5)
//# 上記をもっと簡単に行うコードを近く追加します
#ref(RMeCab/kumo.PNG,nolink)
//# カレントディレクトリ(getwd()で確認できます)にこんな中...
//#昨日寿司を食べたけど,今日も寿司を食べたいな.明日も寿...
//
// > 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()関...
デフォルトでは名詞と動詞,形容詞のみを抽出するが,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...
## あるいは data.tar.gz 内の RMeCab.R をご覧ください
> ## 行名のタームと列名のタームが共起した回数
> ## 対称行列である
> res <- docMatrix("doc", pos = c("名詞","形容詞","助詞"...
> 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("名詞","形容詞","助詞"...
> 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 のカ...
引数で指定されたファイルについて,N-gram を計る.引数 typ...
> 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% 演算子を利用す...
* &size(20){&color(blue){docNgram()関数, docNgram2()関数}...
Ngram()関数を適用し,その結果を行にテキスト名,列に Ngram...
* &size(20){&color(blue){NgramDF() 関数, NgramDF2() 関数}...
> 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()関数}; }; : コロケ...
指定されたファイルについて,node で指定された語(ただし形...
> (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() 関数};}; : colloc...
//出力未確認です.検証した上で出力も調整し,近日中に再ア...
芥川「蜘蛛の糸」
> target <- "c:/data/kumo.txt"
# 「極楽」と前後3語の共起語を探す
> kekka <- collocate(file = target, node = "極楽", span ...
collocate()関数の結果にノード語である「極楽」を指定して,...
//,対数尤度比 (G2) を求める
> collScores(kekka,"極楽")
# こんな結果 (一部)
Term Span Total Tscore Mutual ...
26 様 2 7 1.38668 11.2976 5...
27 蓮池 4 4 1.98887 11.4902 27.4...
28 蜘蛛 2 14 1.35915 12.2976 2....
29 行く 1 4 0.97775 9.4902 2...
30 釈迦 2 7 1.38668 11.2976 5...
31 間 1 3 0.98331 9.0752 ...
# R-2.8.0 をMacOSXやLinuxでご利用の場合は
# 以下を実行しないと動作しないかもしれません
# R-2.7 や R-2.8.1 では必要ありません
# Encoding(kekka$Term) <- "UTF-8"
* &size(20){&color(blue){rmSign() 関数};}; : MeCabの出力...
* &size(20){&color(blue){docMatrixDF() 関数};}; : データ...
なお引数 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...
## ただし,共起行列は巨大になり,
## パソコンのスペックによっては
## 途中で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() 関数};}; : データ...
なお引数 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 ...
Row2 0 0 ...
Row3 0 0 ...
Row4 0 0 ...
Row5 0 0 ...
Row6 0 0 ...
Row7 0 0 ...
Row8 0 0 ...
Row9 0 0 ...
Row10 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 ...
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日追加...
2009 年 3月 5日 新規追加 実験中
『Rによるテキストマイニング入門』森北書店には記載がありま...
第 1 引数で指定されたファイル (フォルダが指定された場合は...
//target, column = 0, type = 0, pos = c("名詞","形容詞"),...
-- target : 引数はファイル名ないしフォルダ名,あるいはデー...
-- column : はデータフレームを指定する場合,列(番号ある...
-- type : 0 は文字のGramを 1はタームのGramを作成.デフォ...
-- pos : 引数は pos = c("名詞", "形容詞","記号") のように...
-- minFreq : 引数には全ファイルを通じての合計頻度の閾値...
//が,docMatrix() 関数の場合とは異なり,全テキストを通じ...
-- N: は Ngram の場合の N の数.デフォルトは1
//-- sym: 未実装.
//引数は,抽出タームに句読点なので記号を含めるかを指定す...
//-- kigo = "記号": は総計に記号を含むか含まないか.sym =...
-- Genkei:活用語を原型 (0) にするか,表層形(1) にするか...
-- weight = "tf*idf*norm" などの重みを指定可能.デフォル...
-- nDF : N個のタームそれぞれを独立した列に取る.デフォル...
-- co :共起行列の作成
--- ただし,共起行列は巨大になり,パソコンのスペックによ...
> 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 = ...
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...
1 くれる-よ 動詞-助詞 非自立-終助詞 1 0 0...
2 て-くださる 助詞-動詞 接続助詞-非自立 0 1 0...
3 て-くれる 助詞-動詞 接続助詞-非自立 1 0 0...
4 て-っす 助詞-助動詞 接続助詞-* 0 0 0...
5 て-ね 助詞-助詞 接続助詞-終助詞 0 0 1...
6 とる-て 動詞-助詞 自立-接続助詞 1 1 1...
7 写真-とる 名詞-動詞 一般-自立 1 1 1...
タームのバイグラム.活用語は表層型で
> (res <- docDF(target, col = 3, type = 1, N = 2, Genkei...
number of extracted terms = 7
now making a data frame. wait a while!
TERM POS1 POS2 Row1 Row2 Row3...
1 くれ-よ 動詞-助詞 非自立-終助詞 1 0 0...
2 て-ください 助詞-動詞 接続助詞-非自立 0 1 0...
3 て-くれ 助詞-動詞 接続助詞-非自立 1 0 0...
4 て-っす 助詞-助動詞 接続助詞-* 0 0 0...
5 て-ね 助詞-助詞 接続助詞-終助詞 0 0 1...
6 とっ-て 動詞-助詞 自立-接続助詞 1 1 1...
7 写真-とっ 名詞-動詞 一般-自立 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...
1 学ん い 動詞-動詞 自立-非自立 0 0 ...
2 彼女 数学 名詞-名詞 代名詞-一般 0 1 ...
3 数学 学ん 名詞-動詞 一般-自立 0 0 ...
4 数学 学生 名詞-名詞 一般-一般 0 1 ...
5 私 学生 名詞-名詞 代名詞-一般 1 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でサイズの大きいテキストを解析するには限界が...
応急的には、ファイルを分割して、別々に解析し、その結果を...
> # 二つの頻度データフレーム
> X <- data.frame(TERM = c("春","秋","冬","自然","数学")...
> X
TERM DOC1 DOC2
1 春 1 101
2 秋 2 102
3 冬 3 103
4 自然 4 104
5 数学 5 105
> Y <- data.frame(TERM = c("秋","春","科学","冬","温暖")...
> 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) %.% summa...
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
* 青空文庫からファイルをダウンロードして解凍、ルビ取り、...
青空文庫で公開されている圧縮zipファイルのダウンロードリン...
ダウンロードして解凍、ルビなどのメタ情報を削除します。処...
作成されたNORUBYフォルダに保存されます。なお、MacやLinux...
第二引数に処理後のファイル名を指定することもできます。
実行例 太宰治 『走れメロス』http://www.aozora.gr.jp/cards...
source ("Aozora.R")
Aozora ("http://www.aozora.gr.jp/cards/000035/files/1567...
#' @param url txtname
#'
Aozora <- function(url = NULL, txtname = NULL){
enc <- switch(.Platform$pkgType, "win.binary" = "CP932...
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(...
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\U...
reg3 <- enc2native ("\UFF3B\UFF03\U005B\U005E\UFF3D\U...
reg4 <- enc2native ("\U300A\U005B\U005E\U300B\U005D\U...
reg5 <- enc2native ("\UFF5C")
while (length(input <- readLines(con, n=1, encoding =...
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);
}
}
ページ名: