単語文書行列

いくつかの教科書について,その教科書に出てくる用語が与えられている。このデータから,ある用語がある教科書の中にあれば1,なければ0を要素とする「単語文書行列」(term-document matrix)を作って,売れ筋教科書の多くに含まれる用語が自社の教科書に欠けていないか確認するのに使いたい。

第1の教科書(文書)d[[1]] には hoge と fuga という用語(単語)が含まれる,等々を次のようにベクトルで表す:

d = list()
d[[1]] = c("hoge", "fuga")
d[[2]] = c("hoge", "geho")
d[[3]] = c("geho", "fuga")
d[[4]] = c("foo", "bar", "hoge")

これをデータフレームに変換する:

options(stringsAsFactors=FALSE)
m = list()
for (i in 1:4) {
    m[[i]] = data.frame(t=d[[i]], x=rep(1,length(d[[i]])))
    names(m[[i]]) = c("t", paste0("d",i))
}

これらのデータフレームを単にフルジョインすれば,目的の行列が得られる:

tdm = merge(m[[1]], m[[2]], all=TRUE)
for (i in 3:4) {
    tdm = merge(tdm, m[[i]], all=TRUE)
}
tdm[is.na(tdm)] = 0

結果は次のようになる:

tdm
     t d1 d2 d3 d4
1  bar  0  0  0  1
2  foo  0  0  0  1
3 fuga  1  0  1  0
4 geho  0  1  1  0
5 hoge  1  1  0  1