TF-IDF は文章における、単語の重みづけを行うもの。 処理した文章中のうち、ある単語はどの程度重要なものか、出現度合いから重み付けを計算する。 プログラム、機械からは文章の分析っていってもよくわからないので、そのよくわからない特徴をわかるようにするための、数値化する方法の1つ。
前提として TF-IDF には複数の文章を入力する必要がある。
TF-IDF = TF * IDF
TF = 1つの文章において、ある単語の出現回数 / 文章内の単語数 → 文章1つずつの単語の出現頻度がわかる。
IDF = log( 文章数 / ある単語が出現する文章数 ) + 1 → 横断的に使われる単語は低い値になる。
簡単な文章を入れつつ実際の数字を計算してみる。
step1:文章の入力
文章 |
---|
リンゴとレモンとレモン |
リンゴとミカン |
step2:単語に分割(ここでは形態素解析し、名詞だけに絞ったとする)
文章 | 分割した結果 |
---|---|
リンゴとレモンとレモン | リンゴ レモン レモン |
リンゴとミカン | リンゴ ミカン |
step3:TF値、IDF値を計算する
文章 | TF:リンゴ | TF:レモン | TF:ミカン |
---|---|---|---|
リンゴとレモンとレモン | 1 / 3 = 0.33 | 2 / 3 = 0.67 | 0 / 3 = 0 |
リンゴとミカン | 1 / 2 = 0.5 | 0 / 2 = 0 | 1 / 2 = 0.5 |
単語 | IDF |
---|---|
リンゴ | log(2 / 2) + 1 = 1 |
レモン | log(2 / 1) + 1 = 1.3 |
ミカン | log(2 / 1) + 1 = 1.3 |
step4:TF-IDFを計算する
文章 | TF-IDF:リンゴ | TF-IDF:レモン | TF-IDF:ミカン |
---|---|---|---|
リンゴとレモンとレモン | 0.33 * 1 = 0.33 | 0.67 * 1.3 = 0.87 | 0 * 1.3 = 0 |
リンゴとミカン | 0.5 * 1 = 0.5 | 0 * 1.3 = 0 | 0.5 * 1.3 = 0.65 |
この結果からわかることとして。
- 「リンゴ」は横断的に出現するので値が低くなる。
- 「レモン」は文章1だけに多く使われるので値に特徴が強く出る。
- 「ミカン」は文章2だけに使われているが、リンゴと同程度しか使われていないので、特徴が大きく出るわけではない。
- この2つの文章を切り分けるには レモン の様子を見ればよいらしい。ということで、確かに単語の重要度がわかるよ、っていうのはあっているらしい。
ただ、全ての文章・全ての単語を利用するという計算ロジックの都合、文章を逐次増やして差分計算していくー、というのは出来なさそうなので、そういう用途はむりそうだなー。 例えばこの計算済み TF-IDF の結果に加えて「バナナとレモン」を追加したときに困っちゃうね、という話。この量なら良いけど、もっと文章量が増えてもっと単語量が増えると、毎回計算し直すコストがかかる。