使用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年是一家专注于不动产领域数字化研发及服务的国家高新技术企业,公司拥有不动产领域的数字化全面解决方案、覆盖住宅、写字楼、商业中心、专业市场、产业园区、公建、…

408数据结构:栈、队列和数组选择题做题笔记

408数据结构 第一章 绪论 第二章 线性表 绪论、线性表选择题做题笔记 第三章 栈、队列和数组 栈、队列和数组选择题做题笔记 文章目录 408数据结构前言 一、队列二、栈和队列的应用总结 前言 本篇文章为针对王道25数据结构课后习题的栈、队列和数组的做题笔记,后续…

临床检验方法与仪器 第四部分作业:细胞及分子生物学检验仪器

临床检验方法与仪器 第四部分作业 调研“细胞及分子生物学检验仪器”中哪些有国产品牌,说明产品类型及名称,并分析我国产品与国际品牌产品的优势和不足。如果只有国外产品,请说明主要品牌名称和产品优势。 细胞及分子生物学检验仪器包括&…

快速排序&Lambda表达式

快速排序 912. 排序数组 #include <iostream> #include <vector> #include <ctime> #include <algorithm> // 用于交换函数swapusing namespace std;class Solution { public:// 函数功能&#xff1a;对给定数组nums的指定区间[l, r]进行划分操作&am…

网络层协议IP

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

cryptography与zlib系列:数据分块解密与解压

cryptography与zlib系列&#xff1a;数据分块解密与解压 数据分块压缩与加密可以查看我的另外一篇博客&#xff0c;这里与之相对应的是解密与解压的操作。解压之后的数据转为BytesIO对象用于后续读取&#xff0c;适用于大部分数据格式&#xff0c;而不需要从文件中读取。 完整…

react函数式组件中的路由传参方式

React Router 提供了多种方式来传递路由参数&#xff1a; URL 路径参数&#xff1a;通过动态路由和 useParams 获取。查询参数&#xff1a;通过 useLocation 获取 URL 查询字符串。路由状态传递&#xff1a;通过 state 属性在导航时传递数据&#xff0c;不在 URL 中显示&#…

八股文-基础知识-面试题汇总(一)

面向对象和面向过程的区别&#xff1f; 面向对象和面向过程是两种不同的编程范式&#xff0c;它们在设计和实现软件时有着不同的理念和方法。面向对象更适合大型、复杂的项目&#xff0c;尤其是需要维护和扩展的系统&#xff1b;而面向过程更适合小型、线性的任务或对性能要求…

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

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

数据结构 (10)队列

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

C#中的异步操作

在 C# 中&#xff0c;异步编程主要是通过 async 和 await 关键字实现的&#xff0c;它们使得异步操作变得更加简洁和易于维护。以下是关于异步线程用法的基本介绍&#xff0c;以及如何编写一个异步函数的步骤和示例。在之前的项目中我其实一直在用这些异步的方法&#xff0c;今…

Python3 WebUI自动化总篇:Python3+Selenium+Pytest+Allure+ Jenkins webUI自动化框架

Python3 WebUI自动化总篇: Python3+Selenium+Pytest+Allure+ Jenkins webUI自动化框架 WebUI接口框架使用的工具

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

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

Linux和Ubuntu的关系

Linux和Ubuntu的关系&#xff1a; 1. Linux本身是内核&#xff0c;Ubuntu系统是基于Linux内核的操作系统。 2. Linux内核操作系统的构成&#xff1a; 内核、shell、文件系统、应用程序 -应用程序&#xff1a;文本编辑器等 -文件系统&#xff1a;文件存放在存储设备上的组织方…

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

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

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

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

Applicaiton配置文件

server:port: 8080 # 配置 Spring Boot 启动端口&#xff0c;默认为 8080mybatis-plus:mapper-locations: classpath:com/xtl/mapper/xml/*.xml # 指定 MyBatis Mapper XML 文件的路径&#xff0c;确保 MyBatis 能够正确加载 Mapper 文件global-config:db-config:id-type: au…

网络安全:攻击和防御练习(全战课), DDos压力测试

XSS 跨站脚本攻击&#xff1a; Cross-site scripting&#xff08;简称xss&#xff09;跨站脚本。 一种网站的安全漏洞的攻击&#xff0c;代码注入攻击的一种。XSS攻击通常指的是通过利用网页开发时留下的漏洞&#xff0c;通过巧妙的方法注入恶意指令代码到网页&#xff0c;使…

文本显示text

文本显示 text是文本组件 创建文本 Text(基础语法)// 引用字符串Text($r(app.string.hella))添加子组件 span能作为Text和RichEditor组件的子组件显示文本内容。 创建span span组建需要写在text组件里面&#xff0c;无法单独使用&#xff0c;可以写多个子组件 Text(可…

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

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