PythonでTF-IDF

自然言語処理




TF-IDF

TF-IDFは、Term-Frequency-Inverse-Document-Frequencyの略です。

文書中に含まれる単語の重要度を評価する手法です。

TF-IDFは、下のように定義されています。
$$TF-IDF(t,d) = tf(t,d) \times idf(t,d)$$

\(tf(t,d)\)は、単語の出現頻度を表しています。
\(idf(t,d)\)は、逆文書頻度を表しています。

tf(Term Frequency)

\(tf(t,d)\)は、単語の出現頻度を表しています。

文書dにおける単語tの出現回数を表す。

idf(Inverse Document Frequency)

\(idf(t,d)\)は、逆文書頻度を表しています。
$$
idf(t,d) = log{\frac{n}{1+df(t,d)}}
$$

df(t,d)は、単語tを含んでいる文書の個数を表す。
\(n_d\)は、文書の総数を表す。

Python

例の如く当ブログの意味わからない例文ですが。。。
まずは、分かち書きとBoWでベクトル化します。

  1. Pythonで日本語の分かち書き
  2. PythonでBoW(Bag-of-Words)によるエンコード
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
import MeCab

def clear(text):
    text = re.sub(r'、', '', text)
    text = re.sub(r'。', '', text)
    text = re.sub(r'\n', '', text)

    return text

text_list = ["私の名前は、βshortです。",
             "私は、ブログを書いています。",
             "ブログの内容は、データ分析に関するものです。",
             "ブログは、不定期で更新をしています。"]

text_list_raw = text_list

for i in range(len(text_list)):
    tagger = MeCab.Tagger("-Owakati")
    text_list[i] = tagger.parse (text_list[i])
    text_list[i] = clear(text_list[i])

bow = CountVectorizer()
count = bow.fit_transform(text_list)
vec = count.toarray()
name = bow.get_feature_names()
pd.DataFrame(vec, columns=name)

sklearnのTfidfTransformer

from sklearn.feature_extraction.text import TfidfTransformer

tfidf = TfidfTransformer(use_idf=True, norm='l2', smooth_idf=True)
tfidf_vec = tfidf.fit_transform(vec).toarray()

pd.DataFrame(tfidf_vec, columns=name, index=text_list_raw)

TfidfVectorizerで一気にBoW

from sklearn.feature_extraction.text import TfidfVectorizer

tfidf = TfidfVectorizer()
tfidf_vec = tfidf.fit_transform(text_list).toarray()

pd.DataFrame(tfidf_vec, columns=name, index=text_list_raw)

参考書

sklearn.feature_extraction.text.CountVectorizer
sklearn.feature_extraction.text.TfidfTransformer
sklearn.feature_extraction.text.TfidfVectorizer

タイトルとURLをコピーしました