使用sk-learn 理解TF-IDF

news/2024/11/15 11:56:57/

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.ppmy.cn/news/1547194.html

相关文章

python爬虫获得店铺的所有商品

在编写Python爬虫以获取店铺的所有商品信息时,通常涉及到发送HTTP请求、解析响应内容以及处理API返回的数据。以下是一个详细的Python爬虫示例,用于获取店铺的商品信息。这个示例假设API返回的是JSON格式的数据,并且需要API密钥进行认证。 步…

【超级简单】Facebook脸书视频下载一键保存手机

Facebook作为目前服务全球30亿用户,尤其是出海和跨境用户没有办法忽视的平台,提供了一个在线平台,使用户分享照片、视频、状态更新和链接等内容,然而,令人遗憾的是,用户没有办法直接将照片和视频保存到本地…

阿里云通义大模型团队开源Qwen2.5-Coder:AI编程新纪元

🚀 11月12日,阿里云通义大模型团队宣布开源通义千问代码模型全系列,共6款Qwen2.5-Coder模型。这些模型在同等尺寸下均取得了业界最佳效果,其中32B尺寸的旗舰代码模型在十余项基准评测中均取得开源最佳成绩,成为全球最强…

巧妙注入的奥秘:在 Spring 中优雅地使用 List 和 Map

文章目录 一、注入 List:同类项,一次拿下二、注入 Map:当键值对遇上多态三、进阶:使用 Qualifier 灵活注入四、总结总结推荐阅读文章 在 Spring 框架里,我们经常需要将不同的组件组织到集合中,比如在注入多…

MySQL 8.0特性-自增变量的持久化

MySQL 8.0特性-自增变量的持久化 在MySQL 8.0之前,自增主键AUTO_INCREMENT的值如果大于max(primary key)1,在MySQL重启后,会重置AUTO_INCREMENTmax(primary key)1,这种现象在某些情况下会导致业务主键冲突或者其他难以发现的问题…

leetcode61. Rotate List

Given the head of a linked list, rotate the list to the right by k places. 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 Input: head [1,2,3,4,5], k 2 Output: [4,5,1,2,3] class Solution: def rotateRight(self, …

嵌入式硬件实战提升篇(一)-泰山派RK3566制作多功能小手机

引言:主要针对于嵌入式全栈内容的知识点汇总并对于linux等相关驱动知识点进行串联,用大家参考学习,并用到了嘉立创提供的泰山派RK3566作为学习的主控。 实物演示如下所示: 目录 一、硬件设计 1.转接电路 2.背光电路 3.音频接…

wordpress functions文件的作用及详细说明

WordPress的functions.php文件是一个非常重要的主题文件,它允许开发者和用户向网站添加自定义代码片段,从而修改网站功能或添加新内容。以下是functions.php文件的主要作用和一些详细说明: 1. 自定义功能添加: functions.php文件…