3.TF-IDF
3.1.TF-IDF算法介绍
3.2.TF-IDF应用
3.3.NLTK实现TF-IDF算法
3.4.Sklearn实现TF-IDF算法
3.5.Jieba实现TF-IDF算法
3.6.TF-IDF算法的不足
3.7.TF-IDF算法改进—TF-IWF算法

3.TF-IDF

以下转自:https://blog.csdn.net/asialee_bird/article/details/81486700

3.1.TF-IDF算法介绍

TF-IDF(term frequency–inverse document frequency,词频-逆向文件频率)是一种用于信息检索(information retrieval)与文本挖掘(text mining)的常用加权技术。

TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

TF-IDF的主要思想是:如果某个单词在一篇文章中出现的频率TF高,并且在其它文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

(1)TF是词频(Term Frequency)
词频(TF)表示词条(关键字)在文本中出现的频率。
这个数字通常会被归一化(一般是词除以文章总词数),以防止它偏向长的文件。

其中ni,j是该词在文件dj中出现的次数,分母则是文件dj中所有词汇出现的次数总和;

(2)IDF是逆向文件频率(Inverse Document Frequency)
逆向文件频率(IDF):某一特定词语的IDF,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到
如果包含词条t的文档越少,IDF越大,则说明词条具有很好的类别区分能力。

其中,|D|是语料库中的文件总和。 |{j:ti∈dj}|表示包含词语ti的文件数目(即ni,j≠0的文件数目)。如果该词语不在语料库中,就会导致分母为零,因此一般情况下使用 1+|{j:ti∈dj}|

其中,|D| 是语料库中的文件总数。 |{j:ti∈dj}| 表示包含词语 ti 的文件数目(即 ni,j≠0 的文件数目)。如果该词语不在语料库中,就会导致分母为零,因此一般情况下使用 1+|{j:ti∈dj}|

即:

(3)TF-IDF实际上是:TF*IDF
某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
公式:

注:TF-IDF算法非常容易理解,并且很容易实现,但是其简单结构并没有考虑词语的语义信息,无法处理一词多义与一义多词的情况。

3.2.TF-IDF应用

(1)搜索引擎;(2)关键词提取;(3)文本相似性;(4)文本摘要

3.3.NLTK实现TF-IDF算法

from nltk.text import TextCollection
from nltk.tokenize import word_tokenize# 首先,构建语料库corpus
sents = ['this is sentence one', 'this is sentence two', 'this is sentence three']
sents = [word_tokenize(sent) for sent in sents]  # 对每个句子进行分词
print(sents)  # 输出分词后的结果
'''
输出结果:
[['this', 'is', 'sentence', 'one'], ['this', 'is', 'sentence', 'two'], ['this', 'is', 'sentence', 'three']]
'''corpus = TextCollection(sents)  # 构建语料库
print(corpus)  # 输出分词后的结果
'''
输出结果:
<Text: this is sentence one this is sentence two...>
'''# 计算语料库中"one"的tf值
tf = corpus.tf('one', corpus)  # 结果为: 1/12
print(tf)
'''
输出结果:
0.08333333333333333
'''# 计算语料库中"one"的idf值
idf = corpus.idf('one')  # log(3/1)
print(idf)
"""
输出结果:
1.0986122886681098
"""# 计算语料库中"one"的tf-idf值
tf_idf = corpus.tf_idf('one', corpus)
print(tf_idf)
'''
输出结果:
0.0915510240556758
'''

3.4.Sklearn实现TF-IDF算法

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformerx_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))
print("--------------------------tf_idf-------------------------------")
print(tf_idf)
print('--------------------------x_train_weight-----------------------')
# 将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
x_train_weight = tf_idf.toarray()
print(x_train_weight)
print("---------------------------------------------------------------")# 对测试集进行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)

输出结果:

--------------------------tf_idf-------------------------------(0, 2)    0.7071067811865476(0, 0)    0.7071067811865476(1, 9)    0.3349067026613031(1, 7)    0.4403620672313486(1, 6)    0.4403620672313486(1, 5)    0.4403620672313486(1, 3)    0.4403620672313486(1, 1)    0.3349067026613031(2, 9)    0.22769009319862868(2, 8)   0.29938511033757165(2, 4)   0.8981553310127149(2, 1)    0.22769009319862868
--------------------------x_train_weight-----------------------
[[0.70710678 0.         0.70710678 0.         0.         0.0.         0.         0.         0.        ][0.         0.3349067  0.         0.44036207 0.         0.440362070.44036207 0.44036207 0.         0.3349067 ][0.         0.22769009 0.         0.         0.89815533 0.0.         0.         0.29938511 0.22769009]]
---------------------------------------------------------------
输出x_train文本向量:
[[0.70710678 0.         0.70710678 0.         0.         0.0.         0.         0.         0.        ][0.         0.3349067  0.         0.44036207 0.         0.440362070.44036207 0.44036207 0.         0.3349067 ][0.         0.22769009 0.         0.         0.89815533 0.0.         0.         0.29938511 0.22769009]]
输出x_test文本向量:
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.][0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]]

3.5.Jieba实现TF-IDF算法

import jieba.analysetext='关键词是能够表达文档中心内容的词语,常用于计算机系统标引论文内容特征、信息检索、系统汇集以供读者检阅。关键词提取是文本挖掘领域的一个分支,是文本检索、文档比较、摘要生成、文档分类和聚类等文本挖掘研究的基础性工作'keywords=jieba.analyse.extract_tags(text, topK=20, withWeight=False, allowPOS=())
print(keywords)

注:
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())

  • sentence 为待提取的文本。
  • topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
  • withWeight为是否一并返回关键词权重值,默认值为False
  • allowPOS仅包括指定词性的词,默认为空,即不筛选

3.6.TF-IDF算法的不足

TF-IDF 采用文本逆频率 IDF 对 TF 值加权取权值大的作为关键词,但 IDF 的简单结构并不能有效地反映单词的重要程度和特征词的分布情况,使其无法很好地完成对权值调整的功能,所以 TF-IDF 算法的精度并不是很高,尤其是当文本集已经分类的情况下。

在本质上 IDF 是一种试图抑制噪音的加权,并且单纯地认为文本频率小的单词就越重要,文本频率大的单词就越无用。这对于大部分文本信息,并不是完全正确的。IDF 的简单结构并不能使提取的关键词, 十分有效地反映单词的重要程度和特征词的分布情 况,使其无法很好地完成对权值调整的功能。尤其是在同类语料库中,这一方法有很大弊端,往往一些同类文本的关键词被盖。

TF-IDF算法实现简单快速,但是仍有许多不足之处:
(1)没有考虑特征词的位置因素对文本的区分度,词条出现在文档的不同位置时,对区分度的贡献大小是不一样的。
(2)按照传统TF-IDF,往往一些生僻词的IDF(反文档频率)会比较高、因此这些生僻词常会被误认为是文档关键词。
(3)传统TF-IDF中的IDF部分只考虑了特征词与它出现的文本数之间的关系,而忽略了特征项在一个类别中不同的类别间的分布情况。
(4)对于文档中出现次数较少的重要人名、地名信息提取效果不佳。

3.7.TF-IDF算法改进—TF-IWF算法

https://pdf.hanspub.org//CSA20130100000_81882762.pdf

3.TF-IDF算法介绍、应用、NLTK实现TF-IDF算法、Sklearn实现TF-IDF算法、算法的不足、算法改进相关推荐

  1. 推荐业务多目标建模算法介绍:MMOE、OMOE、Shared-Bottom

    在推荐业务中经常有"既要.也要.还要"的场景,比如做视频推荐业务的时候既要提升用户对于视频的点击率,也希望同时提升用户观看视频的时长.面对这样的诉求,通常需要在推荐系统中使用多目标 ...

  2. 模拟退火算法介绍、分析与应用

    文章目录 模拟退火算法介绍.分析与应用 模拟退火原理 固体退火 模拟退火 通俗理解 解释 符号说明 算法思想 Metropolis SAA机制与原理 伪代码 算法组成与分析 优点 缺点 改进方案 解决 ...

  3. 用通俗易懂的方式讲解:TF-IDF算法介绍及实现

    文章目录 1.TF-IDF算法介绍 (1)TF是词频(Term Frequency) (2) IDF是逆向文件频率(Inverse Document Frequency) (3)TF-IDF实际上是: ...

  4. IF-IDF算法介绍

    IF-IDF算法介绍 TF(Term Frequency,缩写为TF)也就是词频啦,即一个词在文中出现的次数,统计出来就是词频TF. 词 频 ( T F ) = 某 个 词 在 文 章 中 的 出 现 ...

  5. tf.nn,tf.layers, tf.contrib模块介绍

    一.tf.nn,tf.layers, tf.contrib概述 我们在使用tensorflow时,会发现tf.nn,tf.layers, tf.contrib模块有很多功能是重复的,尤其是卷积操作,在 ...

  6. 联邦学习算法介绍-FedAvg详细案例-Python代码获取

    联邦学习算法介绍-FedAvg详细案例-Python代码获取 一.联邦学习系统框架 二.联邦平均算法(FedAvg) 三.联邦随梯度下降算法 (FedSGD) 四.差分隐私随联邦梯度下降算法 (DP- ...

  7. ROS-激光雷达建立地图算法介绍

                                                      激光雷达建立地图算法介绍 建图算法: 1. hector_slam 要求: 高更新频率.小测量噪声的 ...

  8. TextRank算法介绍及实现

    目录 1.PageRank算法 2.TextRank算法 (1)关键词抽取(keyword extraction) (2)关键短语抽取(keyphrase extration) (3)关键句抽取(se ...

  9. 反汇编算法介绍和应用——递归下降算法分析

    上一篇博文我介绍了Windbg使用的线性扫描(linear sweep)反汇编算法.本文我将介绍IDA使用的递归下降(recursive descent)反汇编算法.(转载请指明来源于breaksof ...

最新文章

  1. 一步一步指引你在Windows7上配置编译使用Caffe(https://github.com/fengbingchun/Caffe_Test)
  2. QSignalMapper的使用
  3. 网络营销外包——网络营销外包专员浅析网站首页设计需要注意哪些
  4. http消息当中,post和get两种请求方式的区别
  5. 计算机联用测定无机盐溶解热测试题,计算机联用测定无机盐溶解热
  6. 剑指Offer 09 用两个栈实现队列
  7. Atitit TPL(事务处理语言 目录 1.1. 事务隔离级别 1 1.2. Savepoint技术 1 2. Tpl 1 2.1.  打开事务 START TRANSACTION; 1 2.2.
  8. cookie登录_使用UserAgent和Cookie安全登录Facebook账号[安全买号必读]
  9. 二维码上可以用精密光纤激光打标机打吗?
  10. echart添加文本_ECharts自定义富文本
  11. 3DS MAX 导入骨骼动画插件
  12. 【linux内核分析与应用-陈莉君】动手实践--内核多任务并发实例
  13. JAVA 实现语音播报
  14. 无线路由器开服务器玩游戏,游戏路由和普通无线路由器有什么区别?
  15. python中arcsec_Python中jpg图像的显示网格
  16. 九部比《五十度灰》更血脉喷张的电影,个个看完都会让人欲罢不能!
  17. Fanvas将旧网站的swf动画转为canvas,以解决移动端swf动画无法显示问题
  18. pandas 将重复表格去重,并重新转换为表格
  19. 无法安装CAD2010或其他软件,提示“无效驱动器D:\”用SUBST建立虚拟盘解决问题
  20. “智慧粮仓”守卫中国饭碗

热门文章

  1. Scrapy框架的学习(8.scrapy中settings.py里面配置说明以及怎样设置配置或者参数以及怎样使用)
  2. wxWidgets:在全局范围内捕捉关键事件
  3. boost::insert相关的测试程序
  4. boost::mp11::mp_with_index相关用法的测试程序
  5. boost::mp11::mp_map_erase相关用法的测试程序
  6. GDCM:从ELSCINT1读取Wave Information标签的测试程序
  7. Boost:以协程的方式实现聊天服务器的实例
  8. VTK:可视化之HanoiIntermediate
  9. VTK:Utilities之Timer
  10. VTK:IO之GLTFImporter