TF-IDF で文書をベクトル化。python の TfidfVectorizer を使ってみる

TF-IDF について簡単にまとめてみました。文書の分類などに使われるようです。

- 目次 -

スポンサーリンク

文書をベクトル化

文書の特徴をベクトルで表すことを考えてみます。
単純な方法として、単語の出現頻度を要素とするベクトルが考えられます。

TF-IDF

これでも、それなりに特徴を捉えてはいますが、たとえば「です」「ます」のように、どの文書にも存在する、ありふれた単語(さほど重要でない)に大きく引きずられてしまいます。

その弊害を避けるため、特定の文書にだけ現れる単語と、ありふれた単語に差をつけます。つまり、各単語の希少性を考慮にいれることを考えます。

そこで登場するのが TF-IDF です。

TF-IDF

TF は Term Frequency、単語の出現頻度
IIDF は Inverse Document Frequency、逆文書頻度(これが希少性

単語の出現頻度と希少性をふたつ掛け合わせた値が TF-IDF で、下記の計算でもとめます。

tdidf

この式で、すべての文書と単語から TF-IDF を計算し、下記の文書ベクトルを求めます。

tfidf_vec

このベクトルを使って、たとえばクラスタリングを行ったり、文書の類似度を求めたりします。

python で

TfidfVectorizer

python で TF-IDF を求めるには scikit-learn の TfidfVectorizer が使えます。
ただし、独自に計算式が改良されており、下記の赤字部分が追加されています。

tdidf_ex2

また、ベクトル長が 1 になるよう正規化された値が出力されます。

使ってみる

単語は 白、黒、赤 の 3種類、文書は 4 つです。
入力するのは、単語をスペースで区切った文書、いわゆる分かち書きされた文書です。

行方向に文書、列方向に単語が並んでいます。
単語と列の対応は下記で確認できます。

token_pattern

上記サンプルで、token_pattern=u'(?u)\\b\\w+\\b’ を指定しました。これは、文字列長が 1 の単語を処理対象に含めることを意味します。この指定をはずすと、長さ一文字の単語がまったくカウントされなくなります。

◇◇◇
以上が基本的な使い方です。これを踏まえて、次節でちょっと応用してみます。

クラスタリング

TF-IDF でベクトル化した文書をクラスタリングで分類してみます。K平均法を使います。

「○○を買う」と「○○を食べる」に分類されました。

スポンサーリンク
その他の記事

コメントはお気軽に