TF-IDF:文本挖掘中的关键词提取利器

引言      

       在自然语言处理(NLP)和文本挖掘中,TF-IDF是一种常用的技术,用于评估一个词在文档中的重要性。它不仅在信息检索领域广泛应用,还在文本分类、关键词提取等任务中发挥着重要作用。本文将详细介绍TF-IDF的原理,并通过一个实际的代码示例来展示如何使用TF-IDF从《红楼梦》中提取核心关键词。

1. 什么是TF-IDF?

TF-IDF是一种统计方法,用于评估一个词在文档中的重要性。它由两部分组成:

- TF(Term Frequency):词频,表示一个词在文档中出现的频率。词频越高,说明该词在文档中越重要。
 

- IDF(Inverse Document Frequency):逆文档频率,用于衡量一个词在整个语料库中的普遍性。如果一个词在很多文档中都出现,那么它的IDF值会较低,说明它对区分文档的贡献较小。
 

最终的TF-IDF值是TF和IDF的乘积:

        通过TF-IDF,我们可以得到一个词在文档中的重要性评分。评分越高,说明该词在文档中越重要。

 2. TF-IDF的应用场景

TF-IDF广泛应用于以下场景:

- 关键词提取:从文档中提取出最重要的关键词。
- 文本分类:通过TF-IDF值将文本转化为向量,用于机器学习模型的输入。
- 信息检索:在搜索引擎中,TF-IDF用于评估查询词与文档的相关性。

3. 代码实现:从《红楼梦》中提取核心关键词

接下来,我们通过一个实际的代码示例,展示如何使用TF-IDF从《红楼梦》中提取核心关键词。

 3.1 代码结构

代码主要分为以下几个步骤:

1. 读取分词后的文本:将《红楼梦》的分卷内容进行分词,并保存到 ‘分词后汇总.txt’ 中。
2. 计算TF-IDF值:使用`TfidfVectorizer`计算每个词的TF-IDF值。
3. 提取核心关键词:根据TF-IDF值,提取每个分卷的核心关键词。

代码详解

1、分卷处理

 1.1 代码功能


       将《红楼梦》的全文按照“卷”进行分割,并将每一卷的内容保存到单独的文本文件中。同时,过滤掉一些无关的内容(如“手机电子书·大学生小说网 更新时间”)。

1.2 代码实现

1.2.1、读取文件

   - 使用`open`函数打开《红楼梦》全文文件,指定编码为`utf-8`。
   - 创建一个初始文件对象`juan_file`,用于写入卷的内容。

import os# 打开《红楼梦》全文文件
file = open('..\红楼梦\红楼梦.txt', encoding='utf-8')# 创建一个文件对象,用于写入卷的内容
juan_file = open('..\红楼梦\红楼梦卷开头.txt', 'w', encoding='utf-8')
1.2.2逐行处理

   - 使用`for line in file`逐行读取全文。
   - 如果某一行包含“手机电子书·大学生小说网 更新时间”,则跳过该行(`continue`)。
   - 如果某一行包含“卷 第”,则表示新的卷开始:
   - 提取卷名,并去掉首尾空白字符(`line.strip()`)。
   - 构建保存路径(`os.path.join`)。
   - 关闭当前卷的文件,并打开一个新的卷文件。
   - 跳过这一行,不将其写入卷内容。

for line in file:# 过滤掉包含“手机电子书·大学生小说网 更新时间”的行if '手机电子书·大学生小说网 更新时间' in line:continue  # 跳过这一行# 如果遇到“卷 第”开头的行,表示新的卷开始if '卷 第' in line:juan_name = line.strip() + '.txt'  # 获取卷名,并去掉首尾空白字符path = os.path.join('..\\红楼梦\\分卷\\', juan_name)  # 构建卷的保存路径print(path)  # 打印路径,用于调试# 关闭当前卷的文件,并打开一个新的卷文件juan_file.close()juan_file = open(path, 'w', encoding='utf-8')continue  # 跳过这一行,不写入卷内容# 将当前行写入当前卷的文件中juan_file.write(line)
1.2.3. 关闭文件
# 关闭最后一个卷的文件
juan_file.close()

2、分词与停用词过滤

2.1 代码功能

        对每一卷的内容进行分词,并过滤掉停用词(无意义的关键词)。最终,将分词后的内容保存到一个汇总文件中。

2.2 代码实现

2.2.1 读取分卷内容

   - 使用`os.walk`遍历`..\红楼梦\分卷\`目录,获取所有卷的文件路径和内容。
   - 将文件路径和内容存储到`filePaths`和`fileContents`列表中。


import pandas as pd# 保存文件路径和内容的列表
filePaths = []  # 文件路径
fileContents = []  # 文件内容# 遍历分卷目录,读取所有卷的内容
for root, dirs, files in os.walk('..\\红楼梦\\分卷\\'):for name in files:filePath = os.path.join(root, name)  # 构建文件路径filePaths.append(filePath)  # 将路径添加到列表中# 读取文件内容f = open(filePath, 'r', encoding='utf-8')fileContent = f.read()f.close()fileContents.append(fileContent)  # 将内容添加到列表中

构建DataFrame:

 - 使用`pandas`将文件路径和内容存储到`DataFrame`中,方便后续处理。

# 将文件路径和内容存储到DataFrame中
corpos = pd.DataFrame({'filePath': filePaths,'fileContent': fileContents
})
print(corpos)  # 打印DataFrame,用于调试
2.2.2 分词与停用词过滤

1. 加载自定义词库:
   - 使用`jieba.load_userdict`加载自定义词库(如“红楼梦词库.txt”),以提高分词的准确性。

2. 读取停用词表:
   - 使用`pandas`读取停用词表(如“StopwordsCN.txt”),用于过滤无意义的关键词。


import jieba# 加载自定义词库
jieba.load_userdict(r'..\红楼梦\红楼梦词库.txt')# 读取停用词表
stopwords = pd.read_csv('StopwordsCN.txt', encoding='utf-8', engine='python', index_col=False)# 创建一个文件对象,用于写入分词后的内容
file_to_jieba = open(r'../红楼梦/分词后汇总.txt', 'w', encoding='utf-8')# 对每一卷的内容进行分词和停用词过滤
for index, row in corpos.iterrows():juan_ci = ''  # 保存当前卷的分词结果filePath = row['filePath']  # 文件路径fileContent = row['fileContent']  # 文件内容

3.分词与过滤:
   - 对每一卷的内容进行分词(`jieba.cut`)。
   - 过滤掉停用词和空白字符。
   - 将分词结果保存到`juan_ci`中。   

# 使用jieba进行分词segs = jieba.cut(fileContent)for seg in segs:# 过滤停用词和空白字符if seg not in stopwords.stopword.values and len(seg.strip()) > 0:juan_ci += seg + ' '  # 将分词结果拼接成字符串# 将分词结果写入文件file_to_jieba.write(juan_ci + '\n')# 关闭文件
file_to_jieba.close()

3、关键词提取

3.1、代码功能

这部分代码,我们借助模型,将关键词提取出来

3.2、代码实现

3.2.1 读取分词后的文本

首先,我们读取已经分词后的文本文件`分词后汇总.txt`,并将其存储在`corpus`变量中。


infile = open(r'..\红楼梦\分词后汇总.txt', 'r', encoding='utf-8')
corpus = infile.readlines()
3.2.2 计算TF-IDF值

      我们使用`TfidfVectorizer`来计算每个词的TF-IDF值。`TfidfVectorizer`是`scikit-learn`库中的一个类,用于将文本转换为TF-IDF特征向量。


from sklearn.feature_extraction.text import TfidfVectorizervectorizer = TfidfVectorizer()  # 创建TF-IDF向量转换对象
tfidf = vectorizer.fit_transform(corpus)  # 计算TF-IDF值

`tfidf`是一个稀疏矩阵,表示每个文档中每个词的TF-IDF值。

3.2.3 提取核心关键词

      接下来,我们通过`np.argsort`函数找到每个文档中TF-IDF值最高的前10个词,并输出这些关键词及其对应的TF-IDF值。


import numpy as np
import pandas as pdwordlist = vectorizer.get_feature_names_out()  # 获取特征名称
df = pd.DataFrame(tfidf.T.todense(), index=wordlist)  # 将TF-IDF矩阵转换为DataFramefor i in range(len(corpus)):featurelist = df.iloc[:, i]  # 获取第i列的TF-IDF值top_index = np.argsort(featurelist)[-10:][::-1]  # 找到TF-IDF值最高的前10个词的索引print(f'第{i + 1}回的核心关键词有:')for j in top_index:print(f'{wordlist[j]}: {featurelist.iloc[j]:.2f}')  # 输出关键词及其TF-IDF值print()  # 添加空行分隔不同回的结果

4、代码输出

代码运行后,会输出每个分卷的核心关键词及其TF-IDF值。例如:

总结

      TF-IDF是一种简单但非常有效的文本特征提取方法,能够帮助我们快速识别文档中的关键词。通过本文的代码示例,我们展示了如何使用TF-IDF从《红楼梦》中提取核心关键词。希望这篇文章能帮助你更好地理解TF-IDF的原理和应用。

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

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

相关文章

[新能源]新能源汽车快充与慢充说明

接口示意图 慢充接口为交流充电口(七孔),快充接口为直流充电口(九孔)。 引脚说明 上图给的是充电口的引脚图,充电枪的为镜像的。 慢充接口引脚说明 快充接口引脚说明 充电流程 慢充示意图 慢充&…

docker3-容器与镜像命令

前言 容器命令[部分] docker run –name“nginx-lb” 这个就是为容器起一个名称 以前是随机起的名称 docker run -d --name mynginx1 nginx:1.24.0 docker ps 这样就可以看到我们起的名字了 docker stop mynginx1 这个就可以停掉指定名字的容器了,但不是删除…

vue/react/vite前端项目打包的时候加上时间最简单版本,防止后端扯皮

如果你是vite项目,直接写一个vite的插件,通过这个插件可以动态注入环境变量,然后当打包的时候,自动注入这个时间到环境变量中,然后在项目中App.vue中或者Main.tsx中打印出来,这就知道是什么时候编译的项目了…

Linux中Gdb调试工具常用指令大全

1.gdb的安装 如果你是root用户直接用指令 :yum install gdb ;如果你是普通用户用指令:sudo yum install gdb; 2.gdb调试前可以对你的makefile文件进行编写: 下面展示为11.c文件编写的makefile文件: code…

go 安装swagger

1、依赖安装: # 安装 swag 命令行工具 go install github.com/swaggo/swag/cmd/swaglatest# 安装 gin-swagger 和 swagger 文件的依赖 go get -u github.com/swaggo/gin-swagger go get -u github.com/swaggo/files 2、测试 cmd中输入: swag -v 如果…

数据库---sqlite3

数据库: 数据库文件与普通文件区别: 1.普通文件对数据管理(增删改查)效率低 2.数据库对数据管理效率高,使用方便 常用数据库: 1.关系型数据库: 将复杂的数据结构简化为二维表格形式 大型:Oracle、DB2 中型:MySql、SQLServer …

go的gmp

参考链接:https://www.bilibili.com/video/BV19r4y1w7Nx Golang的GMP调度模型(协程调度器)是其并发编程的核心。GMP代表Goroutine、Machine和Processor三个关键组成部分。Goroutine是Go语言中的轻量级线程,Machine是操作系统的线程,Processor…

标贝自动化数据标注平台推动AI数据训练革新

随着人工智能(AI)技术的快速发展,数据标注作为AI模型训练的关键环节,其重要性日益凸显。传统的人工数据标注方式虽然能够提供高质量的标注数据,但存在效率低、成本高、一致性差等问题。为了解决这些问题,标…

从传统制动到线控制动:技术变革与挑战

随着汽车产业从传统机械时代迈向电动化、智能化时代,车辆底盘的“线控化”已经成为重要发展趋势。其中,线控制动系统(Brake-by-Wire,简称BBW)是该趋势的核心一环。传统的制动系统主要依赖真空助力或液压传动&#xff0…

Java---JavaSpringMVC解析(1)

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC" 1.MVC MVC是Model View Controller的缩写&#…

VSTO(C#)Excel开发8:打包发布安装卸载

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…

地下停车场调频广播覆盖:破解地下车库无线广播收听孤岛,技术赋能地下停车场FM调频无线广播覆盖

地下停车场调频广播覆盖:破解地下车库无线广播收听孤岛,技术赋能地下停车场FM调频无线广播覆盖 北京海特伟业科技有限公司任洪卓于2025年3月14日发布 地下停车场调频广播覆盖系统建设背景 随着城市化进程的加速,地下停车场已成为现代建筑不…

kettle的转换中sql不按设计顺序执行原因分析与解决办法

1.问题描述 如图,通过箭头指定多个SQL脚本的先后顺序,实际各个sql没有阻塞,没有等待,几乎是并行,与预期不符。 2.原因 转换文件(.ktr) 用于控制数据的流量,比如表输入指向表输出节…

P1259 黑白棋子的移动【java】【AC代码】

有 2n 个棋子排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为 n5 的情况: 移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但…

P6772 [NOI2020] 美食家

训练角度:图上的状态转移,倍增 → \rightarrow → 优化状态转移; ▍ 题意 精灵王国共有 n n n 座城市,城市从 1 1 1 到 n n n 编号,其中城市 i i i 的美食能为小 W 提供 c i c_i ci​ 的愉悦值。精灵王国的城市…

51c大模型~合集7

我自己的原文哦~ https://blog.51cto.com/whaosoft/11519481 #MTMamba 王座易位?香港科技大学MTMamba,超越 ViT与CNN! 本文作者提出了MTMamba,一种新型的多任务架构,具有基于Mamba的解码器,在多任务场…

sap 内存管理与数据共享方式

SAP内存管理 内存是程序之间为了传递数据而使用的共享存储空间 SAP内存分类:1、SAP内存,2、ABAP内存 这两种内存都是针对同一登录用户实现数据共享。 SAP内存(SAP Memory)和ABAP内存(ABAP Memory)&…

Manus邀请码申请全流程指南(2025最新版)——申请Manus体验资格

🌟引言: 近期,号称“全球首个通用AI智能体”的Manus引爆科技圈,其自主执行复杂任务的能力颠覆了传统AI工具仅能输出文本的局限。然而,由于内测阶段采用邀请制,一码难求的现状让用户直呼“门槛太高”。 名人…

Linux 命名管道

文章目录 🚀 深入理解命名管道(FIFO)及其C实现一、命名管道核心特性1.1 🧩 基本概念 二、💻 代码实现解析2.1 📁 公共头文件(common.hpp)2.2 🖥️ 服务器端(s…

Python 与 sklearn 库:轻松构建 KNN 算法双版本

引言​ k 最近邻(kNN)算法是一种简单而强大的机器学习算法,常用于分类和回归任务。在 Python 中,借助 scikit - learn(sklearn)库,我们可以轻松实现 kNN 算法。本文将为大家介绍两种使用 sklea…