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

TFIDF的原理与实际应用

TF-IDF的原理与实际应用一、TF-IDF简介TF-IDF(termfrequency-inversedocumentfrequency)是一种统计方法,用以评估一

TF-IDF的原理与实际应用

在这里插入图片描述

一、TF-IDF简介


TF-IDF(term frequency-inverse document frequency) 是一种统计方法,用以评估一个字词对于一个文本集或一个语料库中的其中一份文件的重要程度,是用于信息检索和文本挖掘的常用加权技术。
tf-idf = tf(词频) × idf (逆向文档频率) 利用逆向文档频率来控制约束词频
tf = n / N
n: 词语在某篇文本中出现的频率 ;
n / N 的目的是实现归一化, N :该文件中所有词汇的数目
idf = log(D / d)
D: 总的文档数
d: 词语所在的文档数


在公式中,我们能够发现,总的文档数是固定不变的,词语所在的文档数越少,idf值越大;词语所在的文档数越多,idf值越小。
这样的话,我们总体来看,tf-idf的值会与tf(词语的频率)成正比,但是会随着词语所在的文档数越多而减少。这样,tf-idf就达到了突出重要词语,抑制次要词语的效果

二、TF-IDF的缺陷
单纯的认为频率越小的词越重要;频率越大的词越无用;同时无法体现上下文信息。
三、sklearn中的TF-IDF
https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html?highlight=tfidf#sklearn.feature_extraction.text.TfidfVectorizer


tf = n 没有对tf进行归一化 ,但是对 tf-idf的整个值进行了归一化
idf = log[ ( D + 1 ) / (d + 1) ] + 1 平滑处理保证分母不为0
注: sklearn是一个开源的基于python语言的机器学习工具包。它通过NumPy, SciPy和Matplotlib等python数值计算的库实现高效的算法应用,并且涵盖了几乎所有主流机器学习算法。分类classification、回归 regression、聚类 clustering、降维 dimensionality reduction 、模型选择 model selection 、预处理 preprocessing


四、归一化问题
(一)不归一化

from sklearn.feature_extraction.text import TfidfVectorizer
# 使用之前实例化 tf实例
tv = TfidfVectorizer(use_idf=True, smooth_idf=True, norm=None) # norm=None表示不做归一化处理,默认采用l2的方式
# 输入训练集矩阵,每行表示一个文本
# train = ["Chinese Beijing Chinese",
# "Chinese Chinese Shanghai",
# "Chinese Macao",
# "Tokyo Japan Chinese"]
train = ["I love nlp nlp","nlp loves me","I love China","China Chinese"]
# 训练,构建词汇表以及词项idf值,并将输入文本列表转成VSM矩阵形式(向量空间模型)
tv_fit = tv.fit_transform(train)
# 打印构建的词汇表
print(tv.get_feature_names()) tv_fit.toarray().tolist() # 将每个词对应的tf-idf值以列表的形式输出 由于没有采用归一化,这样tf-idf的值就不会在0-1之间

在这里插入图片描述
为了验证,我们可以通过公式进行计算:
以词语 nlp 为例,在第一篇文档中出现的次数为2,所有文档中包含nlp的文档数为2

import math
tf = 2
idf = math.log((4+1)/(2+1))+1
print(tf*idf)

在这里插入图片描述
可以看到两者值相等。
(二)以l2的方式归一化
在这里插入图片描述
从sklearn提供的官方文档中,我们可以发现,sklearn默认以l2的方式进行归一化操作;
l2: sum of sqquares of vector elements is 1. 每一行的平方和为1

tv = TfidfVectorizer(use_idf=True, smooth_idf=True,norm = 'l2')#Sum of squares of vector elements is 1 表示 每一行平方和为1
# 输入训练集矩阵,每行表示一个文本
train = ["I love nlp nlp","nlp loves me","I love China","China Chinese"]
# 训练,构建词汇表以及词项idf值,并将输入文本列表转成VSM矩阵形式
tv_fit = tv.fit_transform(train)
# 查看一下构建的词汇表
print(tv.get_feature_names())# 查看输入文本列表的VSM矩阵
tv_fit.toarray().tolist()

在这里插入图片描述

通过验证:
在这里插入图片描述
(三)以l1的方式归一化
l1:Sum of absolute values of vector elements is 1. 每一行的绝对值之和为1

from sklearn.feature_extraction.text import TfidfVectorizer
# 表示l1归一化的方式为每一行相加之和为1
tv = TfidfVectorizer(use_idf=True, smooth_idf=True,norm = 'l1') # l1 Sum of absolute values of vector elements is 1
# 输入训练集矩阵,每行表示一个文本
train = ["I love nlp nlp","nlp loves me","I love China","China Chinese"]
# train = ["我 爱 自然语言处理",
# "自然语言处理 也爱 我",
# "我 是 中国人",
# "自然语言处理 是一门 课程"]
# 训练,构建词汇表以及词项idf值,并将输入文本列表转成VSM矩阵形式
tv_fit = tv.fit_transform(train)
# 查看一下构建的词汇表
print(tv.get_feature_names())
# 查看输入文本列表的VSM矩阵
tv_fit.toarray().tolist()

在这里插入图片描述
验证:
在这里插入图片描述
(四)传统方式归一化
需要导入TfidfTransformer和CountVectorizer这两个第三方库

from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.preprocessing import Normalizer # sklearn中实现归一化的方法Normalizer
vectorizer = CountVectorizer() # 实例化 计数文本中出现的单词个数
transformer = TfidfTransformer(norm = None)
# corpus = ["我 来到 中国 旅游", "中国 欢迎 你","我 喜欢 来到 中国 天安门"]
train = ["I love nlp nlp","nlp loves me","I love China","China Chinese"]

norm1 = Normalizer(norm='l1') # 采用l1的方式 相加之和为1
a = vectorizer.fit_transform(train)
print(vectorizer.get_feature_names())
print(a.toarray().tolist()) # 制作频率统计的矩阵之后就可以对矩阵进行归一化

在这里插入图片描述

a = norm1.fit_transform(a)
print(a.toarray().tolist()) # n/N 1/3 2/3

在这里插入图片描述

result_list2 = transformer.fit_transform(a).toarray().tolist()
word = vectorizer.get_feature_names()
#print(transformer.get_params())
print('词典为:')
print(word)
print('tf-idf值(没有归一化)为:')
for weight in result_list2:print(weight)

在这里插入图片描述

import math
tf =2/3
idf = math.log((4+1)/(2+1))+1
tf*idf

在这里插入图片描述


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 本博文基于《Amalgamationofproteinsequence,structureandtextualinformationforimprovingprote ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 关于如何快速定义自己的数据集,可以参考我的前一篇文章PyTorch中快速加载自定义数据(入门)_晨曦473的博客-CSDN博客刚开始学习P ... [详细]
  • 【疑难杂症】allennlp安装报错:Installing build dependencies ... error
    背景:配置PURE的算法环境,安装allennlp0.9.0(pipinstallallennlp0.9.0)报错ÿ ... [详细]
author-avatar
mobiledu2502891283
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有