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でベクトル化します。
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