RMeCabFunctions - アールメカブ

アールメカブ


RMeCabFunctions

RMeCab

詳細は filemanual081108.pdfと,追加関数の解説を加えた fileism091124doc.pdf を参照してください.簡単な紹介スライド filetokei2010prosper2.pdf

_ ユーザー辞書

すべての関数に,実行時にユーザー辞書を指定できるようにしました.ただし Mac や Linux ,Windows でMeCab? へのパス設定を行っている場合は,システム側でmecabrc ファイルを設定ください.この引数は,Windowsユーザーで環境設定が難しいと感じているユーザーのための仕様です.詳しくは, RMeCabをご覧ください. かならず mecab で正しくコンパイルした辞書ファイルを指定してください.

  1. テキスト59ページのユーザー辞書の作成方法は Windows を対象とした説明です.Mac および Linux では http://mecab.sourceforge.net/dic.html の説明に従ってください.一部を以下の引用いたします.
  1. 適当なディレクトリに移動 (例: /home/foo/bar)
  2. foo.csv という辞書ファイルを作成(例はテキスト58ページのishida.csv)
    基広,-1,-1,1000,名詞,固有名詞,人名,名,*,*,基広,モトヒロ,モトヒロ
  3. 辞書のコンパイル
         % /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: バイナリ辞書の文字コード 
  4. /home/foo/bar/foo.dic ができていることを確認
  5. 実行方法
    res <- RMeCabC("石田基広", dic = "/home/ishida/foo.dic")
    res
  1. RMeCab パッケージを利用するには以下のコードを画面の > の右に入力して、Enter を押して実行します. なお試用データセットを用意しました.

_ 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行を実行しないと動作しないかもしれません
# R-2.7 や R-2.8.1 では必要ありません
# kekka <- unlist(kekka)
# Encoding(kekka) <- "UTF-8"
# Encoding(names(kekka)) <- "UTF-8"

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

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

>  RMeCabText("data/sakura.txt")

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

なお、サイズの大きなファイルを処理する場合、直前にガベージコレクションを実行しておくと良いかも知れません。

gc();gc()# ガベージコレクションを実行

またRStudioでは、重い処理の途中で落ちてしまう可能性もあります。この場合は素のRを単独で起動して実行すると良いかもしれません。

_ 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()関数 : 通常はdocMatrix()を使ってください.文書ターム行列(および重み付け),あるいはターム共起頻度行列(2009年3月追加)を作成

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

_ 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)

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

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

_ docMatrixDF() 関数 : データフレームの指定列を対象にターム文書行列,あるいはターム共起頻度行列(2009年3月追加)を作成する.

なお引数 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

_ docNgramDF() 関数 : データフレームの指定列を対象にN-gram 文字行列 あるいは N-gram ターム・文書行列,あるいはターム共起頻度行列を作成する.

なお引数 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
> 

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

2009 年 3月 5日 新規追加 実験中 『Rによるテキストマイニング入門』森北書店には記載がありません. 第 1 引数で指定されたファイル (フォルダが指定された場合は,その中の全ファイル),あるいは第1引数でデータフレームを,また第 2 引数で列(番号あるいは名前)を指定して,Ngram行列,あるいはターム・文書行列を作成する.指定可能な引数は

  • target : 引数はファイル名ないしフォルダ名,あるいはデータフレーム
  • column : はデータフレームを指定する場合,列(番号あるいは名前)を指定する
  • type : 0 は文字のGramを 1はタームのGramを作成.デフォルトは0
  • pos : 引数は pos = c("名詞", "形容詞","記号") のように指定する.指定されない場合は記号を含め,すべてを抽出.
  • minFreq : 引数には全ファイルを通じての合計頻度の閾値を指定する.デフォルトは1.つまり,どれか一つのファイルに一度でも出現していれば,データフレームに登録する.対象文書の分量が多い場合は 3 などを指定することを検討ください.
  • N: は Ngram の場合の N の数.デフォルトは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

品詞細分類情報が POS2 列にあるので、*dplyr* の filter() とあわせて、必要なレコードをさらに絞り込むことができます。

res %>% filter(POS2 %in% c("一般", "自立"))

名詞と形容詞を対象にトライグラムで行列

> (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  ...
...

_ 文字列ベクトルをファイルに偽装する方法

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ファイルを削除

_ サイズの大きいテキストを解析する場合

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コード

青空文庫で公開されている圧縮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);
  }
}
 
添付ファイル: filetokei2010prosper2.pdf 15011件 [詳細] fileism091124doc.pdf 16313件 [詳細]
 
Link: RMeCab(669d) admin(1679d)
Last-modified: 2019-09-26 (木) 09:36:50 (1894d)