使用sk-learn 理解TF-IDF

TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用的文本挖掘技术,用于评估一个词语在一组文档中的重要性。它广泛应用于信息检索和文本挖掘中,尤其是在搜索引擎和推荐系统中。

组成部分

TF-IDF 由两个部分组成:

TF(Term Frequency):表示某个词在文档中出现的频率。通常用该词在文档中出现的次数除以文档中的总词数来计算。

IDF(Inverse Document Frequency):衡量某个词对整个语料库的重要性。一个词在越少的文档中出现,它的 IDF 值就越高。

其中 ∣D∣|D|∣D∣ 是文档总数, ∣d∈D:t∈d∣|d \in D: t \in d|∣d∈D:t∈d∣ 是包含词 ttt 的文档数量。

TF-IDF的作用

  • 信息检索:TF-IDF 被广泛应用于搜索引擎中,用于评估文档与用户查询的相关性。相关性越高,文档的 TF-IDF 值越大。

  • 特征提取:在文本分类和聚类中,TF-IDF 可以作为特征向量,帮助机器学习模型理解文本内容。

  • 关键词提取:TF-IDF 可以用于自动提取文本中的关键词,帮助用户快速了解文档主题。

下面用一个简单例子说明TF-IDF 分析词语的重要性

import jieba
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformerarr = ['第一天我参观了美术馆','第二天我参观了博物馆','第三天我参观了动物园', ]arr = [' '.join(jieba.lcut(i)) for i in arr]  # 分词
print(arr)
# 返回结果:
# ['第一天 我 参观 了 美术馆', '第二天 我 参观 了 博物馆', '第三天 我 参观 了 动物园']vectorizer = CountVectorizer()
X = vectorizer.fit_transform(arr)
word = vectorizer.get_feature_names_out()
df = pd.DataFrame(X.toarray(), columns=word)
print(df)
# 返回结果:
# 动物园  博物馆  参观  第一天  第三天  第二天  美术馆
#  0       0      1     1      0      0       1
#  0       1      1     0      0      1       0
#  1       0      1     0      1      0       0transformer = TfidfTransformer()
tfidf = transformer.fit_transform(X)
weight = tfidf.toarray()
for i in range(len(weight)):  # 访问每一句print("第{}句:".format(i))for j in range(len(word)):  # 访问每个词if weight[i][j] > 0.05:  # 只显示重要关键字print(word[j], round(weight[i][j], 2))  # 保留两位小数
# 返回结果
# 第0句:美术馆 0.65 参观 0.39 第一天 0.65
# 第1句:博物馆 0.65 参观 0.39 第二天 0.65
# 第2句:动物园 0.65 参观 0.39 第三天 0.65

 中文分词

arr = [' '.join(jieba.lcut(i)) for i in arr]  # 分词
print(arr)
  • 使用 jieba.lcut 对每句话进行分词,并用空格连接分词结果。
  • 输出的结果为:
['第一天 我 参观 了 美术馆', '第二天 我 参观 了 博物馆', '第三天 我 参观 了 动物园']

词频矩阵

vectorizer = CountVectorizer()
X = vectorizer.fit_transform(arr)
word = vectorizer.get_feature_names_out()
df = pd.DataFrame(X.toarray(), columns=word)
print(df)
  • 使用 CountVectorizer 将分词后的文本转换为词频矩阵 X
  • get_feature_names_out() 获取所有的特征(词)。
  • 将词频矩阵转换为 Pandas DataFrame,以便于查看。
  • 输出的结果显示每个句子中每个词的出现次数。

计算 TF-IDF 值

transformer = TfidfTransformer()
tfidf = transformer.fit_transform(X)
weight = tfidf.toarray()
  • 使用 TfidfTransformer 将词频矩阵转换为 TF-IDF 矩阵 weight

输出重要关键词

for i in range(len(weight)):  # 访问每一句print("第{}句:".format(i))for j in range(len(word)):  # 访问每个词if weight[i][j] > 0.05:  # 只显示重要关键字print(word[j], round(weight[i][j], 2))  # 保留两位小数

通过这种方式,可以分析文本数据中每个词的重要性,常用于信息检索和文本挖掘任务。

下面使用 Yet Another Chinese News Dataset 进行文本挖掘
它包含新闻的标题+内容+图片+url,包含简体中文和繁体中文
~140k条信息

修改数据集的输入

import pandas as pd
import jieba
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer# 读取数据集
data = pd.read_csv('news_collection.csv')  # 替换为实际的文件路径
# 假设数据集中有一列名为 'content',存储新闻内容
news_contents = data['desc'].tolist()# 分词
news_contents_segmented = [' '.join(jieba.lcut(str(content))) for content in news_contents]# 词频矩阵
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(news_contents_segmented)
word_list = vectorizer.get_feature_names_out()# 创建词频 DataFrame
df = pd.DataFrame(X.toarray(), columns=word_list)
print("词频矩阵:")
print(df)# 计算 TF-IDF 值
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(X)
weight = tfidf.toarray()# 输出每条新闻中重要的关键词
print("\nTF-IDF 重要关键词:")
for i in range(len(weight)):print("第{}条新闻:".format(i + 1))for j in range(len(word_list)):if weight[i][j] > 0.05:  # 只显示重要关键字print(word_list[j], round(weight[i][j], 2)) 

输出这样词频

一段 0.1
不論 0.11
他們 0.07
保育 0.11
優游 0.18
公尺 0.1
共舞 0.16
反應 0.1
反而 0.1
可能 0.06
周遭 0.13
夏威夷 0.25
大白 0.15
尖叫 0.15
就算 0.11
巧遇 0.14
巨型 0.13
影像 0.11
最大 0.08
本月 0.19
水下 0.14
活動時 0.12
海洋 0.2
珍貴 0.13
留下 0.1
當下 0.12
當地 0.09
研究者 0.14
第一 0.08
美國 0.05
聽到 0.12
著離 0.17

在获取每个词的重要性(TF-IDF 值)后,你可以进行多种后续分析和处理。

生成词云是一个比较直观的应用方式

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

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

相关文章

【漏洞复现】|百易云资产管理运营系统/mobilefront/c/2.php前台文件上传

漏洞描述 湖南众合百易信息技术有限公司(简称:百易云)成立于2017年是一家专注于不动产领域数字化研发及服务的国家高新技术企业,公司拥有不动产领域的数字化全面解决方案、覆盖住宅、写字楼、商业中心、专业市场、产业园区、公建、…

网络层协议IP

对于网络层我们直接通过IP协议来了解其内容 一.IP协议 首先我们先来了解几个概念: 主机:配有IP地址,但是不进行路由控制的设备 路由器:配有IP地址,同时进行路由控制的设备 节点:主机和路由器的统称 所以现在…

道品智能科技移动式水肥一体机:农业灌溉施肥的革新之选

在现代农业的发展进程中,科技的力量正日益凸显。其中,移动式水肥一体机以其独特的可移动性、智能化以及实现水肥一体化的卓越性能,成为了农业领域的一颗璀璨新星。它不仅改变了传统的农业灌溉施肥方式,更为农业生产带来了高效、精…

数据结构 (10)队列

前言 队列是一种特殊的数据结构,它遵循先进先出(FIFO,First In First Out)的原则。 一、定义与基本概念 定义:队列是一种只允许在一端(队尾)进行插入操作,而在另一端(队头…

【数据分享】2001-2023年我国30米分辨率冬小麦种植分布栅格数据(免费获取)

小麦、玉米、水稻等各类农作物的种植分布数据在农业、环境、国土等很多专业都经常用到! 本次给大家分享的是我国2001-2023年逐年的30米分辨率冬小麦种植分布栅格数据!数据格式为TIFF格式,数据坐标为GCS_WGS_1984。该数据包括我国11个省份的冬…

17.5k Star,ThingsBoard 一款开源、免费、功能全面的物联网 IoT 平台 -慧知开源充电桩平台

项目介绍 ThingsBoard是一个开源、免费、功能全面、灵活易用的物联网(IoT)平台,专注于数据收集、处理、可视化以及设备管理。它提供了一个全面的解决方案,用于构建和管理物联网应用。支持从各种设备收集数据,通过内置…

力扣面试150 填充每个节点的下一个右侧节点指针 II BFS 逐层构建法

Problem: 117. 填充每个节点的下一个右侧节点指针 II 🍻 BFS 空间优化 👩‍🏫 参考题解 ⏰ 时间复杂度: O ( n ) O(n) O(n)🌎 空间复杂度: O ( 1 ) O(1) O(1) class Solution {public Node connect(Node root) {if (root …

ElasticSearch学习篇18_《检索技术核心20讲》LevelDB设计思想

目录 一些常见的设计思想以及基于LSM树的LevelDB是如何利用这些设计思想优化存储、检索效率的。 几种常见的设计思想 索引和数据分离减少磁盘IO读写分离分层思想 LevelDB的设计思想 读写分离设计分层设计与延迟合并LRU缓存加速检索 几种常见设计思想 索引与数据分离 索引…

LabVIEW Real-Time 的特点

LabVIEW Real-Time(简称 LabVIEW RT)是为实时系统设计的软件平台,结合 NI 硬件(如 CompactRIO 和 PXI 系列),能够在高可靠性、高性能要求的场景中实现稳定的实时控制与数据处理。以下是它的主要用处和特点&…

使用脚本实现hadoop-yarn-flink自动化部署

本文使用脚本实现hadoop-yarn-flink的快速部署(单机部署)。 环境:①操作系统:CentOS 7.6;②CPU:x86;③用户:root。 1.前置条件 把下面的的脚本保存到“pre-install.sh”文件&#x…

【JUC-Interrupt】中断相关概念

线程中断 一、相关概念二、API2.1、isInterrupted方法2.2、interrupted方法2.3、interrupt 三、总结: 一、相关概念 一个线程不应该由其他线程中断或停止,应该有线程自己来决定。 在Java中没有办法立即停止一个线程,因此提供了用于停止线程…

javascript基础学习

什么是伪代码 伪代码(Pseudocode)是一种介于自然语言和编程语言之间的算法描述方式。它使用类似自然语言的语句来描述程序的逻辑和流程,但又采用了编程语言中的一些结构和控制语句,如循环、条件判断等。 伪代码的目的是在不涉及具体编程语言语法细节的情况下,清晰地表达…

Django+Nginx+uwsgi网站Channels+redis+daphne多人在线聊天实现粘贴上传图片

在DjangoNginxuwsgi网站Channelsredisdaphne多人在线的基础上(详见DjangoNginxuwsgi网站使用Channelsredisdaphne实现简单的多人在线聊天及消息存储功能-CSDN博客),实现在输入框粘贴或打开本地图片,上传到网站后返回图片路径&…

C++ —— 以真我之名 如飞花般绚丽 - 智能指针

目录 1. RAII和智能指针的设计思路 2. C标准库智能指针的使用 2.1 auto_ptr 2.2 unique_ptr 2.3 简单模拟实现auto_ptr和unique_ptr的核心功能 2.4 shared_ptr 2.4.1 make_shared 2.5 weak_ptr 2.6 shared_ptr的缺陷:循环引用问题 3. shared_ptr 和 unique_…

vulnhub靶场之breakout

empire靶场2 前言 靶机:breakout 攻击:kali 续接上个靶场empire1的继续学习 主机发现 使用arp-scan扫描或者直接查看虚拟机的ip地址 信息收集 使用nmap扫描 端口80apache 2.4.51开启smb服务的两个端口139、445,版本4.6.2两个http服务采…

今天你学C++了吗?——C++中的类与对象(第二集)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

聚划算!一区算法!双分解+牛顿拉夫逊优化+深度学习!CEEMDAN-VMD-NRBO-Transformer多元时序预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CEEMDAN-Kmeans-VMD-NRBO-Transformer融合K均值聚类的数据双重分解牛顿-拉夫逊优化算法Transformer多元时间序列预测(完整源码和数据)运行环境Matlab2023b及以上。 2.CEEMDAN分解…

C++设计模式-中介者模式

动机(Motivation) 多个对象相互关联的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。在这种情况下,可以使用一种”中介对象“来管理对象间的关联关系,避免…

滑动窗口篇——如行云流水般的高效解法与智能之道(2)

前言: 上篇我们介绍了滑动窗口的含义并结合基础题型加以练习,本篇将以进阶难度的题目为索引,深化对于滑动窗口的运用与理解。 一. 将x减到0的最小操作数 题目链接:1658. 将 x 减到 0 的最小操作数 - 力扣(LeetCode&am…

EG3D: Efficient Geometry-aware 3D Generative Adversarial Networks 学习笔记

1 Contributions 混合显式-隐式网络架构:提出了一种 Tri-plane 的3D表征方法,结合显式体素网格与隐式解码器的优点 速度快,内存效率高; 支持高分辨率生成,保持3D表征的灵活性和表达能力。与纯显式或隐式方法相比&#…