tf-idfについてざっくりまとめ_理論編

概要

こんにちは、yoshimです。

当エントリは「Machine Learning Advent Calendar 2017」の4日目のエントリです。

今回は「文書の特徴」を表現するために「文書に含まれる単語の重要度」を考慮する概念である「tf-idf」を紹介します。

目次

tf-idfとは

tf-idfとは、tfという概念とidfという概念を組み合わせたものなのですが、 大雑把に言いますとレアな単語が何回も出てくるようなら、文書を分類する際にその単語の重要度を上げるというものです。 なので、まずtfという概念について説明したのち、idfという概念について説明しようと思います。

「tf」は(Term Frequency)の略です。 直訳すると「単語の出現頻度」で、「各文書においてその単語がどのくらい出現したのか」を意味します。 (よく出現する単語は、その文書の特徴を判別するのに有用!) \[ tf = \frac{文書Aにおける単語Xの出現頻度}{文書Aにおける全単語の出現頻度の和} \]

「idf」は(Inverse Document Frequency)の略です。 これは「逆文書頻度」と呼ばれており、単語が「レア」なら高い値を、「色々な文書によく出現する単語」なら低い値を示すものです。 (レアな単語は、その文書の特徴を判別するのに有用!) \[ idf = log(\frac{全文書数}{単語Xを含む文書数}) \] (logを使っているのは、文書数の規模に応じた変動影響を緩和するためです。) (右辺に1を足す場合もあります。これはidfが0にならないようにするためです)

ここまでをまとめますと「tf」、「idf」の意味については下記のようだと解釈できます。 tf:その文書においてどの単語がどれくらい出現したのか idf:各単語のレア度を示す 「tf-idf」はこの2つの概念を組み合わせたものです。つまり、 \[ tfidf = tf * idf \] と表現できます。 (本来なtf-idfと表記するべきところを、markdownでハイフンを記述すると引き算と判別されてしまい誤解を生みかねないので、ここではtfidfと表記します) これを上記の説明を使うと、 $$ tfidf = (単語の出現頻度) * (各単語のレア度)$$ という解釈ができます。 これは「その単語がよく出現するほど」、「その単語がレアなほど」大きい値を示すものになります。 この計算を「各文書の各単語ごと」に行うことで、文書の特徴を判別しやすくするんですね。

どう使うか

ナイーブベイズでは「各クラスにおける各単語の出現確率」を利用していましたが、この値を「tf-idf」で計算した値に置き換えることで、文書に含まれる単語の重要度から文書の特徴を判別することができます。 また、各文書・各単語の「tf-idf」を計算したものを​要素として持った行列として扱うことで、文書間の類似度を計算することができるので、文書検索などに利用されます。 この「文書間の類似度」を計算する方法は色々あるのですが、「コサイン類似度」が一番の有名どころでしょうか。 コサイン類似度の計算式は下記の通りです。 $$cos(x, y) = \frac{(x, y)}{\sqrt|x|^2 * \sqrt|y|^2}$$ ここではコサイン類似度についての説明は省きますが、大まかにいうと「各文書ごとにベクトル形式でデータをもった状態で内積を計算し正規化することで各文書の類似度を測る」​​ というものです。

まとめ

今回は「文書の特徴」を表現するために「文書に含まれる単語の重要度」を考慮する概念であるtf-idfについて紹介しました。 tf-idfは分析手法ではなく、どちらかと言うと前処理の仲間なので、tf-idfを知っているだけで何かができるという訳ではないのですが、 文書分類をする上では必須となる知識なので、しっかりと理解しておきたいですね。

 

明日は実際に「tf-idf」をPythonで計算してみようと思います。