TF-IDFとは
TF-IDFとはTerm Frequency - Inverse Document Frequencyの略で、自然言語をベクトルで表現する方法の一つです。TF-IDFはある文書を特徴づける重要な単語を抽出したいときに有効な手法です。
TF-IDFはTFとIDFの掛け算により導出されます。
: 単語t : 文書d : 文書セット(コーパス)D
Term Frequency
TF (Term Frequency) は単語の出現頻度を表します。出現頻度が多い単語は重要度が高く、出現頻度が少ない単語は重要度が低いと考えます。つまり、よく出現する単語は、その文書の特徴を判別するのに有用という考え方になります。出現頻度の定義は次のように複数あります。
- 文書中にその単語が出現した回数(単純な単語のカウント)
- 文書の長さに合わせて調整した出現頻度(単語の出現回数を文書内の単語数で割ったもの)
- 対数変換された出現頻度 (例: log(1 + raw count))
- ブール値の出現頻度 (文書内で用語が出現する場合は1、出現しない場合は0)
今回は、TFを単語の出現回数を文書内の単語数で割ったものとして計算してみます。
次の文書があるとします。
- Document 1: It is going to rain today. I like sound of rain.
- Document 2: Today I am going to watch Netflix.
TFは次のようになります。
TF (Document 1) | TF (Document 2) | |
---|---|---|
it | 0 | |
is | 0 | |
going | ||
to | ||
rain | 0 | |
today | ||
i | ||
like | 0 | |
sound | 0 | |
of | 0 | |
am | 0 | |
watch | 0 | |
Netflix | 0 |
Inverse Document Frequency
IDF (Inverse Document Frequency) はthisやisなどのような一般語のフィルタとして機能します。色々な文書によく出現する単語は低い値IDFを示し、レアな単語は高いIDFを示します。IDFの式は次のとおりです。
: 単語t : 文書d : 文書セット(コーパス)D :N の中にあるD の数d : 単語count(d \in D:t \in d) が登場する文書t の数d
次の文書があるとします。
- Document 1: It is going to rain today. I like sound of rain.
- Document 2: Today I am going to watch Netflix.
IDFは次のようになります。
IDF | |
---|---|
it | |
is | |
going | |
to | |
rain | |
today | |
i | |
like | |
sound | |
of | |
am | |
watch | |
Netflix |
TF-IDFの計算ライブラリ
TF-IDFは次の主要なライブラリを使って計算することができます。
- scikit-learn
- TensorFlow(2.x)/ Keras
- TensorFlow Extended(TFX)
ただし、ライブラリや指定オプションにより計算式が異なることがあります。機械学習ではscikit-learnのTF-IDFの関数がよく使われています。
今回はsklearn.feature_extraction.text.TfidfVectorizer
を使って次の文書のTF-IDFを計算してみます。
- Document 1: It is going to rain today. I like sound of rain.
- Document 2: Today I am going to watch Netflix.
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
document1 = "It is going to rain today. I like sound of rain."
document2 = "Today I am going to watch Netflix."
df = pd.DataFrame({'id': ["Document 1", "Docuemnt 2"],
'document': [document1, document2]
})
# calculate TF-IDF
tfidf_vectorizer = TfidfVectorizer(use_idf=True,lowercase=True)
# get TF-IDF score of all words in documents
tfidf_matrix = tfidf_vectorizer.fit_transform(df['document'])
# term list
terms = tfidf_vectorizer.get_feature_names()
# vectors of words
tfidfs = tfidf_matrix.toarray()
>> terms
['am',
'going',
'is',
'it',
'like',
'netflix',
'of',
'rain',
'sound',
'to',
'today',
'watch']
>> tfidfs
array([[0. , 0.28867513, 0.28867513, 0.28867513, 0.28867513,
0. , 0.28867513, 0.57735027, 0.28867513, 0.28867513,
0.28867513, 0. ],
[0.40824829, 0.40824829, 0. , 0. , 0. ,
0.40824829, 0. , 0. , 0. , 0.40824829,
0.40824829, 0.40824829]])
df_tfidf = pd.DataFrame(tfidfs,
columns=terms,
index=["Document 1", "Document 2"]
)
display(df_tfidf)
am | going | is | it | like | netflix | of | rain | sound | to | today | watch | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Document 1 | 0 | 0.289 | 0.289 | 0.289 | 0.289 | 0 | 0.289 | 0.577 | 0.289 | 0.289 | 0.289 | 0 |
Document 2 | 0.408 | 0.408 | 0 | 0 | 0 | 0.408 | 0 | 0 | 0 | 0.408 | 0.408 | 0.408 |
上記の値は、各単語のTF-IDFのスコアです。TfidfVectorizer
は内部で正規化まで行なっています。
このTF-IDFのスコアが大きいほど、その文書における重要単語ということになります。
TF-IDFの活用例
IF-IDFは次のような場面で活用されています。
- 情報検索
- テキスト要約
- キーワード抽出
- 類似文書の検索
- 関連記事のレコメンデーション
参考