いろんなtf-idf

ちゃお……†

舞い降り……†

今回はtf-idfの話をしようと思います……†

tf-idfとは

tf-idfは、文書中の単語に関する重みの一種であり、主に情報検索や文章要約などの分野で利用される。 tf-idfは、tf(英: Term Frequency、単語の出現頻度)とidf(英: Inverse Document Frequency、逆文書頻度)の二つの指標にもとづいて計算される。 from tf-idf - Wikipedia

ということで、 tfidf = tf \bullet idf による単語の重み付けの方法です. 上記Wikipediaの記事ではオーソドックスな例が挙げられてますが, 実はいろいろな重み付けの方法があります.

tf

以下、文書中の語の頻度を  f_{ij} と記します.

2進重み (binary)

$$ \displaystyle tf = \begin{cases} 1 & (f_ij \gt 0) \\ 0 & (f_ij = 0) \end{cases} $$

単語が一度でもでてきたら1, 出てこなかったら0にする重み付け. ただし, これは単純すぎて出現頻度の高い語と低い語の差別化ができません. 検索質問文のように少数の語しか出てこない場合に使われるらしいです.

索引語頻度 (raw frequency)

$$ \displaystyle tf = f_{ij} $$

語の頻度をそのまま重みとして使う. これもわかりやすくて単純ですが, 出現頻度の高い語に過大な重みを与えてしまうという欠点があります.

対数化索引語頻度 (logarithmic term frequency)

{ \displaystyle
tf = \log(1 + f_{ij})
}

出現頻度の高い語の影響を小さくするために対数化した重み付け. 1を足してるのは, 頻度0のときに  log(0) にならないための対策だと思われます.

拡大正規化索引語頻度 (augmented normalized term frequency)

$$ \displaystyle tf = \begin{cases} 0.5 + 0.5 \frac{f_ij}{\max_k f_kj} & (f_ij \gt 0) \\ 0 & (f_ij = 0) \end{cases} $$

長い文書に対する影響を考慮して, 文書中で最も高い頻度の語  f_{kj} を用いて正規化する重み付け. 重みは  0.5 \leq tf \leq 1 になります.

idf

以下, 全文書数を n, 索引語を  w_i を含む文書数を n_iと記します.

重み付けなし

{ \displaystyle
idf = 1
}

文書頻度の逆数 (inverse document frequency)

{ \displaystyle
idf = \log \frac{n}{n_i}
}

一番オーソドックスなIDF. 対数化することでIDFの値の変化を小さくしています.

inverse document frequency smooth

{ \displaystyle
idf = \log (1 + \frac{n}{n_i})
}

1を足してスムージングしています.

inverse document frequency max

{ \displaystyle
idf = \log (1 + \frac{\max_{i' \in d} n_i'}{n_i})
}

確率的IDF (probabilistic inverse document frequency)

{ \displaystyle
idf = \log \frac{n - n_i}{n_i}
}

文書集合の半数以上の文書に含まれる語に対しては, 負の値の重みをつけます.

大域的頻度IDF (global frequency inverse document frequency)

{ \displaystyle
idf = \frac{F_i}{n_i}
}

文書集合全体を通しての索引語の頻度 (大域的頻度) と文書頻度とを組み合わせた重み付け. 上の式では, 索引語の大域的頻度を F_iで表しています.  n_i が小さく,  F_iが大きいときに大きな重みを与えます.

その他

他にはエントロピーを用いたものや, 単語分布モデルに基づいたものがあります. (今回は省略)

それで結局どれがいいの?

英Wikipediaのtf-idf記事でおすすめされているものがよさげです.

f:id:yukinoi:20161112230952p:plain

参考