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平均法を使います。

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

スポンサーリンク
その他の記事
  1. この分野はまったくの初心者で初歩的な質問で申し訳ないのですが、
    アドバイスいただければ幸いです。

    本コラムのサンプルプログラムを参考にして、ある一覧表文書をベクトル化しました。
    ベクトル化したデータをcsv形式に変換して、AzuleのMLにinputして機械学習させたいと考えております。

    ここのプログラム例のvecsの行列式をcsv形式に変換する方法を教えていただきたく。
    import csv
    import xlsxwriter
    import xlwt
    を使って試行錯誤的にやっているのですがうまくいかず。

    よろしく御教授ください。

  2. 野田です。 says:

    野田です。

    いろいろググったとっころ、

    import numpy as np
    data = vecs.toarray()
    np.savetxt('vec.csv',data,delimiter=',')

    で、できたっぽいです。
    間違いあれば御指摘ください。

    お騒がせしました。

  3. 白 黒 赤
    白 白 黒
    白 黒 黒 黒

    のように書かれてる例えばtxtファイルはどのように記述すればいいですか?

コメントはお気軽に