Coggle 30 Days of ML(23年7月)任务三:使用TFIDF提取文本特征

news2024/12/26 2:46:48

Coggle 30 Days of ML(23年7月)任务三:使用TFIDF提取文本特征

任务三:使用TFIDF提取文本特征

  • 说明:在这个任务中,需要使用Sklearn库中的TFIDF技术来提取文本特征,将文本转化为可供机器学习算法使用的数值表示。
  • 实践步骤:
    1. 准备文本数据集。
    2. 使用Sklearn的TfidfVectorizer类,设置相应的参数(如ngram_rangemax_features等)来构建TFIDF特征提取器。
    3. 使用TfidfVectorizerfit_transform()方法,对文本数据集进行特征提取,得到TFIDF特征矩阵。

TfidfVectorizer是scikit-learn库中的一个文本特征提取工具,用于将文本数据转换为TF-IDF特征表示。下面是对TfidfVectorizer函数的功能和常用超参数的介绍:

  • ngram_range:特征中要包含的n元语法范围,默认为(1, 1),表示只提取单个词。
  • max_df:单词的最大文档频率,超过该频率的单词将被忽略,默认为1.0,表示不忽略任何单词。
  • min_df:单词的最小文档频率,低于该频率的单词将被忽略,默认为1,表示不忽略任何单词。

TFIDF算法

简单来说,向量空间模型就是希望把查询关键字和文档都表达成向量,然后利用向量之间的运算来进一步表达向量间的关系。比如,一个比较常用的运算就是计算查询关键字所对应的向量和文档所对应的向量之间的 “相关度”。

简单解释TF-IDF

TF (Term Frequency)—— “单词频率”

意思就是说,我们计算一个查询关键字中某一个单词在目标文档中出现的次数。举例说来,如果我们要查询 “Car Insurance”,那么对于每一个文档,我们都计算“Car” 这个单词在其中出现了多少次,“Insurance”这个单词在其中出现了多少次。这个就是 TF 的计算方法。

TF 背后的隐含的假设是,查询关键字中的单词应该相对于其他单词更加重要,而文档的重要程度,也就是相关度,与单词在文档中出现的次数成正比。比如,“Car” 这个单词在文档 A 里出现了 5 次,而在文档 B 里出现了 20 次,那么 TF 计算就认为文档 B 可能更相关。

然而,信息检索工作者很快就发现,仅有 TF 不能比较完整地描述文档的相关度。因为语言的因素,有一些单词可能会比较自然地在很多文档中反复出现,比如英语中的 “The”、“An”、“But” 等等。这些词大多起到了链接语句的作用,是保持语言连贯不可或缺的部分。然而,如果我们要搜索 “How to Build A Car” 这个关键词,其中的 “How”、“To” 以及 “A” 都极可能在绝大多数的文档中出现,这个时候 TF 就无法帮助我们区分文档的相关度了。

IDF(Inverse Document Frequency)—— “逆文档频率”

就在这样的情况下应运而生。这里面的思路其实很简单,那就是我们需要去 “惩罚”(Penalize)那些出现在太多文档中的单词。

也就是说,真正携带 “相关” 信息的单词仅仅出现在相对比较少,有时候可能是极少数的文档里。这个信息,很容易用 “文档频率” 来计算,也就是,有多少文档涵盖了这个单词。很明显,如果有太多文档都涵盖了某个单词,这个单词也就越不重要,或者说是这个单词就越没有信息量。因此,我们需要对 TF 的值进行修正,而 IDF 的想法是用 DF 的倒数来进行修正。倒数的应用正好表达了这样的思想,DF 值越大越不重要。

TF-IDF 算法主要适用于英文,中文首先要分词,分词后要解决多词一义,以及一词多义问题,这两个问题通过简单的tf-idf方法不能很好的解决。于是就有了后来的词嵌入方法,用向量来表征一个词。

TfidfVectorizer

https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html

from sklearn.feature_extraction.text import TfidfVectorizer

tfidf = TfidfVectorizer()
tfidf.fit(train_data['content'].apply(lambda x: ' '.join(x)))
train_tfidf_feat = tfidf.transform(train_data['content'].apply(lambda x: ' '.join(x)))
test_tfidf_feat = tfidf.transform(train_data['content'].apply(lambda x: ' '.join(x)))

tfidf = TfidfVectorizer(ngram_range=(1,2), max_features=5000)
tfidf.fit(train_data['content'].apply(lambda x: ' '.join(x)))
train_tfidf_feat = tfidf.transform(train_data['content'].apply(lambda x: ' '.join(x)))
test_tfidf_feat = tfidf.transform(train_data['content'].apply(lambda x: ' '.join(x)))

在上述的样例中,对于数据来说,第一个使用全部的默认参数,第二个tfidf设置了两个参数,分别是ngram_rangemax_features

ngram_range:特征中要包含的n元语法范围,默认为(1, 1),表示只提取单个词。但是这里设置为(1,2),也就是ngram_range=(1, 2) 表示同时提取单个词和连续的两个词作为特征。

max_features:用于指定特征向量的最大维度或特征数量。在这个例子中,max_features=5000表示只选择最重要的5000个特征(根据TF-IDF权重进行排序),并且将它们作为特征向量的维度。

依据当前的方法和给出的例子,我最后也是用了TfidfVectorizer来进行取文本特征。

tfidf = TfidfVectorizer(token_pattern=r'\w{1}', max_features=4000, ngram_range=(1, 2))
train_tfidf = tfidf.fit_transform(train_data['content'])
test_tfidf = tfidf.fit_transform(test_data['content'])

当设置 token_pattern=r'\w{1}' 时,TfidfVectorizer 使用正则表达式模式 \w{1} 来确定什么样的字符串将被视为一个令牌(token)。

在这个模式中,\w 表示匹配任何字母、数字或下划线字符。{1} 表示前面的模式(\w)必须出现一次,即仅匹配一个字符。

因此,token_pattern=r'\w{1}' 表示令牌被定义为只包含一个字母、数字或下划线字符的字符串,包括长度为1的字符串。

使用这个正则表达式模式,TfidfVectorizer 将会将长度为1的字符串视为有效的令牌,并将其作为特征进行提取和表示。

请注意,根据具体的应用场景和文本数据的特点,可以调整 token_pattern 的正则表达式模式以定义不同的令牌化规则。

不过我认为应该是连着的数字是为一个令牌,所以我继续修改,最后得到

tfidf = TfidfVectorizer(token_pattern=r'(?u)\b\w\w+\b', max_features=4000, ngram_range=(1, 2))
train_tfidf = tfidf.fit_transform(train_data['content'])
test_tfidf = tfidf.fit_transform(test_data['content'])
  1. (?u): 这是一个正则表达式标记,表示启用 Unicode 匹配模式。它确保正则表达式可以正确处理 Unicode 字符。
  2. \b: 这表示一个单词边界,用于确保令牌的两侧是单词边界。它防止了令牌与其他字符连在一起的情况。
  3. \w\w+: 这表示匹配由至少两个字母、数字或下划线字符组成的字符串。\w 表示匹配任何字母、数字或下划线字符,而 + 表示前面的模式(\w)必须出现一次或多次。
  4. \b: 再次使用单词边界,确保令牌的结尾是一个单词边界。

因此,token_pattern=r'(?u)\b\w\w+\b' 表示令牌由两个或更多个字母、数字或下划线字符组成的字符串构成,并且令牌的两侧是单词边界。这样的模式将会匹配长度大于等于2的连续字符序列作为令牌。

TfidfVectorizer 将使用这个正则表达式模式进行令牌化,生成相应的 TF-IDF 特征向量。这样,连续的长度大于等于2的字符序列将作为一个令牌被考虑,并用于计算 TF-IDF 权重。不过这样就会忽略长度为1的字符序列了,后续也可以进行改进。

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

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

相关文章

数分面试题:赛马问题

问题一: 25匹马,一个赛道,每次可以跑5匹马,在没有计时器的情况下,怎么用最小的比赛次数知道最快的前三名 关键点:通过前面的比赛,排除掉没有悬念的马(能确定有3匹马比它快的&#…

Iptables与Firewalld

Iptables防火墙 介绍 iptables和netfilter是一套Linux防火墙工具,共同合作完成系统防护工作。iptables 是一个包过滤防火墙,可以对包进行封装、过滤、重定向或者网络地址转换、地址伪装、透明代理、访问控制、连接跟踪等功能,iptables是一个…

4.6 x64dbg 内存扫描与查壳实现

LyScript 插件中默认提供了多种内存特征扫描函数,每一种扫描函数用法各不相同,在使用扫描函数时应首先搞清楚不同函数之间的差异,本章内容将分别详细介绍每一种内存扫描函数是如何灵活运用,并实现一种内存查壳脚本,可快…

Linux常用命令——exec命令

在线Linux命令查询工具 exec 调用并执行指定的命令 补充说明 exec命令用于调用并执行指令的命令。exec命令通常用在shell脚本程序中,可以调用其他的命令。如果在当前终端中使用命令,则当指定的命令执行完毕后会立即退出终端。 语法 exec(选项)(参数…

计算机组成原理32位MIPS CPU设计实验(指令译码器电路设计 、时序发生器状态机设计、时序发生器输出函数、硬布线控制器)

实验四 32位MIPS CPU设计实验 这次实验是32位MIPS CPU设计实验(单总线CPU-定长指令周期-3级时序),在头歌当中一共需要我们进行六道题的测试,分别为MIPS指令译码器设计,定长指令周期(时序发生FSM设计,时序发…

数据结构05:树与二叉树[C++][哈夫曼树HuffmanTree]

图源:文心一言 考研笔记整理6k字,小白友好、代码可跑,请小伙伴放心食用~~🥝🥝 第1版:查资料、画导图、画配图~🧩🧩 参考用书:王道考研《2024年 数据结构考研复习指导》…

一纸文书之MySQL的回忆录

MySQL要点学习:你可以在简历上说熟悉MySQL 什么是数据库?什么是数据库管理系统?什么是MySQL?什么是SQL?数据库数据库管理系统:SQL:结构化查询语言三者之间的关系 安装MySQL数据库管理系统MySQL常…

数据增强之裁剪、翻转与旋转

文章和代码已经归档至【Github仓库:https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 pytorch教程 也可获取。 文章目录 数据增强 Data Augmentation裁剪Croptransforms.CenterCroptransforms.RandomCroptransforms.RandomResizedCroptra…

【雕爷学编程】Arduino动手做(153)---2.4寸TFT液晶触摸屏模块7

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

TortoiseGit 入门指南02:创建和克隆仓库

图标 本节讲解如何使用 TortoiseGit 创建和克隆仓库。但在此之前,我们先来看下 TortoiseGit 软件的一个特色:图标。 TortoiseGit 会给 工作区 中的文件和文件夹叠加图标(Icon Overlays),图标反应的是这些文件和文件夹…

跳表很难吗?手把手教你如何跳跃它!

文章目录 Ⅰ. 前言Ⅱ. 跳表(skiplist)1、什么是跳表2、跳表的发明历程3、跳表的搜索方式 Ⅲ. skiplist的算法性能分析1、理论准备2、性能分析(了解即可,主要记结论) Ⅳ. skiplist与平衡树、哈希表的比较Ⅴ. skiplist的…

【数字信号处理】线性调频Z(Chirp-Z,CZT)算法详解

CZT变换算法的引入 CZT算法的基本原理 注意:这里所要分析的复频谱点数为 M M M,这也是CZT变换之后的点数。

MySQL之DML和DDL

1、显示所有职工的基本信息: 2、查询所有职工所属部门的部门号,不显示重复的部门号。 3、求出所有职工的人数。 4、列出最高工和最低工资。 5、列出职工的平均工资和总工资。 6、创建一个只有职工号、姓名和参加工作的新表,名为工作日期表。 …

CentOS环境下的MYSQL8安装

MySQL 安装 参考连接:https://www.cnblogs.com/jasonx1an/p/16690866.html 下载 下载网址:https://dev.mysql.com/downloads/mysql/ 卸载 mariadb 查看 mariadb rpm -qa|grep mariadb卸载 mariadb rpm -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps再…

深度学习调参技巧

一、常用的网络模型训练技巧? 使用更大的 batch size。使用更大的 batch size 可以加快训练的进度。但是对于凸优化问题,收敛速度会随着 batch size 的增加而降低。所以在相同的 epoch 下,使用更大的 batch size 可能会导致验证集的 acc更低…

Unittest加载执行用例的方法总结

目录 前言 方式1 方式2 方式3 方式4 方式5 方式6 方式7 总结 前言 说到测试框架,unittest是我最先接触的自动化测试框架之一了, 而且也是用的时间最长的, unittest框架有很多方法加载用例,让我们针对不同的项目&#xff0…

23 | MySQL是怎么保证数据不丢的?

以下内容出自《MySQL 实战 45 讲》 23 | MySQL是怎么保证数据不丢的? binlog 的写入机制 1、事务执行过程中,先把日志写到 binlog cache,事务提交的时候,再把 binlog cache 写到 binlog 文件中。 2、一个事务的 binlog 是不能被…

rust学习-所有权

运行程序必须管理使用内存的方式 (1)一些语言中具有垃圾回收机制,程序运行时不断寻找不再使用的内存 (2)一些语言中,开发者必须亲自分配和释放内存 (3)Rust 通过所有权系统管理内存…

Windows操作系统安全加固

Windows操作系统安全加固 一、安全加固基本思路1.1、安全基线1.2、系统信息审查 二、Windows安全配置加固2.1、漏洞修复——补丁安装2.2、漏洞修复——端口封禁2.2.1、windows高危端口加固实践——封禁135端口对外开放 2.3、安全配置加固——账号口令 一、安全加固基本思路 1.…