📖

TF-IDFの理論的な意味付けについて

2022/05/19に公開

はじめに

TF-IDFは文章の特徴語を抽出するときに使われる関数だが、今までほとんどヒューリスティックだと思われていた。今回は、TF-IDFが既存の概念でいうと何に相当するかを考察したい。

既存研究

TF-IDFの理論的な意味付けでは調べると2000年に論文が出ていて、確率と情報量の積として考察している。調べた範囲ではTF-IDFを一つの概念として考察している論文等は見当たらなかった。

定義

D を文章集合、W を文章集合で使われている単語集合とすると、w ∈ W, d ∈ D について、d 内の w の割合を P(d,w)、D 内で w を含む文章の割合を Q(w) とすると、

TFIDF(d,w) := P(d,w) \log(1/Q(w))

である

既存の概念との関係

tf-idfは定義式を見る限りKL情報量(相互エントロピー)の式と似ていると気づく。KL情報量(相互エントロピー)とは、確率分布の差を表現する量で、

D_{KL}(P||Q) := \sum_x(P(x) \log(P(x)/Q(x)))

で定義される。
ここで、tf-idfの式の Q(w) が、R(w) := (文章集合全体で使われる w の割合) を用いて、

Q(w) \approx R(w) / P(d,w)

と表されるならば、TF-IDFは D_KL(P||R) つまり文章全体で使われる w の割合に対する、個別の文章に出現する単語 w の割合の分布の違いを表すKL情報量の近似になる。
この考察が妥当かどうか実験してみる。

実験

青空文庫の文章データセットを用いて、tf-idfの式の Q(w) と R(w) / P(d,w) の相関を調べた。all_elements を文章集合すべての単語の出現頻度のdictionary、idf_elementsを文章集合のidfからなるdictionary、text_file_listを空白文字で区切られたテキストからなるlist、indexを調べたい文章のindexとすると、相関係数とp値は以下で求めることができる。

def calcurate_pearsonr(all_elements, idf_elements, text_file_list, index):
  text_file = text_file_list[index].strip().split(" ")
  tf = collections.Counter(text_file)
  
  R_par_P = {}
  for word in tf:
    R_par_P[word] = all_elements[word] / tf[word]
  
  R_par_P_scores = []
  idf_scores = []
  for word in R_par_P:
    R_par_P_scores.append(R_par_P[word])
    idf_scores.append(idf_elements[word])
  
  if len(idf_scores) < 2:
    return None, None
  
  corr, p_value = pearsonr(idf_scores, R_par_P_scores)
  return corr, p_value

結果

文章100個の平均を求めると、相関係数は0.95で強い正の相関があり、p値は0.00で帰無仮説は棄却された。

まとめ

TF-IDFは文章全体の単語の出現分布に対する特定の文章に関する出現分布のKL情報量の近似であると言えることが確かめられた。

Discussion