TF-IDF
定義と特性
TF-IDF (term frequency - inverse document frequency) はある単語がコーパス内の文書に対してどれほど重要であるかを示す統計的数値。TF-IDF 値は文書内に単語が出現する回数に比例して増加するが、コーパス内での単語の出現頻度によって相殺されることが多く、一般に頻繁に出現する単語を調整する利点をもつ。TF-IDF は、文書の特徴ベクトルを算出してベクトル空間モデルでの文書検索や文書分類、索引付けなどに利用されている。
文書集合内の文書
「ある文書の特徴を示す単語はその文書内に頻出する」と仮定すると
ただし
文書数
なお形態素解析などの処理で複数の文書に頻出する単語 (stop word) をフィルタリングする場合は以下の
プログラミング
文書のベクトル化
TF-IDF は「特定の文書に偏在する単語は特徴が高い」と「すべての文書に一様に出現する単語の特徴は低い」という特徴を併せ持つ量である。従って任意のテキスト要素 (形態素や Ngram など) に対する TF-IDF 値はその文書を特徴づけている特徴ベクトル (feature vector) と考える事ができる。
例として文書内に果物の絵文字 (単語などのテキスト要素の代替) を含む文書セット
それぞれの絵文字と文書に対して TF (
| 🍌 | 🍎 | 🍊 | 🍒 | 🍇 | |
| |
0.500 | 0.250 | 0.250 | 0.000 | 0.000 |
| |
0.200 | 0.200 | 0.200 | 0.400 | 0.000 |
| |
0.000 | 0.333 | 0.000 | 0.000 | 0.667 |
| |
0.405 | 0.000 | 0.405 | 1.098 | 1.098 |
すべての文書に含まれている🍎は何の特徴も表していないため IDF が 0 となっていることが分かるだろう。
以上より各絵文字の文書ごとの TF-IDF (
| 🍌 | 🍎 | 🍊 | 🍒 | 🍇 | |
| |
0.202 | 0.000 | 0.101 | 0.000 | 0.000 |
| |
0.081 | 0.000 | 0.081 | 0.162 | 0.000 |
| |
0.000 | 0.000 | 0.000 | 0.000 | 0.732 |
文書
各文書に対するテキスト要素ごとの TF-IDF を使用して、文書の特徴ベクトル
TF-IDF を使用した文書のベクトル化はベクトル空間モデル上で類似文書検索やインデックス付けを行うための典型的な方法である。
以下のコードはこの例に基づいて各文書の TF-IDF による特徴ベクトルを作成する。
def tf(doc:Seq[Int], term:Int):Double = doc(term) / doc.sum.toDouble
def idf(docs:Seq[Seq[Int]], term:Int):Double = math.log(docs.length.toDouble / docs.count(_(term) > 0))
def tfidf(docs:Seq[Seq[Int]], doc:Int, term:Int):Double = tf(docs(doc), term) * idf(docs, term)
val terms = Seq("banana", "apple", "orange", "cherry", "grape")
val doc1 = Seq("banana", "banana", "apple", "orange")
val doc2 = Seq("banana", "apple", "orange", "cherry", "cherry")
val doc3 = Seq("apple", "grape", "grape")
val docs = Seq(doc1, doc2, doc3).map{ doc =>
terms.map(term => doc.count(_ == term))
}
// List(List(2, 1, 1, 0, 0), List(1, 1, 1, 2, 0), List(0, 1, 0, 0, 2))
docs.indices.map{ doc =>
terms.map{ term =>
tfidf(docs, doc, terms.indexOf(term))
}
}.foreach{ fs =>
println(fs.map(x=>f"$x%.3f").mkString(", "))
}
// 0.203, 0.000, 0.101, 0.000, 0.000
// 0.081, 0.000, 0.081, 0.439, 0.000
// 0.000, 0.000, 0.000, 0.000, 0.732
参考文献
- Stefan Buttcher, Charles L. A. Clarke, Gordon V. Cormack. 情報検索 :検索エンジンの実装と評価. 森北出版 (2020)