最近在肝腾讯广告大赛2020,特征提取部分陷入了窘境,突然想起了tf-idf,就来复习一波。
TF-IDF的概念
TF-IDF是Term Frequency - Inverse Document Frequency的缩写,即“词频-逆文本频率”。它由两部分组成,TF和IDF。
TF策略我在之前的高频词提取文章中进行过使用,TF用来表示词频,也就是某个词在文章中出现的总次数,也就是:
TF=某个词在文章中出现的总次数
但是考虑到每篇文章的长短是不同的,所以我们可以把上述内容进行一个标准化:
TF=某个词在文章中出现的总次数/文章的总词数
IDF用来表示逆文档频率,所谓逆文档频率其实是用来反映一个词在所有文档中出现的频率,当一个词在很多文档中出现的时候,其所对应的IDF值也应该变低,当一个词在很少的文档中出现的时候,其所对应的IDF值就会变高,用一个式子来表述一下:
IDF=log(语料库中的文档总数/(包含该词的文档数+1))
在这里我们+1的目的是为了当没有词语在文档中时来避免分母为0。
现在我们知道了TF,IDF分别代表什么,那么我们也可以得到TF-IDF:
TF-IDF=TF*IDF
并且根据上述的性质我们可以得出:TF-IDF与一个词在文档中的出现次数成正比,与该词在整个语料库中的出现次数成反比。
TF-IDF的实现,sklearn来计算TF-IDF
from sklearn.feature_extraction.text import TfidfVectorizer
corpus = [
"what is the weather like today",
"what is for dinner tonight",
"this is a question worth pondering",
"it is a beautiful day today"
]
tfidf_vec = TfidfVectorizer()
# 利用fit_transform得到TF-IDF矩阵
tfidf_matrix = tfidf_vec.fit_transform(corpus)
# 利用get_feature_names得到不重复的单词
print(tfidf_vec.get_feature_names())
# 得到每个单词所对应的ID
print(tfidf_vec.vocabulary_)
# 输出TF-IDF矩阵
print(tfidf_matrix)
总结
TF-IDF主要用于文章中关键词的提取工作,也可用于查找相似文章、对文章进行摘要提取、特征选择(重要特征的提取)工作。
TF-IDF算法的优点是简单快速,结果比较符合实际情况。缺点是,单纯以"词频"衡量一个词的重要性,不够全面,有时重要的词可能出现次数并不多。而且,这种算法无法体现词的位置信息,出现位置靠前的词与出现位置靠后的词,都被视为重要性相同,这是不正确的。(一种解决方法是,对全文的第一段和每一段的第一句话,给予较大的权重。)