失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > TF-IDF:自动提取关键词

TF-IDF:自动提取关键词

时间:2021-12-22 14:14:53

相关推荐

TF-IDF:自动提取关键词

目录:

一、TF-IDF基础知识 1.TF-IDF2.举例介绍二、TF-IDF调用两个方法 1.CountVectorizer2.TfidfTransformer3.别人示例

一、TF-IDF基础知识

1.TF-IDF

TF-IDF(Term Frequency-InversDocumentFrequency)是一种常用于信息处理和数据挖掘的加权技术。该技术采用一种统计方法,根据字词的在文本中出现的次数和在整个语料中出现的文档频率来计算一个字词在整个语料中的重要程度。它的优点是能过滤掉一些常见的却无关紧要本的词语,同时保留影响整个文本的重要字词。计算方法如下面公式所示。

其中,式中tfidfi,j表示词频tfi,j和倒文本词频idfi的乘积。TF-IDF值越大表示该特征词对这个文本的重要性越大。

TF(Term Frequency)表示某个关键词在整篇文章中出现的频率。

IDF(InversDocumentFrequency)表示计算倒文本频率。文本频率是指某个关键词在整个语料所有文章中出现的次数。倒文档频率又称为逆文档频率,它是文档频率的倒数,主要用于降低所有文档中一些常见却对文档影响不大的词语的作用。

下面公式是TF词频的计算公式。

其中,ni,j为特征词ti在文本dj中出现的次数,是文本dj中所有特征词的个数。计算的结果即为某个特征词的词频。

下面公式是IDF的计算公式。

其中,|D|表示语料中文本的总数,表示文本中包含特征词ti的数量。为防止该词语在语料库中不存在,即分母为0,则使用作为分母。

2.示例

示例参考仿造阮一峰大神的例子进行简单讲解,推荐大家去阅读:

TF-IDF与余弦相似性的应用(一):自动提取关键词

/blog//03/tf-idf.html

TF-IDF与余弦相似性的应用(二):找出相似文章

/blog//03/cosine_similarity.html

下面通过一个示例进行讲解TF-IDF权重计算的方法。

假设现在有一篇文章《贵州的大数据分析》,这篇文章包含了10000个词组,其中“贵州”、“大数据”、“分析”各出现100次,“的”出现500次(假设没有去除停用词),则通过前面TF词频计算公式,可以计算得到三个单词的词频,即:

现在预料库中共存在1000篇文章,其中包含“贵州”的共99篇,包含“大数据”的共19篇,包含“分析”的共“59”篇,包含“的”共“899”篇。则它们的IDF计算如下:

由IDF可以发现,当某个词在语料库中各个文档出现的次数越多,它的IDF值越低,当它在所有文档中都出现时,其IDF计算结果为0,而通常这些出现次数非常多的词或字为“的”、“我”、“吗”等,它对文章的权重计算起不到一定的作用。

同时计算TF-IDF值如下:

通过TF-IDF计算,“大数据”在某篇文章中出现频率很高,这就能反应这篇文章的主题就是关于“大数据”方向的。如果只选择一个词,“大数据”就是这篇文章的关键词。所以,可以通过TF-IDF方法统计文章的关键词。同时,如果同时计算“贵州”、“大数据”、“分析”的TF-IDF,将这些词的TF-IDF相加,可以得到整篇文档的值,用于信息检索。

TF-IDF算法的优点是简单快速,结果比较符合实际情况。缺点是单纯以词频衡量一个词的重要性,不够全面,有时重要的词可能出现次数并不多。而且,这种算法无法体现词的位置信息。

二、TF-IDF计算

Scikit-Learn中TF-IDF权重计算方法主要用到两个类:CountVectorizer和TfidfTransformer。

1.CountVectorizer

CountVectorizer类会将文本中的词语转换为词频矩阵,例如矩阵中包含一个元素a[i][j],它表示j词在i类文本下的词频。它通过fit_transform函数计算各个词语出现的次数,通过get_feature_names()可获取词袋中所有文本的关键字,通过toarray()可看到词频矩阵的结果。

代码如下:

# coding:utf-8from sklearn.feature_extraction.text import CountVectorizer#语料corpus = ['This is the first document.','This is the second second document.','And the third one.','Is this the first document?',]#将文本中的词语转换为词频矩阵vectorizer = CountVectorizer()#计算各个词语出现的次数X = vectorizer.fit_transform(corpus)#获取词袋中所有文本关键词word = vectorizer.get_feature_names()print(word)#查看词频结果print(X.toarray())

输出如下所示:

['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this'][[0 1 1 1 0 0 1 0 1][0 1 0 1 0 2 1 0 1][1 0 0 0 1 0 1 1 0][0 1 1 1 0 0 1 0 1]]

从结果中可以看到,总共包括9个特征词,即:

['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']

同时在输出每个句子中包含特征词的个数。例如,第一句“This is the first document.”,它对应的词频为[0, 1, 1, 1, 0, 0, 1, 0, 1],假设初始序号从1开始计数,则该词频表示存在第2个位置的单词“document”共1次、第3个位置的单词“first”共1次、第4个位置的单词“is”共1次、第9个位置的单词“this”共1词。所以,每个句子都会得到一个词频向量。

2.TfidfTransformer

TfidfTransformer用于统计vectorizer中每个词语的TF-IDF值。具体用法如下:

# coding:utf-8from sklearn.feature_extraction.text import CountVectorizer#语料corpus = ['This is the first document.','This is the second second document.','And the third one.','Is this the first document?',]#将文本中的词语转换为词频矩阵vectorizer = CountVectorizer()#计算各个词语出现的次数X = vectorizer.fit_transform(corpus)#获取词袋中所有文本关键词word = vectorizer.get_feature_names()print(word)#查看词频结果print(X.toarray())from sklearn.feature_extraction.text import TfidfTransformer#类调用transformer = TfidfTransformer()print(transformer)#将词频矩阵X统计成TF-IDF值tfidf = transformer.fit_transform(X)#查看数据结构 tfidf[i][j]表示i类文本中的tf-idf权重print(tfidf.toarray())

输出结果如下所示:

TfidfTransformer(norm='l2', smooth_idf=True, sublinear_tf=False, use_idf=True)[[0. 0.43877674 0.54197657 0.43877674 0. 0.0.35872874 0. 0.43877674][0. 0.27230147 0. 0.27230147 0. 0.853225740.22262429 0. 0.27230147][0.55280532 0. 0. 0. 0.55280532 0.0.28847675 0.55280532 0. ][0. 0.43877674 0.54197657 0.43877674 0. 0.0.35872874 0. 0.43877674]]

3.别人示例

如果需要同时进行词频统计并计算TF-IDF值,则使用核心代码:

vectorizer=CountVectorizer()

transformer=TfidfTransformer()

tfidf=transformer.fit_transform(vectorizer.fit_transform(corpus))

下面给出一个liuxuejiang158大神的例子,供大家学习,推荐大家阅读原文:

# coding:utf-8__author__ = "liuxuejiang"import jiebaimport jieba.posseg as psegimport osimport sysfrom sklearn import feature_extractionfrom sklearn.feature_extraction.text import TfidfTransformerfrom sklearn.feature_extraction.text import CountVectorizerif __name__ == "__main__":corpus = ["我 来到 北京 清华大学", # 第一类文本切词后的结果,词之间以空格隔开"他 来到 了 网易 杭研 大厦", # 第二类文本的切词结果"小明 硕士 毕业 与 中国 科学院", # 第三类文本的切词结果"我 爱 北京 天安门"] # 第四类文本的切词结果vectorizer = CountVectorizer() # 该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频transformer = TfidfTransformer() # 该类会统计每个词语的tf-idf权值tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus)) # 第一个fit_transform是计算tf-idf,第二个fit_transform是将文本转为词频矩阵word = vectorizer.get_feature_names() # 获取词袋模型中的所有词语weight = tfidf.toarray() # 将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重for i in range(len(weight)): # 打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重print("-------这里输出第", i, "类文本的词语tf-idf权重------")for j in range(len(word)):print(word[j], weight[i][j])

输出如下所示:

-------这里输出第 0 类文本的词语tf-idf权重------ #该类对应的原文本是:"我来到北京清华大学"中国 0.0北京 0.52640543361大厦 0.0天安门 0.0小明 0.0来到 0.52640543361杭研 0.0毕业 0.0清华大学 0.66767854461硕士 0.0科学院 0.0网易 0.0-------这里输出第 1 类文本的词语tf-idf权重------ #该类对应的原文本是: "他来到了网易杭研大厦"中国 0.0北京 0.0大厦 0.525472749264天安门 0.0小明 0.0来到 0.414288751166杭研 0.525472749264毕业 0.0清华大学 0.0硕士 0.0科学院 0.0网易 0.525472749264-------这里输出第 2 类文本的词语tf-idf权重------ #该类对应的原文本是: "小明硕士毕业于中国科学院“中国 0.4472135955北京 0.0大厦 0.0天安门 0.0小明 0.4472135955来到 0.0杭研 0.0毕业 0.4472135955清华大学 0.0硕士 0.4472135955科学院 0.4472135955网易 0.0-------这里输出第 3 类文本的词语tf-idf权重------ #该类对应的原文本是: "我爱北京天安门"中国 0.0北京 0.61913029649大厦 0.0天安门 0.78528827571小明 0.0来到 0.0杭研 0.0毕业 0.0清华大学 0.0硕士 0.0科学院 0.0网易 0.0

转自:/Eastmount/article/details/50323063

如果觉得《TF-IDF:自动提取关键词》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。