热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

详解TFIDF

文章目录1. TF-IDF概念2. sklearn中的TF-IDF2.1 sklearn中TF-IDF的公式及计算过程2.2 使用LightGBM进行文本分类2.3 小结3. jieba使用tf-id

文章目录

  • 1. TF-IDF概念
  • 2. sklearn中的TF-IDF
    • 2.1 sklearn中TF-IDF的公式及计算过程
    • 2.2 使用LightGBM进行文本分类
    • 2.3 小结
  • 3. jieba使用tf-idf提取关键词
    • 3.1 一行代码提取关键词
    • 3.2 具体实现
    • 3.3 小结
  • 4 总结


1. TF-IDF概念

TF-IDF是NLP中常用的方法,也比较经典,基本思想是:如果一个词在文档中出现了很多次,但是这个词在其它文档中出现的次数很少,则这个词对这篇文档很重要。在一定程度上这个词可以表达这篇文档的关键信息,所以在网页搜索、关键词提取中常用到TF-IDF。

TF-IDF就是tf−idf(t,d)=tf(t,d)×idf(t)tf-idf(t,d)=tf(t,d) \times idf(t)tfidf(t,d)=tf(t,d)×idf(t),公式中t代表词term,d代表文档document。其实就是TF与IDF相乘。

TF是词频term frequency ,idf是逆文档频率inverse document-frequency。频率与频数不同,这里的词频是指词的频数,也就是一个词在文档中出现的个数,比如“的”在一个文档中出现了128次数,则tf(t,d)=128tf(t,d)=128tf(t,d)=128,这个比较好理解。

逆文档频率:为什么要有IDF呢?如果只用TF会有什么问题呢?比如“的”在一个文档中出现128次,是整个文档中出现次数最多的词。但是这个词并没有什么意义。所以要求有意义的词在这篇文档中出现的次数多,但是在其它的文档中出现的少。我们理解的频率的概念是频数除以总数。“逆”就是倒过来的意思,为了防止分母为0,在分母上了个1,再做log处理。所以:
idf(t)=logn1+df(t)idf(t)=log\frac{n}{1+df(t)}idf(t)=log1+df(t)n
公式中nnn代表文档的总数,df(t)df(t)df(t)代表包含单词t的文档的个数。对于这个公式sklearn做了优化。

2. sklearn中的TF-IDF

2.1 sklearn中TF-IDF的公式及计算过程

在sklearn中 TfidfTransformerTfidfVectorizer 设置参数 smooth_idf=False时,IDF的计算公式,如下:idf(t)=logndf(t)+1idf(t)=log\frac{n}{df(t)}+1idf(t)=logdf(t)n+1
把分子中的1拿到了外边。如果smooth_idf=True时分子和分母同时加了1,做平滑处理。如下:
idf(t)=log1+n1+df(t)+1idf(t) = log\frac{1+n}{1+df(t)}+1idf(t)=log1+df(t)1+n+1
然后再l2l_2l2正则化:
vnorm=vv12+v22+...+vn2v_{norm}=\frac{v}{\sqrt{v_1^2+v_2^2+...+v_n^2}}vnorm=v12+v22+...+vn2

v
这个向量其实是每个词的权重(weight),一开始是用于信息检索(information retrieval),后来发现这个词向量在文本分类与文本聚类中也很有效果。或许会问,为什么要做正则化?有没有发现正则化后,两个向量的点乘就是这两个向量的余弦相似度了。

举个例子:

>>> from sklearn.feature_extraction.text import TfidfTransformer
>>> transformer = TfidfTransformer(smooth_idf=False)
>>> transformer
# 未做smooth处理
TfidfTransformer(smooth_idf=False)
# 有6个文档,每个文档有三个特征词,一行是一个文档。
>>> counts = [[3, 0, 1],
...[2, 0, 0],
...[3, 0, 0],
...[4, 0, 0],
...[3, 2, 0],
...[3, 0, 2]]
...
# 使用sklearn的
>>> tfidf = transformer.fit_transform(counts)
>>> tfidf
<6x3 sparse matrix of type &#39;<... &#39;numpy.float64&#39;>&#39;with 9 stored elements in Compressed Sparse ... format>>>> tfidf.toarray()
array([[0.81940995, 0. , 0.57320793],[1. , 0. , 0. ],[1. , 0. , 0. ],[1. , 0. , 0. ],[0.47330339, 0.88089948, 0. ],# 做smooth处理的
>>> transformer &#61; TfidfTransformer()
>>> transformer.fit_transform(counts).toarray()
array([[0.85151335, 0. , 0.52433293],[1. , 0. , 0. ],[1. , 0. , 0. ],[1. , 0. , 0. ],[0.55422893, 0.83236428, 0. ],[0.63035731, 0. , 0.77630514]])

TfidfVectorizer&#xff1a;

>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> vectorizer &#61; TfidfVectorizer()
# 直接把语料转换为if-idf的向量
>>> vectorizer.fit_transform(corpus)
<4x9 sparse matrix of type &#39;<... &#39;numpy.float64&#39;>&#39;with 19 stored elements in Compressed Sparse ... format>

这个例子中6篇文档3个特征的tf-idf的计算过程&#xff1a;

一共有6个文档&#xff0c;n&#61;6&#xff0c;特征词有三个&#xff0c;对于term1在所有的文档中都出现过&#xff0c;所以&#xff0c;df(t)term1&#61;6df(t)_{term1}&#61;6df(t)term1&#61;6&#xff0c;

对于doc1的第一个term的tf &#61; 3&#xff0c;所以tf−idfterm1&#61;tf∗idf(t)term1&#61;3×(log66&#43;1)&#61;3tf-idf_{term1}&#61; tf * idf(t)_{term1} &#61; 3 \times (log\frac{6}{6}&#43;1)&#61;3tfidfterm1&#61;tfidf(t)term1&#61;3×(log66&#43;1)&#61;3

对于doc2的第二个term的tf &#61; 0&#xff0c;所以tf−idfterm1&#61;tf∗idf(t)term1&#61;0×(log61&#43;1)&#61;0tf-idf_{term1}&#61; tf * idf(t)_{term1} &#61; 0 \times (log\frac{6}{1}&#43;1)&#61;0tfidfterm1&#61;tfidf(t)term1&#61;0×(log16&#43;1)&#61;0

对于doc1的第三个term的tf &#61; 1&#xff0c;所以tf−idfterm1&#61;tf∗idf(t)term1&#61;1×(log62&#43;1)&#61;2.0986tf-idf_{term1}&#61; tf * idf(t)_{term1} &#61; 1 \times (log\frac{6}{2}&#43;1)&#61;2.0986tfidfterm1&#61;tfidf(t)term1&#61;1×(log26&#43;1)&#61;2.0986

原始的tf-idf向量&#xff1a;[3, 0, 2.0986]
正则化&#xff1a;
[3,0,2.0986]32&#43;02&#43;2.09862&#61;[0.819,0,0.573]\frac{[3,0,2.0986]}{\sqrt{3^2&#43;0^2&#43;2.0986^2}}&#61;[0.819,0,0.573]32&#43;02&#43;2.09862

[3,0,2.0986]&#61;[0.819,0,0.573]
在sklearn中TfidfVecotrizerCountVectorizerTfidfTransformer的结合&#xff0c;可以直接把文本的语料转化为以词为特征的向量。其实这个向量就是一个文本转化为向量后的结果&#xff0c;如果不限定的话&#xff0c;是所有文本组成的词典的长度&#xff0c;但是可以根据max_dfmin_df来选择&#xff0c;超过max_df或低于min_df的词是不被选入词典的。max_df的默认值是1.0&#xff0c;也就是最高文档频率是没有限制的&#xff0c;min_df的默认值是1&#xff0c;也就是说单词要在所有的文档中有出现。特征是所有的转化为后向量可以用于文本分类或文本聚类。

2.2 使用LightGBM进行文本分类

使用的是sklearn中自带的文本样本20newsgroups数据集&#xff0c;一共有11314篇文档&#xff0c;20个类别。对样本向量化&#xff0c;再使用LightGBM对样本进行分类。对比了sklearn中两种tf-idf向量化的方式&#xff0c;向量化的结果是一样的。但是向量化后&#xff0c;数据比较稀疏&#xff0c;训练有点慢。不过仅仅使用这么稀疏的数据&#xff0c;而且使用的lgb的baseline模型&#xff0c;效果还是不错的了&#xff0c;最好的类别f1 score能到94%。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 小结


  • 文本需要切词&#xff0c;构建所有文本的词典&#xff1b;
  • 把词典的词作为样本的特征&#xff0c;特征值是每个词在文档中出现的次数&#xff1b;
  • 根据次数及tf-idf公式计算每个词的tf-idf值&#xff0c;然后l2正则化&#xff1b;经过tf-idf处理后的向量也可以作为文本的向量&#xff1b;
  • 样本的tf-id向量中权重比较大的词就可以作为样本的关键词&#xff1b;
  • 可以通过限制max_dfmin_df来限制样本的tf-idf向量的维度&#xff1b;
  • 所有样本的tf-idf matrix是一个稀疏矩阵&#xff0c;对于传统的机器学习算法不友好&#xff0c;训练时间比较长&#xff1b;所以后来word embedding就是把稀疏矩阵降维的&#xff1b;
  • 这种文本向量化的模型其实基于词袋模型(Bag of Word model)的。

3. jieba使用tf-idf提取关键词

3.1 一行代码提取关键词

from jieba import analyse
sentence &#61; "人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是计算机科学的一个分支&#xff0c;它企图了解智能的实质&#xff0c;并生产出一种新的能以人类智能相似的方式做出反应的智能机器&#xff0c;该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。人工智能从诞生以来&#xff0c;理论和技术日益成熟&#xff0c;应用领域也不断扩大&#xff0c;可以设想&#xff0c;未来人工智能带来的科技产品&#xff0c;将会是人类智慧的“容器”。人工智能可以对人的意识、思维的信息过程的模拟。人工智能不是人的智能&#xff0c;但能像人那样思考、也可能超过人的智能。人工智能是一门极富挑战性的科学&#xff0c;从事这项工作的人必须懂得计算机知识&#xff0c;心理学和哲学。人工智能是包括十分广泛的科学&#xff0c;它由不同的领域组成&#xff0c;如机器学习&#xff0c;计算机视觉等等&#xff0c;总的说来&#xff0c;人工智能研究的一个主要目标是使机器能够胜任一些通常需要人类智能才能完成的复杂工作。但不同的时代、不同的人对这种“复杂工作”的理解是不同的。2017年12月&#xff0c;人工智能入选“2017年度中国媒体十大流行语“。"
keywords &#61; analyse.extract_tags(sentence, topK&#61;10, withWeight&#61;False, allowPOS&#61;(), withFlag&#61;False)
print(keywords)
# [&#39;人工智能&#39;, &#39;智能&#39;, &#39;2017&#39;, &#39;机器&#39;, &#39;不同&#39;, &#39;人类&#39;, &#39;科学&#39;, &#39;模拟&#39;, &#39;一门&#39;, &#39;技术&#39;]

输入是一段字符串&#xff0c;输出关键词的list。
其中的参数&#xff1a;

  • sentence&#xff1a;需要提取关键词的字符串
  • topK&#xff1a;返回权重前top K个单词
  • withWeight&#xff1a;返回结果是否需要带tf-idf值
  • allowPOS&#xff1a;关键词的词性
  • withFlag&#xff1a;返回结果是否要带词性

使用起来确实简单&#xff0c;直接输入一段话就可以提取其中的关键词了。但是有一个问题是&#xff0c;idf的计算是需要看出现这个词的文档的个数&#xff0c;及总的文档数量的&#xff0c;jieba难道不需要么&#xff1f;

3.2 具体实现

jieba中有一个自带的idf.txt&#xff0c;第一列单词&#xff0c;第二列是idf。这个idf是通过离线训练好的。
在这里插入图片描述
jieba的tf-idf计算比较简单&#xff0c;源码如下&#xff1a;
在这里插入图片描述
有三步&#xff1a;

  • 第一步&#xff1a;对sentence分词&#xff0c;分词使用的HMM算法&#xff0c;当然&#xff0c;也是内置的转移矩阵、发射矩阵及初始概率。分词这个有时间可以写一下。
  • 第二步&#xff1a;统计sentence中每个单词的个数。具体实现是用一个dict放的&#xff0c;当然也根据参数allowPOS、stop_words&#xff0c;单词的长度(大于2)进行了过滤。
  • 第三步&#xff1a;计算tf-idf。idf是通过内置的idf.txt得到的&#xff0c;类初始化的时候会加载idf.txt文件为一个diict&#xff0c;即self.idf_freq。如果单词不在self.freq中时&#xff0c;返回的是平均的idf值self.median_idf。然后用第二步的tf值与得到idf相乘。至于为什么要除以一个total&#xff0c;我觉得是为了把tf-idf值变的小一些&#xff0c;比较容易比较大小&#xff0c;毕竟所有的tf-idf都除以一个正数对大小的比较没有影响。

3.3 小结


  • jieba的tf-idf值的计算&#xff0c;不需要输入多篇文档&#xff0c;只需要输入需要提取关键词的文档即可
  • 关键词可以有词性的限制
  • jieba是通过内置的idf来计算单词的tf-idf值的
  • 缺点&#xff1a;对于专业性比较强的文档&#xff0c;可能会有问题。毕竟jieba使用的训练样本是不清楚的。

4 总结
  • tf-idf的计算公式及优化
  • tf-idf的一个应用是基于词袋模型为文本提取特征向量&#xff0c;然后用于文本分类或聚类。优点是比较好理解 &#xff0c;缺点是matrix太稀疏&#xff0c;向量与向量之间的相似性不太靠谱。试想一下两个文档&#xff0c;里面所用的词不同&#xff0c;但是意思差不多&#xff0c;直观上两个向量应该是相似的。但是其实两个向量相乘的结果为零向量。词不相同&#xff0c;向量正交。
  • tf-idf的另一个应用是提取关键词&#xff0c;jieba的实现中是利用已经训练好的idf来作的&#xff0c;对于比较专业的领域可能会有偏差。如果有小伙伴儿知道jieba是用什么语料训练的&#xff0c;欢迎留言。

参考&#xff1a;

  • https://scikit-learn.org/stable/modules/feature_extraction.html#text-feature-extraction
  • https://lightgbm.readthedocs.io/en/latest/index.html
  • https://github.com/fxsjy/jieba

声明&#xff1a;原创文章&#xff0c;转载请注明出处。


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 本文整理了常用的CSS属性及用法,包括背景属性、边框属性、尺寸属性、可伸缩框属性、字体属性和文本属性等,方便开发者查阅和使用。 ... [详细]
  • 本博文基于《Amalgamationofproteinsequence,structureandtextualinformationforimprovingprote ... [详细]
  • 人工智能推理能力与假设检验
    最近Google的Deepmind开始研究如何让AI做数学题。这个问题的提出非常有启发,逻辑推理,发现新知识的能力应该是强人工智能出现自我意识之前最需要发展的能力。深度学习目前可以 ... [详细]
  • 马尔可夫决策过程Markov Decision Process,MDPKintoki
    Originalurl:http:www.tuicool.comarticlesb6BjAva1.马尔可夫模型的几类子模型我想大家一定听说过马尔科夫链(MarkovChain)& ... [详细]
  • 干货 | 携程AI推理性能的自动化优化实践
    作者简介携程度假AI研发团队致力于为携程旅游事业部提供丰富的AI技术产品,其中性能优化组为AI模型提供全方位的优化方案,提升推理性能降低成本࿰ ... [详细]
  • 鄂维南:从数学角度,理解机器学习的「黑魔法」,并应用于更广泛的科学问题...
    作者|Hertz来源|科学智能AISI北京时间2022年7月8日晚上22:30,鄂维南院士在2022年的国际数学家大会上作一小时大会报告(plenarytalk)。今 ... [详细]
  • 基于神经网络的智能对话系统(二)——机器学习背景知识
    2.机器学习背景知识本章简要回顾了深度学习和强化学习,这些学习与后续章节中的会话AI最相关。2.1机器学习基础Mitchell(1997)将机器学习广义地定义为包括任何计算机程序, ... [详细]
author-avatar
手机用户2602922857
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有