索引語の重要度の指標TDVの定義って…
現在「情報検索と言語処理」を読んでます.(図書館で借りたせいで第2刷だからだいぶ古い…)
2.2節 索引付け で索引語の識別値(term discrimination value)という,索引語としての重要度を表す指標が紹介されていました.
新しく増刷されているものでは訂正されているかもしれませんが,次のように定義されています.
δ(+t)は索引語tを含めた場合,δ(-t)は除いた場合の平均文書間類似度で,文書集合中の総文書数をNとすると次のように表されます.
\[\delta = \frac{1}{N(N-1)}\sum_{i=1}^N\sum_{j=1(i \ne j)}^N \sigma(d_i,d_j)\]ここで,\(\sigma(d_i,d_j)\)は文書iと文書jの類似度です.類似度にはコサイン類似度などがあります.
っで,ここまではよかったのですが,次の部分を読んでずいぶん悩むことになります.
識別値が大きい索引語は,それを導入することによって文書間の平均類似度が下がるので索引語としてはふさわしいといえる.一方,識別値の小さい索引語は,それを導入すると文書間の平均類似度が上がる,すなわち,文書を区別しにくくなるので索引語としてはふさわしくないことになる.
ここに明らかな矛盾があります.
識別値(負の値もとり得る)が大きい索引語はそれを導入することで平均類似度が下がる → \(\delta(+t) < \delta(-t)\) つまり\(dv_t < 0\)
識別値の小さい索引語はそれを導入することで平均類似度が上がる → \(\delta(+t) > \delta(-t)\) つまり\(dv_t > 0\)
識別値の定義式が正しければ,前者よりも後者の方が大きな値になることは明らかです.
じゃあ識別値は小さいほうが索引語として重要なのか?
識別値と呼ぶからには,値の大きな索引語の方が重要でありそう…
そこでちょっとWikipediaで調べてみると,識別値の定義式は同じで
A higher value is better because including the keyword will result in better information retrieval.
because以下の部分の理由をちゃんと説明してほしい気はしますが,識別値はとりあえず高い方が良いらしい.でも同じく矛盾が…
直観的に,全文書に同程度出てくる単語は索引語として不適切であり,しかも文書間の平均類似度を上げることになりそうです.
あれこれ悩んでるのも時間の無駄だったので検証してみました.
library(RMeCab)
# calculate the mean similarity
calMS <- function(d) {
delta <- 0 # mean simirarity
N <- ncol(d) # number of documents
for(i in 1:N)
delta <- delta + sum(colSums(d[, i] * d[, -i]) / sqrt(sum(d[, i]^2) * colSums(d[, -i]^2)))
delta / (N * (N - 1))
}
d <- docMatrix("data/yomi/")
d <- d[rownames(d) != "[[TOTAL-TOKENS]]" & rownames(d) != "[[LESS-THAN-1]]",]
delta1 <- calMS(d)
# 全文書に5回出現する単語のTDV
delta2 <- calMS(rbind(d, rep(5, ncol(d))))
cat("term disrimination value is", delta2 - delta1, "\n")
# eco-*.txtに5回出現する単語のTDV
delta2 <- calMS(rbind(d, ifelse(substr(colnames(d), 1, 3) == "eco", 5, 0)))
cat("term disrimination value is", delta2 - delta1, "\n")
dataはRMeCabで配布されている試用データで,data/yomiは読売新聞の短い記事ですかね?
echo-.txt, int-.txt, pol-.txt, reg-.txt, sci-.txt, soc-.txt, spt-.txt
といった文書が合計42個用意されています.
上記スクリプトでは,それらの記事から単語文書行列を作成し(RMeCabを使うとこんなに簡単!),全文書に5回出現する擬似的な単語に対する索引語識別値とeco-.txtだけに5回出現する擬似的な単語に対する索引語識別値を算出しています.
結果は
term disrimination value is 0.0748942
term disrimination value is -0.0006500202
つまり前者の識別値の方が高く,後者の識別値の方が低いわけです.
じゃあ識別値はやっぱり低い方が良いのか?
でもやっぱり”識別値”という名前からして高い方が良さそうなので,もうちょっと調べてみました.
そこでようやくわかったこと.
識別値の定義式が間違ってる!!
「情報検索と言語処理」の書き方に従うと
\[dv_t = \delta(-t) - \delta(+t)\]みたいです.
cf. Fazli Can, Esen A. Ozkarahan. Computation of term/document discrimination values by use of the cover coefficient concept. Journal of the American Society for Information Science, Vol. 38, No. 3, pp 171-183, 1987.
なんてこったい…
無駄な時間を過ごした感じです…