# MeCab の実行確認 library(RMeCab) txt <- "「田舎の祖父母の家」のような懐かしさが感じられた。" res <- RMeCabC(txt) unlist(res)
####### Start of function #############
mkmat <- function(wg){ # 0 - 1 行列を作成する関数の定義
n <- length(wg) # ベクトルの長さ(画像数)
maxg <- max(wg) # グループ最大値
ming <- min(wg) # グループ最小値(普通は1)
if(!ming){ # 最小値が 0 のときの処置
ming <- 1; maxg <- maxg+1; wg <- wg+1 # グループ数を 1 つ増やす
} #
gmat <- matrix(0, nrow=n, ncol=maxg) # n × maxg 行列(値は 0)
for(i in ming:maxg){ # グループごとの処理
ng <- (1:n)[wg == i] # グループ i に所属する行番号(画像番号)
gmat[ng, i] <- 1 # 上の行番号と i 列の値を 1 にする
} #
return(gmat) #
} #
######## End of function ##############
# グルーピングデータの読み込み
pg <- read.csv("pansygr.csv", header=TRUE, row.names=1); pg
n <- ncol(pg) # パンジーの数
S <- matrix(0, nrow=n, ncol=n) # 類似度行列の定義
for(i in 1:nrow(pg)){ #
w <- mkmat(pg[i, ]) # 学生ごとのグルーピング行列
S <- S + w %*% t(w) # 学生ごとの類似度行列を加える
}
rownames(S) <- colnames(S) <- colnames(pg)
D <- max(S) - S # 非類似度行列への変換
####
tcmd <- cmdscale(D, k=4, eig=TRUE, add=TRUE) # 多次元尺度法(MDS)
tcmd$eig[1:5] # MDS の固有値
panmds <- tcmd$points # MDS の座標を panmads に格納
colnames(panmds) <- paste("MDS", 1:4, sep="")
plot(panmds[,1:2], type="n") # 1軸と2軸
text(panmds[,1:2], rownames(panmds), cex=0.8)
title(main="MDS of pansy flowers")
#
pclus <- hclust(as.dist(D), method="ward.D")
#pclus <- hclust(dist(D))
plot(pclus, cex=0.6, main="パンジーの類似度によるクラスター")
#
# 好きなパンジー、嫌いなパンジー
likeall <- read.csv("likeall.csv", header=T, row.names=1)
dim(likeall)
n <- ncol(likeall); m <- nrow(likeall)
like.no <- matrix(0, nrow=m, ncol=n)
dislike.no <- matrix(0, nrow=m, ncol=n)
colnames(like.no) <- colnames(dislike.no) <- colnames(likeall)
rownames(like.no) <- rownames(likeall)
rownames(dislike.no) <- paste(rownames(likeall), "d", sep="")
for(i in 1:m){
v1 <- which(likeall[i,]==1)
like.no[i,v1] <- 1
v2 <- which(likeall[i,]==2)
dislike.no[i,v2] <- 1
}
stl <- which(apply(like.no,1,sum) > 0)
std <- which(apply(dislike.no,1,sum) > 0)
length(stl) # 213
length(std) # 207
length(which(stl %in% std)) # 207
#
like.no <- like.no[std,]
dislike.no <- dislike.no[std,]
m <- nrow(like.no)
#
# 好まれたパンジー
like.pansy <- apply(like.no, 2, sum)
opl <- order(like.pansy, decreasing=T)
like.pansy[opl[1:10]]
# 同様にして好まれていないパンジーもわかる
dislike.pansy <- apply(dislike.no, 2, sum)
#
barplot(like.pansy, col="red")
barplot(rbind(like.pansy, dislike.pansy), width=0.2,beside=T, col=c("red","blue"))
ld.pansy <- like.pansy-dislike.pansy
barplot(ld.pansy)
res <- lm(ld.pansy ~ panmds[,1:4])
summary(res)
#
#
likeall <- rbind(like.no, dislike.no)
pno <- which(apply(likeall,2,sum) > 0)
library(MASS)
stres <- corresp(likeall[,pno], nf=4)
stres$cor
#
biplot(stres, cex=0.7)
com <- c(1,4)
#obj <- stres$rscore[,com]
obj <- stres$cscore[,com]
plot(obj, type="n", xlab="Corresp1", ylab="Corresp2")
text(obj, rownames(obj), cex=0.7)
title(main="パンジーの配置")
#
plot(stres$rscore[,com], type="n", xlab="Corresp1", ylab="Corresp2")
l1 <- stres$rscore[1:m,com[1]]
l2 <- stres$rscore[1:m,com[2]]
d1 <- stres$rscore[(m+1):(2*m),com[1]]
d2 <- stres$rscore[(m+1):(2*m),com[2]]
arrows(d1, d2, l1, l2, col="lightgreen", length=0.15)
text(stres$rscore[(m+1):(2*m),com], rownames(stres$rscore)[(m+1):(2*m)], col="blue", cex=0.8)
text(stres$rscore[1:m,com], rownames(stres$rscore)[1:m], col="red", cex=0.8)
legend(-1.7,-2, legend=c("好き","嫌い"), pch=c("l","d"), col=c("red","blue"))
title(main="人の嫌い―>好きベクトル")
#
#
# 対応分析の好き座標と嫌い座標から人の間の距離を計算
like.cp <- stres$rscore[1:m,1:2]
dislike.cp <- stres$rscore[(m+1):(2*m),1:2]
like.dist <- dist(like.cp)
dislike.dist <- dist(dislike.cp)
cp.dist <- like.dist + dislike.dist
#sclus <- hclust(cp.dist)
sclus <- hclust(cp.dist, method="ward.D")
plot(sclus, cex=0.6, main="好みのクラスター分析")
sclass <- rect.hclust(sclus, h=20)
sgroup <- rep(0, nrow(like.no))
for(i in 1:length(sclass))
sgroup[sclass[[i]]] <- i
#
stcmd <- cmdscale(cp.dist, k=4, eig=TRUE, add=TRUE)
stcmd$eig[1:5] # MDS の固有値
stmds <- stcmd$points # MDS の座標を panmads に格納
colnames(stmds) <- paste("MDS", 1:4, sep="")
plot(stmds[,1:2], type="n") # 1軸と2軸
text(stmds[,1:2], rownames(stmds), col=rainbow(length(sclass))[sgroup], cex=0.8)
legend(6,-4, legend=paste("G",1:length(sclass),sep=""), pch=as.character(1:length(sclass)), col=rainbow(length(sclass)))
title(main="人のMDS、クラスターで色づけ")
#

パンジーの類似度から上のクラスター分析(ward 法)により並べ替えたもの。左の数字は、好きの人数。 右の数字は嫌いの人数。
人の好みの対応分析
![]() |
![]() |
人の好みのクラスター


pansy <- read.csv("commentall.csv", header=T, row.names=1)
library(RMeCab)
meishi <- docMatrixDF(pansy[,"like"], pos="名詞")
keiyo <- docMatrixDF(pansy[,"like"], pos="形容詞")
doshi <- docMatrixDF(pansy[,"like"], pos="動詞")
like <- rbind(meishi, keiyo, doshi)
colnames(like) <- rownames(pansy)
rownames(like)
dim(like)
#
meishi <- docMatrixDF(pansy[,"dislike"], pos="名詞")
keiyo <- docMatrixDF(pansy[,"dislike"], pos="形容詞")
doshi <- docMatrixDF(pansy[,"dislike"], pos="動詞")
dislike <- rbind(meishi, keiyo, doshi)
colnames(dislike) <- rownames(pansy)
rownames(dislike)
dim(dislike)
#
#write.csv(like, file="like.csv")
#write.csv(dislike, file="dislike.csv")
# MeCab インストール失敗した人
like <- read.csv("like.csv", row.names=1, header=T)
dislike <- read.csv("dislike.csv", row.names=1, header=T)
# 同義語をまとめる
dogi <- vector("list",17)
dogi[[1]] <- c("紫","紫色")
dogi[[2]] <- c("青", "青色")
dogi[[3]] <- c("きれい","キレイ","綺麗")
dogi[[4]] <- c("さわやか","さわやかさ")
dogi[[5]] <- c("組合せ", "組み合わせ")
dogi[[6]] <- c("グラデーション", "グラーデーション", "グラデ")
dogi[[7]] <- c("赤", "レッド")
dogi[[8]] <- c("花", "はな")
dogi[[9]] <- c("花びら", "花弁")
dogi[[10]] <- c("好き", "すき")
dogi[[11]] <- c("良い", "よい", "いい")
dogi[[12]] <- c("かわいい", "可愛らしい")
dogi[[13]] <- c("落ち着く", "落ちつく")
dogi[[14]] <- c("不揃い", "不ぞろい")
dogi[[15]] <- c("黒", "黒色")
dogi[[16]] <- c("黄", "黄色")
dogi[[17]] <- c("汚い", "汚らしい")
#
####### Start of function ############
delsynonym <- function(text0){
text1 <- text0
drop <- NULL
for(j in 1:length(dogi)){
m1 <- which(rownames(text0)==dogi[[j]][1])
if(length(m1)>0){
m2 <- numeric(0)
for(k in 2:length(dogi[[j]])){
w <- which(rownames(text0)==dogi[[j]][k])
if(length(w)>0){
m2 <- c(m2, w)
text1[m1,] <- text1[m1,]+text0[m2[k-1],]
}
}
}
if(length(m2)>0)
drop <- c(drop,m2)
}
text1[-drop,]
}
######## End of function ##############
like <- delsynonym(like)
dislike <- delsynonym(dislike)
#
# ストップワードの設定
stopwords <- c(
"いる", "もの", ",", "する", "思う", "的", "よう", "番", "ある", "の", "なる",
"さ", "ため", "ない", "られる", "これら", "・", "方", "しまう","れる",".","そう",
"私","自分"
)
#
# ストップワード削除
sw <- which(rownames(like) %in% stopwords)
like <- like[-sw,]
sw <- which(rownames(dislike) %in% stopwords)
dislike <- dislike[-sw,]
dim(like); dim(dislike)
#
# 頻出単語抽出
like.word <- apply(like,1,sum)
ol <- order(like.word, decreasing=T)
like.word[ol[1:50]]
dislike.word <- apply(dislike,1,sum)
od <- order(dislike.word, decreasing=T)
dislike.word[od[1:50]]
#