1.tf-idf
tf-idf, term frequency - inverse document frequency,词频 -逆向文档频率。
用于评价一个单词在整个语料库中的重要程度, 即这个词是否对不同文档有着很好的区分能力.
如果某个词语 term 在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为这个词语具有很好的文档分类能力。
它通常用于词加权, 即作为权重因子(weight factor) 被用于信息检索.
2.公式
i i i 表示term, j j j 表示doc. D D D 表示文档总数.
-
t f ( i , j ) = i 在 j 中 的 出 现 频 次 j 中 的 总 词 数 tf(i,j) =\frac{i 在 j 中的出现频次}{j 中的总词数} tf(i,j)=j中的总词数i在j中的出现频次
表示词语i在文档j中的频率。 -
i d f ( i ) = log ( D 包 含 i 的 文 档 数 ) idf(i)=\log(\frac D {包含i的文档数}) idf(i)=log(包含i的文档数D)
含有词语i的文档数越少,则此项得分最高。 -
t f _ i d f ( i , j ) = t f ( i , j ) × i d f ( i ) tf\_idf(i,j)=tf(i,j) \times idf(i) tf_idf(i,j)=tf(i,j)×idf(i)
衡量词语i在j中的重要性. -
t f _ i d f ( i ) = i d f ( i ) × ∑ j 文 档 数 n t f ( i , j ) tf\_idf(i)=idf(i) \times \sum \limits_j^{文档数n} tf(i,j) tf_idf(i)=idf(i)×j∑文档数ntf(i,j),得分越高表示词语i对文章的分类能力越强。
总的也能统计, 但这个一般不用.
3.业界工具实现
gensim
gensim有 tf-idf 的实现.
输出的是一个权重矩阵
A
A
A,
A
i
,
j
=
t
f
_
i
d
f
i
,
j
A_{i,j}=tf\_idf_{i,j}
Ai,j=tf_idfi,j.
sklearn
TfidfVectorizer 类, 训练阶段接收语料库作输入, 训练得到 idf信息, 然后用于普通的 tf-idf 计算.
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(min_df=10)
# 训练
X_train = vectorizer.fit_transform(corpus_train)
# 输出向量化结果, dtype=float, shape=[doc_size, vocabulary_size], 因 vocabulary_size 大于1万, 常用 sparse_matrix 格式表示. 每个 element 就是对应term的 tf-idf 值.
X_test = vectorizer.transform(corpus_test)
4. 表格示例
图 4-1 tf-idf(word, doc)
5.灵活变种
借鉴
t
f
_
i
d
f
(
i
,
j
)
=
t
f
(
i
,
j
)
×
i
d
f
(
i
)
tf\_idf(i,j)=tf(i,j) \times idf(i)
tf_idf(i,j)=tf(i,j)×idf(i) 的思想, 综合运用 term score, term hot, field weight, inverse document frequency. 得到的新公式为:
t
s
_
t
h
_
i
d
f
(
i
,
j
)
=
t
s
(
i
,
j
)
∗
log
(
t
h
(
i
)
∣
{
d
o
c
∣
i
∈
d
o
c
}
∣
)
(5-1)
ts\_th\_idf(i,j)=ts(i,j)*\log (\frac {th(i)}{|\{doc| i \in doc\}|}) \tag {5-1}
ts_th_idf(i,j)=ts(i,j)∗log(∣{doc∣i∈doc}∣th(i))(5-1)
- i, j
i 为 term, j 为 doc. -
t
s
(
i
,
j
)
ts(i,j)
ts(i,j)
ts 即 term_score.
t s ( i , j ) = ∑ f i e l d ∈ j w e i g h t ( f i e l d ) ∗ f r e q u e n c y ( i , j , f i e l d ) ts(i,j)=\sum_{field \in j} weight(field)*frequency(i,j,field) ts(i,j)=field∈j∑weight(field)∗frequency(i,j,field)
即 term i i i 在 doc j j j 中的得分. -
t
h
(
i
)
th(i)
th(i)
th 即 term_hot, 该term本身的热度. -
w
e
i
g
h
t
(
f
i
e
l
d
)
weight(field)
weight(field)
doc由若干field组成, 代表指定field的权重. -
f
r
e
q
u
e
n
c
y
(
i
,
j
,
f
i
e
l
d
)
frequency(i,j,field)
frequency(i,j,field)
i 在 j 的 field 中出现的频次
参考
- wikipedia
- stanford: tf-idf-weighting