一、基本概念
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数(TF)成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量。通过计算文档中字词的TF-IDF可以进行文章关键词的抽取。
给定一批文档D , 文档个数为|D|, 第j个文档记为。对每篇文档进行切词,第i个词为
,第i个词在第j个文档中出现次数为
二、计算方式
2.1 计算TF:
Term Frequency,词频,某个词在文档中出现的频率,是对某个词在文档中出现次数的归一化,防止指标偏向较长的文档。
说明:第i个词在第j个文档中出现的词频 为 第i个词在第j个文档中出现的次数 与 第j个文档中总次数的比值。注意,对于一些“的”“了”之类的停用词,在每篇文章中出现次数都很多,需要利用TF信息过滤,以免对后续造成干扰。
2.2 计算IDF:
inverse document frequency ,逆文档频率,词语普遍重要性的度量
说明:第i个词的逆文档频率为 文档总数除以包含第i个词的文档数,然后取以10为底的对数。
2.3 计算TF-IDF
通过计算文章中每个词的tf-idf,并按tf-idf降序排序,抽取前面的几个词作为文章关键词。
三、TF-IDF优缺点
- 优点:简单快速容易理解
- 缺点:用词频衡量一个词的重要程度不够全面,有时候需要考虑上下文。如果考虑上下文的话,可以使用wordvec方法。
四、代码
4.1 自实现python代码 (自行百度)
4.2 使用scikit-learn 计算TF-IDF(https://www.cnblogs.com/caiyishuai/p/9511567.html)
4.2.1 CountVectorizer类会将文本中的词语转换为词频矩阵。
- fit_transform:计算每个单词出现的次数
- get_feature_names: 获取词袋中所有文本关键字
- toarray: 可以看到词频矩阵的结果
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
# 语料
corpus = [
'This is the first document.',
'This is the second document.',
'And the third one.',
'Is this the first document?',
]
vector = CountVectorizer()
# 计算单词出现的次数
x = vector.fit_transform(corpus)
# 获取词袋中所有文本关键词
word = vector.get_feature_names()
print(word)
# 打印词频矩阵结果
print(x.toarray())
输出结果:
4.2.2 TfidfTransformer用于统计每个单词的tf-idf
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
# 语料
corpus = [
'This is the first document.',
'This is the second document.',
'And the third one.',
'Is this the first document?',
]
vector = CountVectorizer()
# 计算单词出现的次数
x = vector.fit_transform(corpus)
# 获取词袋中所有文本关键词
word = vector.get_feature_names()
print(word)
# 打印词频矩阵结果
print(x.toarray())
transformer = TfidfTransformer()
print(transformer)
# 统计TF-IDF矩阵
tfidf = transformer.fit_transform(x)
print(tfidf.toarray())
输出结果: