LoginSignup
7
6

More than 5 years have passed since last update.

Rで決定木。日本語小説を世界観設定別に切り分けるキーワードを探る。

Last updated at Posted at 2014-04-27

概要

前回、世界観設定別に日本語小説を分類する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) *

感想

現在設定(高校生設定)か未来設定(社会人設定)かの分類を試したので「ですよねー」が感想。
キーワード「高校」が出現する頻度を使えば分類できる事が分かった。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6