《机器学习》——TF-IDF(关键词提取)

文章目录

  • TF-IDF简介
  • TF-IDF应用场景
  • TF-IDF模型
    • 模型参数
    • 主要参数
  • TF-IDF实例
    • 实例步骤
      • 导入数据和模块
      • 处理数据
        • 处理文章开头和分卷处理
        • 将各卷内容存储到数据帧
        • jieba分词和去停用词处理
      • 计算 TF-IDF 并找出核心关键词

TF-IDF简介

  • TF - IDF(Term Frequency - Inverse Document Frequency)是一种用于信息检索和文本挖掘的常用加权技术。它由两部分组成:词频(TF)和逆文档频率(IDF)。
    • 词频(TF)
      • 词频是指某个词在一篇文档中出现的频率。计算方法是用某个词在文档中出现的次数除以文档的总词数。例如,文档 A 中有 100 个单词,单词 “apple” 出现了 5 次,那么单词 “apple” 在文档 A 中的词频 TF = 5/100 = 0.05。它衡量的是一个词在单篇文档中的重要性,词频越高,说明这个词在这篇文档中可能越重要。
    • 逆文档频率(IDF)
      • 逆文档频率是一个词在整个文档集合中的稀有程度的度量。计算方法是先计算文档总数 N,然后统计包含某个词的文档数 n,那么这个词的逆文档频率 IDF = log (N/n)。例如,假设有 1000 篇文档(N = 1000),其中只有 10 篇文档包含单词 “banana”(n = 10),那么单词 “banana” 的逆文档频率 IDF = log (1000/10)= log (100)≈ 2.(这里以自然对数为例)。IDF 的值越大,说明这个词越稀有,在区分文档时可能越有价值。
    • TF - IDF 值
      • TF - IDF 值是词频和逆文档频率的乘积,即 TF - IDF = TF×IDF。它综合考虑了一个词在单篇文档中的出现频率和在整个文档集合中的稀有程度,从而能够更好地衡量一个词对于某篇文档的重要性。在上面的例子中,如果 “apple” 的 TF = 0.05,并且假设其 IDF = 1.5(具体值取决于文档集合),那么 “apple” 的 TF - IDF 值 = 0.05×1.5 = 0.075。
    • 在这里插入图片描述

TF-IDF应用场景

  • 文本分类
    • 在文本分类任务中,TF - IDF 可以用来提取文本的特征向量。例如,将新闻文章分为体育、娱乐、科技等类别。通过计算每篇新闻文章中各个单词的 TF - IDF 值,然后选择 TF - IDF 值较高的单词作为特征,构建一个特征向量来代表这篇文章。这个特征向量可以作为机器学习分类算法(如朴素贝叶斯、支持向量机等)的输入,帮助分类器判断文章所属的类别。
  • 信息检索
    • 在搜索引擎中,TF - IDF 用于对搜索结果进行排序。当用户输入一个查询词时,搜索引擎会计算查询词与文档库中各个文档的相关性。TF - IDF 可以帮助衡量查询词在文档中的重要性,从而将与查询词相关性高的文档排在前面。例如,用户搜索 “人工智能应用”,搜索引擎会根据文档中 “人工智能” 和 “应用” 这两个词的 TF - IDF 值来判断文档与查询的相关性,TF - IDF 值高的文档更有可能被优先展示。
  • 关键词提取
    • 可以利用 TF - IDF 来提取文档的关键词。通常,TF - IDF 值较高的词很可能是文档的关键词。例如,对于一篇学术论文,通过计算论文中各个词的 TF - IDF 值,选择排名靠前的词作为关键词,这些关键词可以帮助读者快速了解论文的主题。

TF-IDF模型

在这里插入图片描述

模型参数

主要参数

  • input
    • 该参数指定输入数据的类型。
    • 可选值:
      • ‘filename’:表示输入是文件名列表,会从文件中读取文本内容。
      • ‘file’:表示输入是文件对象,会从文件对象中读取文本内容。
      • ‘content’(默认):表示输入是文本内容列表,直接使用输入的文本进行处理。
  • encoding
    • 用于指定文本的编码方式。
    • 例如,对于包含多种语言字符的文本,可以使用 ‘utf-8’ 进行编码,确保字符能被正确解析。
  • decode_error
    • 当解码错误发生时的处理策略。
    • 可选值:
      • ‘strict’(默认):会引发 UnicodeDecodeError 异常。
      • ‘ignore’:忽略错误,直接跳过无法解码的部分。
      • ‘replace’:用 ‘?’ 或其他替换字符替换无法解码的部分。
  • strip_accents
    • 去除重音字符,将其转换为 ASCII 字符。
    • 可选值:
      • ‘ascii’:将重音字符转换为相应的 ASCII 字符。
      • None:不进行此操作。
  • lowercase
    • 是否将文本转换为小写。
    • 默认值为 True,将所有文本转换为小写,以确保不区分大小写进行处理,因为在 TF-IDF 计算中通常认为大小写不同但拼写相同的词是相同的词。
  • preprocessor
    • 可以自定义预处理函数,在分词前对文本进行预处理。
    • 例如,可以定义一个函数,将 HTML 标签去除或进行一些特殊符号的替换,该函数会在分词前应用于每个文档。
  • tokenizer
    • 自定义分词函数,用于将文本拆分成词或标记。
    • 例如,可以使用自己编写的分词函数代替默认的分词方式,对文本进行更细致的分词处理,如对中文进行分词,可以使用 jieba 分词工具,将其封装为一个函数传入此参数。
  • analyzer
    • 定义特征应该由哪些部分组成。
    • 可选值:
    • ‘word’(默认):以词为单位。
    • ‘char’:以字符为单位。
    • ‘char_wb’:以字符为单位,考虑词边界。
  • stop_words
    • 可以是以下几种情况:
      • None(默认):不使用停用词。
      • ‘english’:使用内置的英文停用词列表,会过滤掉常见的英文停用词,如 and, the, is 等。
    • 自定义的停用词列表,例如 [‘我’, ‘你’, ‘他’] 可用于中文停用词过滤。
  • token_pattern
    • 用于指定分词的正则表达式模式。
    • 默认是 r"(?u)\b\w\w+\b",即匹配至少两个字母数字字符组成的词,可根据需要修改此正则表达式以适应不同的语言或特殊字符要求。
  • ngram_range
    • 定义要考虑的词或字符的范围。
    • 接收一个元组 (min_n, max_n),例如 (1, 2) 表示考虑一元词(单个词)和二元词(两个词的组合),可以捕捉到一些短语信息,对于一些特定任务可能会提高性能。
  • max_df
    • 用于过滤掉过于常见的词。
    • 可以是浮点数,范围在 (0.0, 1.0],表示文档频率的最大阈值,例如 0.8 表示文档频率超过 80% 的词将被过滤;也可以是整数,表示绝对的文档频率。
  • min_df
    • 用于过滤掉过于罕见的词。
    • 可以是浮点数,范围在 [0.0, 1.0],表示文档频率的最小阈值,例如 0.2 表示文档频率低于 20% 的词将被过滤;也可以是整数,表示绝对的文档频率。
  • max_features
    • 只考虑最常见的 max_features 个词。
    • 例如,设置为 1000 时,仅考虑词汇表中最常见的 1000 个词,用于限制特征的维度,避免高维度带来的计算开销和过拟合。
  • vocabulary
    • 可以是 None(默认),表示使用从输入数据中学习的词汇表;也可以是一个字典或可迭代对象,用于手动指定词汇表,只有在该词汇表中的词才会被考虑进行 TF-IDF 计算。

TF-IDF实例

对红楼梦文章进行TF-IDF处理,提取到关键字。
在这里插入图片描述
通过网盘分享的文件:红楼梦.txt
链接: https://pan.baidu.com/s/1y4_qTi1UgkCHo7exi5g4kw 提取码: 246h
–来自百度网盘超级会员v2的分享
通过网盘分享的文件:StopwordsCN.txt
链接:https://pan.baidu.com/s/1827ZPVgGdoIo86dLDJCV1Q
提取码: t27s
–来自百度网盘超级会员v2的分享

实例步骤

所导入的库下载:

pip install jieba
pip install pandas==1.3.5
pip install scikit-learn==1.0.2
  • 导入数据和模块
  • 处理数据
    • 处理文章开头和分卷处理
    • 将各卷内容存储到数据帧
    • jieba分词和去停用词处理
  • 训练模型并计算出TF-IDF值

导入数据和模块

import os
import pandas as pd
import jieba
from sklearn.feature_extraction.text import TfidfVectorizerfile = open('红楼梦.txt', encoding='utf-8')

处理数据

处理文章开头和分卷处理

注意:分卷文件夹需要自己创建。

# 标志,用于标记是否是第一次保存文件
flag = 0
# 打开一个文件用于存储开始部分的内容
juan_file = open('红楼梦开头.txt', 'w', encoding='utf-8')# 开始遍历《红楼梦》的文本文件
for line in file:# 当找到包含"卷 第"的行,认为是一个新的卷的开始if '卷 第' in line:# 提取卷名并添加后缀.txtjuan_name = line.strip() + '.txt'# 构建存储该卷的文件的完整路径path = os.path.join('.\\分卷\\', juan_name)print(path)# 如果是第一次读取到卷 第if flag == 0:# 打开新文件存储该卷内容juan_file = open(path, 'w', encoding='utf-8')flag = 1else:# 关闭之前的文件,并打开新文件存储该卷内容juan_file.close()juan_file = open(path, 'w', encoding='utf-8')continue# 将行内容写入当前的卷文件juan_file.write(line)
# 关闭最后的卷文件
juan_file.close()

部分输出:
在这里插入图片描述

将各卷内容存储到数据帧

# 存储文件路径和文件内容的列表
filePaths = []
fileContents = []
# 遍历分卷目录下的所有文件
for root, dirs, files in os.walk(r'.\分卷'):for name in files:# 构建文件的完整路径filePath = os.path.join(root, name)print(filePath)# 将文件路径添加到列表filePaths.append(filePath)# 打开文件f = open(filePath, 'r', encoding='utf-8')# 读取文件内容fileContent = f.read()f.close()# 将文件内容添加到列表fileContents.append(fileContent)
# 将文件路径和文件内容存储到一个 DataFrame 中
corpos = pd.DataFrame({'filePath': filePaths,'fileContent': fileContents})
print(corpos)

使用 os.walk 遍历 .\分卷 目录下的所有文件,将文件路径存储在 filePaths 列表,文件内容存储在 fileContents 列表中。
将 filePaths 和 fileContents 存储在 pandas 数据帧 corpos 中。
在这里插入图片描述
在这里插入图片描述

jieba分词和去停用词处理
# 加载结巴分词的自定义词库
jieba.load_userdict(r'./红楼梦词库.txt')# 读取停用词文件
stopwords = pd.read_csv(r'StopwordsCN.txt',encoding='utf-8', engine='python', index_col=False)
# 打开一个文件用于存储分词结果
file_to_jieba = open(r'分词汇总.txt', 'w', encoding='utf-8')
# 遍历 DataFrame 中的每一行
for index, row in corpos.iterrows():# 存储分词后的内容juan_ci = ''# 获取文件路径filePath = row['filePath']# 获取文件内容fileContent = row['fileContent']# 对文件内容进行结巴分词segs = jieba.cut(fileContent)# 遍历分词结果for seg in segs:# 如果分词不在停用词列表中,且长度不为 0if 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()

计算 TF-IDF 并找出核心关键词

# 打开存储分词结果的文件
inFile = open(r'分词汇总.txt', 'r', encoding='utf-8')
# 读取文件的每一行存储在 corpus 中
corpus = inFile.readlines()# 创建 TF-IDF 向量化器
vectorizer = TfidfVectorizer()
# 对 corpus 进行拟合和转换,得到 TF-IDF 矩阵
tfidf = vectorizer.fit_transform(corpus)
# 获取特征名称
wordlist = vectorizer.get_feature_names()# 将 TF-IDF 矩阵转换为 DataFrame
df = pd.DataFrame(tfidf.T.todense(), index=wordlist)# 遍历每一个文档(这里假设是每一卷)
for i in range(len(corpus)):# 获取当前文档的 TF-IDF 特征列表featurelist = df.iloc[:, i].to_list()# 存储当前文档的关键词及其 TF-IDF 值resdict = {}# 遍历每个特征for j in range(0, len(wordlist)):# 将特征和对应的 TF-IDF 值存储到字典中resdict[wordlist[j]] = featurelist[j]# 对关键词按 TF-IDF 值降序排序resdict = sorted(resdict.items(), key=lambda x: x[1], reverse=True)# 输出第 i+1 个文档的前 10 个核心关键词print("第{}回的核心关键词:".format(i + 1), resdict[0:10]

部分结果:
在这里插入图片描述

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

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

相关文章

【计算机网络】窥探计网全貌:说说计算机网络体系结构?

标签难度考察频率综合题⭐⭐⭐60% 这个问题在计算机网络知识体系中是一个比较重要的问题,只有完整地了解计算机网络的体系结构才能清晰地认识网络的运行原理。 在回答这个问题时,笔者认为有几个比较重要的点: 首先一定要分清楚前置条件&am…

【前端】【CSS3】基础入门知识

目录 如何学习CSS 1.1什么是CSS​编辑 1.2发展史 1.三种导入方式 1.1、行内样式 1.2、外部样式 1.3、嵌入方式 2.选择器 2.1、基本选择器 (1)元素选择器 (2)类选择器 (3)id选择器:必…

【解决】okhttp的java.lang.IllegalStateException: closed错误

问题 Android 使用OKHttp进行后端通信,后端处理结果,反馈给前端的responseBody中其实有值,但是一直报异常,后来才发现主要是OkHttp请求回调中response.body().string()只能有效调用一次,而我使用了两次: 解…

从硬件设备看Linux

一、介绍 DM3730通过各种连接方式连接了各种设备,输入输出设备根据不同的类型大体可 以分为电源管理、用户输人、显示输出、图像采集、存储以及无线设备等。我们可以将DM 3730与这些设备的数据接口分为总线和单一的数据接口总线。总线的显著特点是单个总线上可以连…

【优选算法】DC-Quicksort-Mysteries:分治-快排的算法之迷

文章目录 1.概念解析2.颜色分类3.排序数组4.数组中的第k个最大元素5.库存管理Ⅲ希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 本篇是优选算法之分治-快排,快排可以在更短的时间内完成相同规模数据的排序任务,大大提升了…

浅谈云计算09 | 服务器虚拟化

服务器虚拟化基础 一、虚拟化的定义二、系统虚拟化三、服务器虚拟化的核心要义四、典型实现:探索不同路径五、全虚拟化与半虚拟化六、主流服务器虚拟化技术 一、虚拟化的定义 虚拟化是一种将物理资源抽象为逻辑资源的技术,通过在物理硬件与操作系统、应…

解析OVN架构及其在OpenStack中的集成

引言 随着云计算技术的发展,虚拟化网络成为云平台不可或缺的一部分。为了更好地管理和控制虚拟网络,Open Virtual Network (OVN) 应运而生。作为Open vSwitch (OVS) 的扩展,OVN 提供了对虚拟网络抽象的支持,使得大规模部署和管理…

第三十六章 Spring之假如让你来写MVC——拦截器篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…

CSS 盒模型

盒模型 CSS盒模型是网页布局的核心概念之一,它描述了网页元素的物理结构和元素内容与周围元素之间的关系。根据W3C规范,每个HTML元素都被视为一个矩形盒子,这个盒子由以下四个部分组成: 内容区(Content area&#xff…

JVM:ZGC详解(染色指针,内存管理,算法流程,分代ZGC)

1,ZGC(JDK21之前) ZGC 的核心是一个并发垃圾收集器,所有繁重的工作都在Java 线程继续执行的同时完成。这极大地降低了垃圾收集对应用程序响应时间的影响。 ZGC为了支持太字节(TB)级内存,设计了基…

OpenCV基于均值漂移算法(pyrMeanShiftFiltering)的水彩画特效

1、均值漂移算法原理 pyrMeanShiftFiltering算法结合了均值迁移(Mean Shift)算法和图像金字塔(Image Pyramid)的概念,用于图像分割和平滑处理。以下是该算法的详细原理: 1.1 、均值迁移(Mean …

【数学】概率论与数理统计(五)

文章目录 [toc] 二维随机向量及其分布随机向量离散型随机向量的概率分布律性质示例问题解答 连续型随机向量的概率密度函数随机向量的分布函数性质连续型随机向量均匀分布 边缘分布边缘概率分布律边缘概率密度函数二维正态分布示例问题解答 边缘分布函数 二维随机向量及其分布 …

四 BH1750 光感驱动调试2

之前调通了用户态接口,android 使用还是不方便,要包装jni使用。 这里集成了内核 iio 驱动 ,提供 sys-fs 文件接口 可供固件以及 ANDROID 应用层使用 一 驱动集成 : 1.1 dts 修改 修改文件 : kernel/arch/arm64/boot/dts/rockchip/rp-rk3568.dts 在 i2c5 增加设备,如…

Redis持久化双雄

Redis持久化 Redis 的持久化是指将内存中的数据保存到硬盘,以防止服务器宕机导致数据丢失的机制。 redis 提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。 RDB,简…

工业视觉2-相机选型

工业视觉2-相机选型 一、按芯片类型二、按传感器结构特征三、按扫描方式四、按分辨率大小五、按输出信号六、按输出色彩接口类型 这张图片对工业相机的分类方式进行了总结,具体如下: 一、按芯片类型 CCD相机:采用电荷耦合器件(CC…

数字证书管理服务

阿里云数字证书管理服务(Aliyun Certificate Management Service, ACM)是一种云端服务,专门用于帮助企业管理和颁发数字证书。数字证书是网络安全中的重要组成部分,它可以确保通信的安全性、身份认证以及数据的完整性。通过阿里云…

《跟我学Spring Boot开发》系列文章索引❤(2025.01.09更新)

章节文章名备注第1节Spring Boot(1)基于Eclipse搭建Spring Boot开发环境环境搭建第2节Spring Boot(2)解决Maven下载依赖缓慢的问题给火车头提提速第3节Spring Boot(3)教你手工搭建Spring Boot项目纯手工玩法…

Zookeeper概览

个人博客地址:Zookeeper概览 | 一张假钞的真实世界 设计目标 简单的:方便使用以实现复杂的业务应用。复制式的:跟Zookeeper协调的分布式进程一样,它也是在一组服务器上复制的。集群的每个节点间互相知道。它们维护一个状态数据在…

播放音频文件同步音频文本

播放音频同步音频文本 对应单个文本高亮显示 使用audio音频文件对应音频文本资源 音频文本内容(Json) [{"end": 4875,"index": 0,"speaker": 0,"start": 30,"text": "70号二啊,","tex…

React中ElementFiber对象、WorkInProgress双缓存、ReconcileRenderCommit、第一次挂载过程详解

基础概念 Element对象与Fiber对象 Element对象与Fiber对象 Element 对象 定义 React 的 Element 对象是一个描述用户界面(UI)的普通 JavaScript 对象,通常由 React.createElement 或 JSX 语法生成。 作用 它是 React 应用中的一种描述 …