最近RMeCabを使用して分析を実施したので、そのときの私的メモです。
参考となる資料
RMeCabを使う際には、以下の資料を手元においてやってます:
- Rによるテキストマイニング入門
- Rで学ぶ日本語テキストマイニング
- R言語逆引きハンドブック(リンクは改訂2版ですが参照したのは1版です)
あと、石田基広先生のサイトにインストールから解説など説明があります。
私が使用した環境についてはこの辺に描いてます。
RMeCabの関数群に引き渡すテキストの形式について
RMeCabパッケージにはいろいろな関数がありますが、引数としてテキストを指定するときの形式に注意が必要です。
形態素解析を実施するだけならば、対応する関数を使えば問題ありませんが、N-gramを作成する場合やCollocationを抽出するときは、テキストファイルからの読み込みにしか対応していません。もし解析したいテキストデータがデータフレーム内のベクトル(列)に格納してある状態から分析しようとすると、一度テキストファイルに落とし込む必要があります。
Collocationの場合の対処
Collocationを抽出する関数としてCollocate関数があります。この関数は単一のテキストファイルのみを受け付けます。したがってデータフレーム内のベクトルをとにかく単一のテキストファイルへ落とし込む必要があります。普通にテキストファイルを準備して読み込ませてもいいのですが、正直なところ面倒です。またこのファイルは今後おそらくは用途がないので不要となります。
こういう時は、Rで一時ファイルを準備して利用するとスマートです。具体的には以下のようなコードになります:
# 以下、データフレームをx, x内のテキストデータがある変数名をtextとします
# dummyというベクトルにテキストデータを格納
dummy <- as.vector(as.charactor(x$text))
# 添付ファイルを作成し、tfオブジェクトへ
tf <- tempfile("tmp")
# 一時ファイルへdummyの内容を書き込み
write(dummy, file = tf, sep = "\n")
# コロケーションを抽出
coll <- collocate(tf, node = "ビール", span = 5)
coll2 <- collScores(coll, node = "ビール", span = 5)
# 一時ファイルは不要になったので明示的に削除
unlink(tf)
以上で、coll2オブジェクトにコロケーションの結果が格納されます。私が先日やったときは一気にやってもらうように関数化しました。dplyrパッケージの%.%を使ったので説明省略します。
N-gramの場合の対処
N-gramを作成する関数としてdocNgram()やdocNgram2()があります。またdocDF()関数でNに2以上を指定するとN-gramを作成してくれます。これらは引数としてテキストファイルが入っているディレクトリもしくはファイルパスで指定します。基本ディレクトリを指定すると思ってて問題ないです。この場合問題になるのは「テキストデータの各要素をテキストファイルとして1つずつ準備すること」となります。2つ3つくらいの文章なら大したことないのですが、数十件以上となると泣きます。号泣します。
こういう時は、Rで一時ディレクトリを準備し、ループ処理で一時ファイルでテキストファイルを作成します。具体的には以下のようなコードになります:
# 以下、データフレームをx, x内のテキストデータがある変数名をtextとします
# 一時フォルダ作成
td <- tempfile("myTemp")
dir.create(td) #これで一時フォルダできたはず
# 一時フォルダ内にテキストデータのファイル作成
for (i in 1:nrow(x)){
write(as.character(x[i,x$text]),file = paste(td,i,sep="/"))
}
# 以下N-gramを作成する関数を実行
bigram <- docDF(td, type = 1, N = 2, pos = c("名詞","形容詞"), minFreq=1, weight="tf*idf*norm")
# 明示的に一時ファイル・ディレクトリを削除
unlink(td, recursive=TRUE)
これでbigramというオブジェクトにN-gramが作成されます。N-gramの関数に関することは適宜調べてください。一時ファイルや一時ディレクトリについては、R言語逆引きハンドブックに説明がありますのでそちらをご参照ください。
全角英数字について
これはMeCabあるいは私が使用した辞書(IPA辞書)の問題な気がしますが、全角の英数字は一文字ずつ形態素に分けられてしまうようです。私の場合これでは都合が悪いので半角に統一させました。chartr()関数を使って置換しました。正規表現便利ですね。
メモリの使用について
噂には聞いていましたが、思いっきりメモリを消費します。笑えるほどに。テキストの量が非常に多いと危険です。コードを実行する前にはスクリプトを保存してから実行するようにしました。あと、minFreqにも配慮した方がいいでしょう。なお私は設定ミスなどもあったのでRStudioで爆弾を4回くらい出しましたw
rmSign関数について
形態素解析した結果から"記号"の品詞を除去するrmSign()関数がかつてRMeCabパッケージには組み込まれていたのですが、石田先生のサイトでは削除されたとあります。でも新しいバージョンでは復活しているみたいです。詳細はパッケージのヘルプをご覧ください。
以上、未来の自分へのメモ書きでした。