TF-IDF指標とカルバック・ライブラ情報量
はしがき
Akiko Aizawa (2003), An information-theoretic perspective of tf–idf measures, Information Processing & Management,
(39) 1, https://doi.org/10.1016/S0306-4573(02)00021-3
(の一部)を読んだメモです.ただし表記などは私の好みに合わせて変えてあります.自然言語処理などで使うTF-IDF指標がKLダイバージェンスの各項から出てくることなどが書かれています.
本文
2つの分布
この
さて,
この記号の下で,文書,単語をランダムに(つまり独立同分布で)選ぶとして,
である.
最尤推定量を期待相互情報量 (1) の各項にプラグインすると,
となる.右辺は TF-IDF(term frequency-inverse document frequency)と呼ばれ,文書ごとの特徴的な単語を抜き出す指標などとして用いられる.
以下は私見だが,この程度に抽象化しておくとちょっとした応用・変更が気軽にできる場合がある.例えば…
- ゼロ除算を避けるために IDF の分子分母に小さい数(1 など)を足すことは,最尤法でなく MAP 法を使うことに相当する
- 文書ごとでなく適当なクラスタリングで得られたクラスタごとにTF-IDF指標を求めることは,矛盾なくできる
最後に R による計算例を載せておく.
計算例
Text Mining with R の 3 章 を参考にして, janeaustenr のデータから TF-IDF 指標を計算してみる.ジェイン・オースティンの著作ごとに特徴的な単語を選ぶ.
library(janeaustenr)
library(tidytext)
library(dplyr)
library(ggplot2)
#頻度fの集計
book_words <- austen_books() %>%
unnest_tokens(word, text) %>%
count(book, word, sort = TRUE) %>%
group_by(book) %>%
mutate(total = sum(n)) %>%
ungroup() %>%
bind_tf_idf(term = word, document = book, n = n) %>%
arrange(desc(tf_idf))
#定義通りTF-IDFを求める
book_tf_idf = mutate(book_words, tf2 = n/total) %>%
group_by(word) %>%
mutate(idf2 = -log(n_distinct(book))) %>%
ungroup() %>%
mutate(idf2 = idf2 + log(n_distinct(book))) %>%
mutate(tf_idf2 = idf2*tf2)
## tidytext パッケージの計算結果と一致することを確認
ggplot(book_tf_idf, aes(tf_idf2 , tf_idf))+
geom_abline(slope = 1, intercept = 0, linetype=2)+
geom_point(alpha=0.2)+
theme_classic(14)
#大きい方から上位10個抜き出し
book_top <- book_tf_idf %>%
group_by(book) %>%
slice_max(tf_idf, n = 10) %>%
ungroup()
#プロット
ggplot(book_top, aes(x = tf_idf, y = reorder_within(word, tf_idf, book))) +
geom_col() +
facet_wrap(~book, ncol = 2, scales = "free") +
scale_y_reordered()+
labs(x = "TF-IDF", y ="word") +
theme_classic(14)

おしまい.
Discussion