TF-IDF算法
1、TF-IDF算法介绍
TF-IDF(term frequency-invers document frequency,词频-逆向文件频率)是一种常用于信息检索(information retrieval)与文本挖掘(text mining)的常用加权技术。
TF-IDF是一种统计方法,用于评估一字词对于一个文件集或语料库中的一份文件的重要程度。字词的重要性随着他在文件中出现的次数成正比增加,但同时也会随着它在语料库中出现的频率成反比下降。
TF-IDF的主要思想是:如果某个单词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或短语具有很好的类别区分能力,适合用来分类。
- TF是词频(Term Frequency)
其中, n i j n_ij nij 是该词在文章 d j d_j dj 中出现的次数,分母则是文章 d j d_j dj 中所有词汇出现的次数总和。
- IDF是逆向文件频率(Inverse Document Frequency)
逆向文件频率(IDF):某一特定词语的IDF,可以由总文章数除以包含该词语的文件的数目,再将得到的商取对数得到。
如果包含词条 t t t的文档越少,IDF越大,说明词条具有很好的类别区分能力。
其中** ∣ D ∣ |D| ∣D∣是语料库中的文章总数。** ∣ j : t i ∈ d j ∣ |{j:t_i \in d_j}| ∣j:ti∈dj∣表示包含词语 t i t_i ti的文章数目。如果该词语不再语料库中,就会导致分母为0,因此一般情况下使用 1 + ∣ j : t i ∈ d j ∣ 1+|{j:t_i \in d_j}| 1+∣j:ti∈dj∣。即:
- TF-IDF实际上是:TF*IDF
某一特定文件中的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生高权重的TF-IDF,因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
公式:
注: TF-IDF算法非常容易理解,并且很容易实现,但是其简单结构并没有考虑词语的语义信息,无法处理一词多义与一义多词的情况。
2、TF-IDF的应用
- 搜索引擎
- 关键词提取
- 文本相似性
- 文本摘要
3、怎么使用TF-IDF
3.1 sklearn实现TF-IDF算法
- 代码:
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
x_train = ['TF-IDF 主要 思想 是','算法 一个 重要 特点 可以 脱离 语料库 背景',
'如果 一个 网页 被 很多 其他 网页 链接 说明 网页 重要']
x_test=['原始 文本 进行 标记','主要 思想']
#该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
vectorizer = CountVectorizer(max_features=10)
#该类会统计每个词语的tf-idf权值
tf_idf_transformer = TfidfTransformer()
#将文本转为词频矩阵并计算tf-idf
tf_idf = tf_idf_transformer.fit_transform(vectorizer.fit_transform(x_train))
#将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
x_train_weight = tf_idf.toarray()
#对测试集进行tf-idf权重计算
tf_idf = tf_idf_transformer.transform(vectorizer.transform(x_test))
x_test_weight = tf_idf.toarray() # 测试集TF-IDF权重矩阵
print('输出x_train文本向量:')
print(x_train_weight)
print('输出x_test文本向量:')
print(x_test_weight)
运行结果:
3.2 参数介绍
- token_pattern 这个参数使用正则表达式来分词,其默认参数为r"(?u)\b\w\w+\b",其中的两个"\w"决定了其匹配到长度至少为2的单词,所以将’\w’个数减少到1个的话,即可实现匹配长度至少为1的单词。
- **max_df/min_df **: [0.0, 1.0]内浮点数或正整数,默认值是1.0
当设置为浮点数的时候,过滤出现超过max_df对于min_df比例的句子中的词语;正整数时,则是超过max_df句句子。
这样就可以帮助我们过滤掉出现太多的无意义词语
- stop_words: list类型
直接过来吧指定的停用词。
- voca:dict类型
- 只是用特定的词汇,其形式上与上面看到的tfidf_modl.vocabulary_相同,也是指定对应关系。
这一参数的使用有时可以帮助我们专注于一些词语。
- ngram_ranege: tuplpe
有时候我们觉得单个的词语作为特征还不过,能够加入一些词语更好就可以设置这个参数,如下面允许词表使用一个词语,或者两个词语的组合。
这里顺便使用了一个方便的方法 get_feature_names() ,可以以列表的形式得到所有的词语
5**.max_feature**: int
在大规模语料上训练TFIDF会得到非常多的词语,如果再使用了上一个设置加入了词组,那么我们词表的大小就会爆炸。出于时间和空间效率的考虑,可以限制最多使用多少个词语,模型会优先选取词频高的词语留下。
4、TF-IDF的不足
TF-IDF采用文本逆频率IDF对TF值加权取权值大的作为关键词,但IDF的简单构造并不能有效地反映搭单词的重要程度和特征词的分布情况,使其无法很好地完成对权值的调整,所以TF-IDf算法的精度并不是很高,尤其是当文本集已经分类的情况下。
在本质上IDF是一种试图抑制噪声的加权,并且单纯地认为本文频率小的单词就越重要,文本频率大的单词就越无用。着对大部分文本信息,并不是完全正确的。ID发的简单构造并不能让提取的关键词,十分有效地反映单词地重要程度和特征词地分布情况,使其无法很好地完成对权值调整的功能。尤其在同类语料库中,这一方法有很大的弊端,往往一些同类文本的关键词被覆盖。
不足:
- 没有考虑特征词的位置因素对文本的区分度,词条出现在文档的不同位置时,对区分度的贡献大小是不一样的。
- 按照传统TF-IDF,往往对一些生僻词的IDF(逆文档频率)会比较高,因此这些生僻词常被误认为是文档关键词
- 传统TF-IDF中的IDF部分只考虑了特征词与他出现文本数之间的关系,而忽略了特征项在一个类别中不同的类别间的分布情况。
- 对于文档中出现次数较少的重要人名,地名信息提取效果不佳。