用TF-IDF处理文本数据

计算机擅长处理数字,但不擅长处理文本数据,TF-IDF是处理文本数据最广泛使用的技术之一,本文对它的工作原理以及它的特性进行介绍。

根据直觉,我们认为在文本数据分析中出现频率更高的单词应该具有更大的权重,但事实并非总是如此。诸如“the”、“will”和“you”等被称为停顿词的词在语料库中出现得最多,但意义不大。相反,那些罕见的词实际上是那些有助于区分数据的词,而且更有分量。

TF-IDF简介

TF-IDF代表“Term Frequency — Inverse Data Frequency(词频-逆文档频次)”,其数学含义如下:

Term Frequency (tf, 词频):给出语料库中每个文档中单词出现的频率。它是单词在文档中出现的次数与该文档中单词总数的比率,随着该单词在文档中出现次数的增加而增加,每个文档都有自己的词频:

t f i , j = n i , j ∑ k n i , j {tf}_{i,j}=\frac{n_{i,j}}{\sum_k{n_{i,j}}} tfi,j=kni,jni,j

Inverse Data Frequency(idf, 逆数据频率):用于计算语料库中所有文档中罕见词的权重,语料库中很少出现的词具有较高的IDF分数,它由下面的方程给出:

i d f ( ω ) = l o g ( N d f t ) idf(\omega)=log(\frac{N}{{df}_t}) idf(ω)=log(dftN)

结合这两者,我们得出了语料库中文档中单词的TF-IDF分数( ω \omega ω)。它是tf和idf的乘积:

t f i , j × l o g ( N d f i ) {tf}_{i,j} \times log(\frac{N}{{df}_i}) tfi,j×log(dfiN)
其中:

  • t f i , j {tf}_{i,j} tfi,j j j j i i i出现的次数;
  • d f i {df}_i dfi:包含 i i i的文件数;
  • N N N:文件总数。

让我们举一个例子来更清楚地理解。

句子1:The car is driven on the road.

句子2:The truck is driven on the highway.

在本例中,每个句子都是一个单独的文档,现在我们将计算上述两个代表语料库的文档的TF-IDF。

在这里插入图片描述

由上表可知,常用词的TF-IDF为零,说明常用词不显著。另一方面,“car”、“truck”、“road”、“highway”的TF-IDF是非零的,这些词更有意义。

基于python计算TF-IDF

  1. sklearn.feature_extraction.text导入TfidfVectorizer
    from sklearn.feature_extraction.text import TfidfVectorizer
  1. 初始化矢量器,然后调用fit并对其进行变换,以计算文本的TF-IDF分数。
    vectorizer = TfidfVectorizer()response = vectorizer.fit_transform([s1, s2])
s1 = "The car is driven on the road"
s2 = "The truck is driven on the highway"
from sklearn.feature_extraction.text import TfidfVectorizervectorizer = TfidfVectorizer()
response = vectorizer.fit_transform([s1, s2])

这里返回的是csr_matrix稀疏矩阵,可以通过response.todense()转换成numpy形式。

print(response)
  (0, 5)	0.42471718586982765(0, 4)	0.30218977576862155(0, 1)	0.30218977576862155(0, 3)	0.30218977576862155(0, 0)	0.42471718586982765(0, 6)	0.6043795515372431(1, 2)	0.42471718586982765(1, 7)	0.42471718586982765(1, 4)	0.30218977576862155(1, 1)	0.30218977576862155(1, 3)	0.30218977576862155(1, 6)	0.6043795515372431

看一下TfidfVectorizer的源码:
在下述代码中需要注意的一点是,sklearn将1添加到n_samples中以计算IDF分数,这确保了IDF分数为0的单词不会被完全抑制。

    def fit(self, X, y=None):"""Learn the idf vector (global term weights)Parameters----------X : sparse matrix, [n_samples, n_features]a matrix of term/token counts"""if not sp.issparse(X):X = sp.csc_matrix(X)if self.use_idf:n_samples, n_features = X.shapedf = _document_frequency(X)# perform idf smoothing if requireddf += int(self.smooth_idf)n_samples += int(self.smooth_idf)# log+1 instead of log makes sure terms with zero idf don't get# suppressed entirely.idf = np.log(float(n_samples) / df) + 1.0self._idf_diag = sp.spdiags(idf, diags=0, m=n_features,n=n_features, format='csr')return selfdef transform(self, X, copy=True):"""Transform a count matrix to a tf or tf-idf representationParameters----------X : sparse matrix, [n_samples, n_features]a matrix of term/token countscopy : boolean, default TrueWhether to copy X and operate on the copy or perform in-placeoperations.Returns-------vectors : sparse matrix, [n_samples, n_features]"""if hasattr(X, 'dtype') and np.issubdtype(X.dtype, np.floating):# preserve float family dtypeX = sp.csr_matrix(X, copy=copy)else:# convert counts or binary occurrences to floatsX = sp.csr_matrix(X, dtype=np.float64, copy=copy)n_samples, n_features = X.shapeif self.sublinear_tf:np.log(X.data, X.data)X.data += 1if self.use_idf:check_is_fitted(self, '_idf_diag', 'idf vector is not fitted')expected_n_features = self._idf_diag.shape[0]if n_features != expected_n_features:raise ValueError("Input has n_features=%d while the model"" has been trained with n_features=%d" % (n_features, expected_n_features))# *= doesn't workX = X * self._idf_diagif self.norm:X = normalize(X, norm=self.norm, copy=False)return X

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/618771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器人技能学习-构建自己的数据集并进行训练

概要 若想训练自己的场景,数据集的重要性不做过多赘述,下面就基于 robomimic 和 robosuite 构建自己的数据集进行讲解,同时,也会附上 train 和 run 的流程,这样,就形成了闭环。 自建数据集 采集数据 采…

【MATLAB】REMD_LSTM神经网络时序预测算法

有意向获取代码,请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 REMD-LSTM神经网络时序预测算法是一种结合了REMD(Reservoir Enhanced Multi-scale Deep Learning)算法和长短期记忆神经网络(LSTM)的时间序…

解决“Ubuntu系统与windows系统之间不能执行复制粘贴”之问题

在win11中,发现“Ubuntu系统与windows系统之间不能互相复制粘贴”,只能通过“FPT客户端FileZilla”才能交换文件,但遇到字符串,就没法实现了,因此,在两个系统之间实现互相复制和粘贴字符串,就很…

【Python数据可视化】matplotlib之绘制常用图形:折线图、柱状图(条形图)、饼图和直方图

文章传送门 Python 数据可视化matplotlib之绘制常用图形:折线图、柱状图(条形图)、饼图和直方图matplotlib之设置坐标:添加坐标轴名字、设置坐标范围、设置主次刻度、坐标轴文字旋转并标出坐标值matplotlib之增加图形内容&#x…

RK3568驱动指南|第十二篇 GPIO子系统-v

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

Java医院智能3D导诊系统源码 微信小程序源码

医院智慧3D导诊系统, 通过输入疾病症状和选择部位进行导诊挂号,支持小程序端、APP端 开发背景 人们经常去医院因为不知道挂什么科而烦恼,有些病人不方便问又不好意思问。在互联网医院中挂号且又不知该挂什么科,找什么类型的医生&…

JavaScript的变量详解

一、变量的声明和赋值 编程中的程序其本质就是处理数据的过程,当输入指令时,就可以输出相应的内容,在输入和输出之间就是处理数据的过程。处理的数据可能有多种,多个,这时就需要使用不同的名字来存储、区分和提取不同的…

rime中州韵小狼毫 LaTex输入法配置

本文的分享一种在rime中州韵小狼毫须鼠管输入法中配置LaTex输入方案的方法,并不完美,仅供参考。 先睹为快 LaTex输入方案可以快捷的在公式模式下输入一些基础的数学公式,选词快捷,录入体验优良。 latex.schema.yaml latex.sc…

PMP学习考试经验总结

PMP备考日程计划表 我的PMP的备考大概花了三个月的时间, 可以分为以下几个阶段: Week 1-4: 读完PMBoK 前面7个知识领域(中英文版PMBoK一起看)。每看完一个知识领域,就看参考书里面的相应章节(汪博士那本)…

七通道NPN 达林顿管GC2003,专为符合标准 TTL 而制造

GC2003 内部集成了 7 个 NPN 达林顿晶体管,连接的阵列,非常适合逻辑接口电平数字电路(例 如 TTL,CMOS 或PMOS 上/NMOS)和较高的电流/电压,如电灯电磁阀,继电器,打印机或其他类似的负…

使用python连接elasticsearch

有一个困惑了好久的问题,那就是从python里面连接elasticsearch总是报错。大致长这样 一开始我是看网上把es的安全功能关闭,也就是下面的内容,这个要进入到es的docker中去改config/elasticsearch.yml配置文件,但是这样改了以后kib…

数据结构——栈(Stack)

目录 1.栈的介绍 2.栈工程 2.1 栈的定义 2.1.1 单链表实现栈 2.1.2 数组实现栈 2.1.2.1 静态数组栈 2.1.2.2 动态数组栈 2.2 栈的函数接口 2.2.1 栈的初始化 2.2.2 栈的数据插入(入栈) 2.2.3 栈的数据删除(出栈) 2.2.…

每日一题——LeetCode1160.拼写单词

方法一 个人方法: 先统计chars里每个字符出现的次数,再对words里每个字符串统计每个字符出现的字符,当: 1、字符串里出现chars里没有的字符 2、字符串里某个字符出现的次数大于该字符在chars里出现的次数 以上两种情况则不符合…

基于微信小程序的音乐平台 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首音乐4.2 新增音乐4.3 新增音乐订单4.4 查询音乐订单4.5 新增音乐收藏 五、免责说明 一、摘要 1.1 项目介绍 基于微信小程序JAVAVueSpringBootMySQL的音乐平台,包含了音乐…

【MIT 6.S081】2020, 实验记录(3),Lab: page tables

目录 TaskTask 1: Print a page table Task Task 1: Print a page table 该实验需要增加一个 vmprint 函数,用于打印一个 page table,实现过程可以参考 vm.c 文件中的 freewalk() 函数。 在 defs.h 中增加 vmprint 的定义: void …

宝塔安装redis并且远程连接redis教程

第一步:搜索redis并安装 第二步:在防火墙添加端口6379 第三步:查看宝塔防火墙是否开启了6379端口 firewall-cmd --zonepublic --list-ports 很显然并没有开启 第四步:开启防火墙的6379端口 firewall-cmd --zonepublic --add-po…

【python】搭配Miniconda使用VSCode

现在的spyder总是运行出错,启动不了,尝试使用VSCode。 一、在VSCode中使用Miniconda管理的Python环境,可以按照以下步骤进行: a. 确保Miniconda环境已经安装并且正确配置。 b. 打开VSCode,安装Python扩展。 打开VS…

linux软件安装(yum命令)

1.Linux系统的应用商店 操作系统安装软件有许多种方式,一般分为: 下载安装包自行安装 如win系统使用exe文件、msi文件等如mac系统使用dmg文件、pkg文件等 系统的应用商店内安装 如win系统有Microsoft Store商店如mac系统有AppStore商店 Linux命令行…

qt学习:多界面跳转+信号+槽函数

目录 概念 分类 多界面编程思路 新建界面 注意 头文件 无数据传输跳转界面 有数据传输跳转界面 对象公有接口 界面之间数据传输 信号与槽函数进行数据传输跳转界面 信号: 槽: 概念 格式1 关联信号和发送信号 格式2 通信步骤 自定义信号和槽函数 总结 实…

精彩手绘全解:RAG技术,从入门到精通

本文整理自IVAN ILIN发布于Towards AI的博客[1]。感谢作者的精彩讲解。 深度学习自然语言处理 分享整理:Winnie 引言 检索增强生成(Retrieval Augmented Generation,简称RAG)为大型语言模型(LLMs)提供了从某…