NLP自然语言处理——关键词提取之 TF-IDF 算法(五分钟带你深刻领悟TF-IDF算法的精髓)

🔥博客主页:是dream

🚀系列专栏:深度学习环境搭建、环境配置问题解决、自然语言处理、语音信号处理、项目开发

💘每日语录:要有最朴素的生活和最遥远🌏的梦想,即使明天天寒地冻,山高水远,路远马亡。

🎉感谢大家点赞👍收藏⭐指证✍️

前言

        关键词提取是将文本中的关键信息、核心概念或重要主题抽取出来的过程。这些关键词可以帮助人们快速理解文本的主题,构建文本摘要,提高搜索引擎的效率,甚至用于文本分类和信息检索等应用领域。因此,关键词提取在文本分析和自然语言处理中具有广泛的应用前景。本文主要包括以下几个内容:

  1. 自然语言文本预处理
  2. TF-IDF算法详解(三个维度:原理、流程图、代码)
  3. 好玩的中文关键词词云生成(解决乱码问题)

        本博客将深入探讨自然语言处理中常用的TF-IDF算法,以多种方式展现TF-IDF算法的核心思想。

准备工作

  1. 本文的代码是通过python实现的,建议安装一个pycharm,非常方便!
  2. 停用词表(提取码:peng):百度网盘 请输入提取码
  3. 文本文档(提取码:peng):百度网盘 请输入提取码
  4. 库函数 jieba、sklearn、matplotlib以及生词词云用到的wordcloud

以上的库函数都可以通过pip安装。

pip install 库函数名字

自然语言文本预处理

        一般情况下我们拿到的文本是不规范的,需要我们进行一系列的预处理操作。        

  • 文本数据清洗:去除特殊符号、HTML标签、数字等无关字符。
  • 分词:将文本拆分成单词或词组。
  • 停用词去除:排除常见的停用词,如“的”、“在”等,以减少噪音。

停用词获取

        在前边的准备工作中,你已经获得了停用词表,通过以下代码提取停用词。

# 获取停用词
def load_stopwords(stopwords_file):stopwords = set()with open(stopwords_file, 'r', encoding='utf-8') as f:for line in f:stopwords.add(line.strip())return stopwords

        在这里提一嘴,在编程中,set 是一种数据结构,它类似于列表(list)或字符串(string),但具有一些不同的特点。

  • 列表(list)是一种有序的数据结构,可以包含多个元素,每个元素可以是不同类型的数据(例如数字、字符串、其他列表等)。列表中的元素可以重复。
  • 字符串(string)是一种有序的字符序列,通常用于表示文本。字符串的每个字符都有一个索引位置。
  • set 是一种无序的集合数据结构,它用于存储不重复的元素。集合中的元素不按顺序排列,并且每个元素在集合中只能出现一次。集合通常用于存储一组唯一的值。

数据清洗

# 加载文档集,对文档集过滤词性和停用词
def filter_documents(data_path, stopwords):documents = []with open(data_path, 'r', encoding='utf-8') as f:for line in f:document = []words = pseg.cut(line.strip())for word, flag in words:if flag.startswith('n') and word not in stopwords and len(word) > 1:document.append(word)documents.append(document)return documents

        通过这一步,我们就得到一个包含精确分词、词性过滤和停用词去除的文本数据。

        预处理完成,接下来就是算法详解和实现。

TF-IDF算法

        TF-IDF(词频-逆文档频率)是一种用于衡量文本中词语重要性的方法,特别适用于信息检索和文本挖掘任务。下面我将深入讲解TF-IDF的计算过程,以便更好地理解。

        TF-IDF的计算过程可以分为两个主要部分:词频(TF)逆文档频率(IDF)

1. 词频(TF - Term Frequency):

        词频是指某个词语在文档中出现的频率。TF表示了一个词语在文档中的重要性,通常通过以下公式计算:

标准公式:

其中:

  • w 是要计算TF的词语。
  • d 是包含词语的文档。
  • 分子是词语在文档中的出现次数。
  • 分母是文档中的总词语数。

计算出的TF值表示了词语在单个文档中的相对重要性,值越大表示词语在文档中越重要。

2. 逆文档频率(IDF - Inverse Document Frequency):

        逆文档频率度量了一个词语在整个文档集合中的重要性。IDF值越大,表示词语在整个文档集合中越不常见,因此在文档中的重要性越高。IDF通常通过以下公式计算:

可理解为

其中:

  • w 是要计算IDF的词语。
  • D 是文档集合。
  • 分子是文档集合中的总文档数。
  • 分母是包含词语 w 的文档数,+1 是为了避免分母为零的情况。

计算出的IDF值反映了词语的全局重要性较不常见的词语具有较高的IDF值

3. TF-IDF的计算:

        TF-IDF的计算是将词频(TF)和逆文档频率(IDF)相结合,以确定词语在文档中的整体重要性。计算公式如下:

其中:

  • w 是要计算TF-IDF的词语。
  • d 是包含词语的文档。
  • D 是文档集合。

        计算出的TF-IDF值表示了词语在文档 d 中的重要性,同时考虑了在整个文档集合 D 中的全局重要性。

TF-IDF算法实例讲解

        假设我们有一个包含多篇文档的文本集合,其中包括以下两篇文档:

        文档1:

自然语言处理(NLP)是一门研究人与计算机之间用自然语言进行有效通信的领域。NLP的目标是使计算机能够理解、解释和生成自然语言文本。

        文档2:

TF-IDF是一种常用于文本挖掘和信息检索的算法。它用于衡量文档中词语的重要性,通过词频(TF)和逆文档频率(IDF)的计算来实现。

计算步骤:

  1. 词频(TF)计算:

    • 对于文档1,词语 "自然语言处理" 在文档中出现的次数是1,文档1的总词语数为16。因此,TF("自然语言处理", 文档1) = 1/16 = 0.0625。
    • 对于文档2,词语 "自然语言处理" 在文档中没有出现,因此,TF("自然语言处理", 文档2) = 0。
  2. 逆文档频率(IDF)计算:

    • 假设文档集合中总共有100篇文档,其中包含词语 "自然语言处理" 的文档数为10篇。那么,IDF("自然语言处理", 文档集合) = ln(100 / (10 + 1)) ≈ 2.1972。
  3. TF-IDF计算:

    • 对于文档1,TF-IDF("自然语言处理", 文档1, 文档集合) = 0.0625 * 2.1972 ≈ 0.1373。
    • 对于文档2,TF-IDF("自然语言处理", 文档2, 文档集合) = 0 * 2.1972 = 0。

        通过这个例子,我们可以看到词语 "自然语言处理" 在文档1中的TF-IDF值较高,因为它在文档1中出现,并且相对较少地出现在整个文档集合中。在文档2中,由于该词语未出现,其TF-IDF值为零。这样,我们可以使用TF-IDF值来衡量词语在文档集合中的重要性。

TF-IDF算法流程图展示

TF-IDF 算法代码

        这里是直接调用了TfidfVectorizer(),简单方便。

# 使用TF-IDF提取关键词
def extract_keywords_tfidf(documents, top_n=20):# 将过滤后的文档集转化为文本列表documents_text = [' '.join(document) for document in documents]# 创建TF-IDF向量化器tfidf_vectorizer = TfidfVectorizer()# 计算TF-IDF权重tfidf_matrix = tfidf_vectorizer.fit_transform(documents_text)# 获取特征词列表features = tfidf_vectorizer.get_feature_names_out()# 计算每个文档中的关键词top_keywords_per_document = []for doc_id in range(len(documents)):document_tfidf_weights = tfidf_matrix[doc_id].toarray()[0]top_keyword_indices = document_tfidf_weights.argsort()[-top_n:][::-1]top_keywords = [features[idx] for idx in top_keyword_indices]top_keywords_per_document.append(top_keywords)return top_keywords_per_document

词云生成

        当我们获得了文本关键词后,总不能还是打印输出吧?为了更加直观地展示它们,这里选择使用词云(Word Cloud)的形式进行展示。

        首先确保我们已经安装了wordcloud。

pip install wordcloud

为了避免乱码这里建议下载中文字体,这里我直接分享给大家。

(提取码:peng)百度网盘 请输入提取码

附上代码:

def generate_wordcloud(keywords, title):"""生成词云图并显示参数:keywords (list): 包含关键词的列表。title (str): 词云图的标题。返回:None"""# 将关键词列表转化为字符串keywords_str = ' '.join(keywords)# 指定中文字体文件路径(根据实际情况替换为合适的路径)font_path = r'D:\my_homework\NLP_homework\NLP_test1\SimHei.ttf'  # 替换为包含中文字符的字体文件路径# 创建词云对象并指定字体wordcloud = WordCloud(width=800, height=400, background_color='white', font_path=font_path).generate(keywords_str)# 显示词云图plt.figure(figsize=(10, 5))plt.imshow(wordcloud, interpolation='bilinear')plt.axis('off')plt.title(f'wordcloud - {title}')plt.show()

效果展示:

结语

        总的来说,关键词提取是自然语言处理中的一项核心任务,它为我们处理文本数据、挖掘文本信息提供了有力的工具和方法。希望本篇博客能够帮助读者更好地理解关键词提取的基本原理和应用,从而在实际项目中更加灵活和高效地处理文本数据。如果你对关键词提取有更深入的兴趣,也可以进一步研究更多高级的关键词提取算法和技术。感谢阅读!

本人目前正在学习自然语言处理(NLP)、语音信号识别、计算机视觉等相关知识,关注我,后续,我将分享更多人工智能tips!最后附上整段代码!

import jieba
import jieba.posseg as pseg
from sklearn.feature_extraction.text import TfidfVectorizer
from textrank4zh import TextRank4Keywordimport matplotlib.pyplot as plt
from wordcloud import WordCloud# 获取停用词
def load_stopwords(stopwords_file):stopwords = set()with open(stopwords_file, 'r', encoding='utf-8') as f:for line in f:stopwords.add(line.strip())return stopwords# 加载文档集,对文档集过滤词性和停用词
def filter_documents(data_path, stopwords):documents = []with open(data_path, 'r', encoding='utf-8') as f:for line in f:document = []words = pseg.cut(line.strip())for word, flag in words:if flag.startswith('n') and word not in stopwords and len(word) > 1:document.append(word)documents.append(document)return documents# 使用TF-IDF提取关键词
def extract_keywords_tfidf(documents, top_n=20):# 将过滤后的文档集转化为文本列表documents_text = [' '.join(document) for document in documents]# 创建TF-IDF向量化器tfidf_vectorizer = TfidfVectorizer()# 计算TF-IDF权重tfidf_matrix = tfidf_vectorizer.fit_transform(documents_text)# 获取特征词列表features = tfidf_vectorizer.get_feature_names_out()# 计算每个文档中的关键词top_keywords_per_document = []for doc_id in range(len(documents)):document_tfidf_weights = tfidf_matrix[doc_id].toarray()[0]top_keyword_indices = document_tfidf_weights.argsort()[-top_n:][::-1]top_keywords = [features[idx] for idx in top_keyword_indices]top_keywords_per_document.append(top_keywords)return top_keywords_per_documentdef generate_wordcloud(keywords, title):"""生成词云图并显示参数:keywords (list): 包含关键词的列表。title (str): 词云图的标题。返回:None"""# 将关键词列表转化为字符串keywords_str = ' '.join(keywords)# 指定中文字体文件路径(根据实际情况替换为合适的路径)font_path = r'D:\my_homework\NLP_homework\NLP_test1\SimHei.ttf'  # 替换为包含中文字符的字体文件路径# 创建词云对象并指定字体wordcloud = WordCloud(width=800, height=400, background_color='white', font_path=font_path).generate(keywords_str)# 显示词云图plt.figure(figsize=(10, 5))plt.imshow(wordcloud, interpolation='bilinear')plt.axis('off')plt.title(f'wordcloud - {title}')plt.show()if __name__ == "__main__":stopwords_file = r'D:\my_homework\NLP_homework\NLP_test1\stopword.txt'  # 停用词文件路径data_path = r'D:\my_homework\NLP_homework\NLP_test1\corpus4keyword.txt'  # 文档集文件路径stopwords = load_stopwords(stopwords_file)documents = filter_documents(data_path, stopwords)print('停用词表的大小为:', len(stopwords))print('文档的数量为', len(documents))# 提取关键词top_keywords = extract_keywords_tfidf(documents)# 打印每个文档的前10个关键词for doc_id, keywords in enumerate(top_keywords):print(f'文档 {doc_id + 1} 的前10个关键词: {", ".join(keywords)}')document_keywords = top_keywords[19]  # 假设第20个文档的索引是19generate_wordcloud(document_keywords, 'wordcloud')

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

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

相关文章

【连接池】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

预训练模型与ChatGPT:自然语言处理的革新与前景

目录 一、ChatGPT整体背景认知 (一)ChatGPT引起关注的原因 (二)与其他公司的竞争情况 二、NLP学习范式的发展 (一)规则和机器学习时期 (二)基于神经网络的监督学习时期 &…

LeetCode - #151 颠倒字符串中的单词

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新…

微服务即时通讯系统(5)用户管理子服务,网关子服务

用户管理子服务(user文件) 用户管理子服务也是这个项目中的一个业务最多的子服务,接口多,但是主要涉及的数据表只有user表,Redis的键值对和ES的一个搜索引擎,主要功能是对用户的个人信息进行修改管理&#…

vue结合canvas动态生成水印效果

在 Vue 项目中添加水印可以通过以下几种方式实现: 方法一:使用 CSS 直接通过 CSS 的 background 属性实现水印: 实现步骤 在需要添加水印的容器中设置背景。使用 rgba 设置透明度,并通过 background-repeat 和 background-size…

html-两个div,让一个div跟随另外一个div的高度

在开发的过程中遇到有些场景事这样的,两个div的高度不一致,而且都是动态高度,有的时候div1高,有的时候div2高,如果设置flex的话,那么就会把较矮的元素撑大,但是我想始终都以div1的高度作为基准&…

知识管理系统|基于springBoot的知识管理系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书(可指定任意题目) 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 随着信息互联网信息的飞速发展,无纸化作业变成了一种趋势…

Kruskal 算法在特定边权重条件下的性能分析及其实现

引言 Kruskal 算法是一种用于求解最小生成树(Minimum Spanning Tree, MST)的经典算法。它通过逐步添加权重最小的边来构建最小生成树,同时确保不会形成环路。在本文中,我们将探讨在特定边权重条件下 Kruskal 算法的性能,并分别给出伪代码和 C 语言实现。特别是,我们将分…

12.2深度学习_视觉处理CNN_池化层、卷积知识

3.池化层 3.1 概述 池化层 (Pooling) 降低维度, 缩减模型大小,提高计算速度. 即: 主要对卷积层学习到的特征图进行下采样(SubSampling)处理。 池化层主要有两种: 最大池化 max pooling 最大池化是从每个局部区域中选择最大值作为池化后的值…

3D数据大屏实现过程,使用echarts、Next.js

📜 本文主要内容 数据大屏自适应方案动效 echarts: 3D 立体柱状图动态流光折线图 3D 地球(飞线、柱状图)无限滚动列表 🔍 大屏效果 数据大屏: 点击预览 🕹 运行条件 next 12.3.4echarts 5.4…

WebRover :一个功能强大的 Python 库,用于从 Web 内容生成高质量的数据集,专为训练大型语言模型和 AI 应用程序而设计。

2024-11-30 ,由Area-25团队开发的一个专门用于生成高质量网络内容数据集的Python库。该数据集旨在为大型语言模型(LLM)和人工智能应用的训练提供丰富的数据资源。 数据集地址:WebRover Dataset|自然语言处理数据集|AI模型训练数据…

FlyHttp 的最佳实践:加速项目级 API 请求构建

FlyHttp的相关文章: FlyHttp 的诞生:从认识各种网络请求开始 FlyHttp 的设计思想:前端 API 自动化构建工具 FlyHttp 的使用:如何高效使用 FlyHttp,支持 JS、TS 项目 一. FlyHttp 是什么? 这是一个自动…

图像修复算法常用评估指标介绍及Python代码(PSNR/SSIM/FID)

目录 峰值信噪比PSNR(Peak Signal-to-Noise Ratio) 结构相似度SSlM(Structural Similarity Index Measurement) FID(Frchet Inception Distance) 代码实践:计算两张图片之间的PSNR和SSIM 代…

家庭财务管理系统的设计与实现ssm小程序+论文源码调试讲解

2系统关键技术 2.1 微信小程序 微信小程序,简称小程序,英文名Mini Program,是一种全新的连接用户与服务的方式,可以快速访问、快速传播,并具有良好的使用体验。 小程序的主要开发语言是JavaScript,它与普…

天润融通亮相CCFA论坛:AI Agent引领零售业服务精细化运营

在新时期实现零售的进化,AI Agent助力客户精细化运营 11月19-21日,CCFA新消费论坛——2024中国零售创新大会在上海召开。大会围绕“在新时期实现零售的进化”主题,通过探讨零售新趋势、新势力、新模式,聚焦新产品、新渠道、新生活…

医学临床机器学习中算法公平性与偏差控制简析

摘要 随着医疗领域中数据的不断积累和计算能力的提升,临床机器学习技术发展迅速,但算法不公平性和偏差问题凸显。本文深入探讨了临床机器学习算法公平性的重要性、概念与定义、在临床应用中的影响、偏差来源、降低偏差方法及提升公平性策略。通过对不同…

如何抓取亚马逊页面动态加载的内容:Python爬虫实践指南

引言 在现代电商领域,数据的重要性不言而喻。亚马逊作为全球领先的电商平台,其页面上动态加载的内容包含了丰富的商品信息。然而,传统的爬虫技术往往难以应对JavaScript动态加载的内容。本文将详细介绍如何使用Python结合Selenium工具来抓取…

MongoDB分片集群架构实战

分片集群架构 分片简介 分片(shard)是指在将数据进行水平切分之后,将其存储到多个不同的服务器节点上的一种扩展方式。分片在概念上非常类似于应用开发中的“水平分表”。不同的点在于,MongoDB本身就自带了分片管理的能力&#…

opencvocr识别手机摄像头拍摄的指定区域文字,文字符合规则就语音报警

安装python,pycharm,自行安装。 Python下安装OpenCv 2.1 打开cmd,先安装opencv-python pip install opencv-python --user -i https://pypi.tuna.tsinghua.edu.cn/simple2.2 再安装opencv-contrib-python pip install opencv-contrib-python --user …

[报错] Error: PostCSS plugin autoprefixer requires PostCSS 8 问题解决办法

报错:Error: PostCSS plugin autoprefixer requires PostCSS 8 原因:autoprefixer版本过高 解决方案: 降低autoprefixer版本 执行:npm i postcss-loader autoprefixer8.0.0 参考: Error: PostCSS plugin autoprefix…