概要
前回、世界観設定別に日本語小説を分類するRコードを書いたが、
機械がどのような基準でそれらを分類しているかは説明しづらい。
決定木では、少ない変数(未集約)で分類するモデルを作るので、それが説明しやすい。
試してみる。
処理
前回の処理と同じ。
ただし、Rコードの中身は下記のものに変更する。
又、用意する文書は訓練データ(train)だけで良い。
NEZUQ_差分ワード抽出器.R
#NEZUQ_差分ワード抽出器.R
#Copyright (c) 2014 nezuq
#This software is released under the MIT License.
#http://opensource.org/licenses/mit-license.php
library(RMeCab)
library(mvpart)
#基盤フォルダ
path <- "."
#訓練データフォルダ
path.train <- paste(path,"train",sep="/")
#結果フォルダ
path.result <- paste(path,format(Sys.time(), "%y%m%d%H%M%S"),sep="/")
dir.create(path.result)
#途中データ格納用フォルダ
path.input <- paste(path.result,"input",sep="/")
dir.create(path.input)
#分類済みデータ格納用フォルダ
path.output <- paste(path.result,"output",sep="/")
dir.create(path.output)
#ファイル名分割記号
sep <- "_"
#訓練データファイルを一時フォルダに移動
gather.files <- function(from, to, prefix="", sep="_"){
for(fname in dir(from, recursive=T)){
fname.full <- paste(from, fname, sep = "/")
fname.to <- gsub("/", sep, fname)
#接頭辞指定の場合は、ファイル名に付与
if (0 < nchar(prefix)) {fname.to <- paste(prefix, fname.to, sep = sep)}
fname.to.full <- paste(to, fname.to, sep = "/")
file.copy(fname.full,fname.to.full)
}
}
gather.files(path.train, path.input, sep = sep)
#単語別頻度表を作成
d.origin <- t(docMatrix2(path.input, pos = c("名詞"), weight = "norm"))
#記号が含まれる単語頻度列を削除したデータフレームに変換
ptn.rmv <- "^([a-zA-Z0-9。-゚ぁ-んァ-ヶー一-龠])+$"
d <- as.data.frame(d.origin[,regexpr(ptn.rmv,colnames(d.origin)) > -1])
#列名に接頭辞を付与 ※列名が数値だと他パッケージの関数でエラーを起こす。
colnames(d) <- paste("d.", colnames(d), sep = "")
#訓練データを取得
d.info <- do.call(rbind, strsplit(rownames(d), sep))
d["s.tag"] <- factor(d.info[, 1])
#モデルを作成
d.rp <- rpart(s.tag~., data = d)
#モデルを文字表示
d.rp
#途中データフォルダを削除
#file.remove(dir(path.input,full.names=T))
#file.remove(path.input)
出力イメージ
コンソールの最後に文字で表示される。
n= 16
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 16 8 現在設定 (0.5000000 0.5000000)
2) d.高校< 0.002960446 8 0 現在設定 (1.0000000 0.0000000) *
3) d.高校>=0.002960446 8 0 未来設定 (0.0000000 1.0000000) *
感想
現在設定(高校生設定)か未来設定(社会人設定)かの分類を試したので「ですよねー」が感想。
キーワード「高校」が出現する頻度を使えば分類できる事が分かった。