【NLP】TF-IDF算法原理及其实现

🌻个人主页:相洋同学
🥇学习在于行动、总结和坚持,共勉!

#学习笔记# 

目录

01 TF-IDF算法介绍

02 TF-IDF应用

03 Sklearn实现TF-IDF算法

04 使用TF-IDF算法提取关键词

05 TF-IDF算法的不足


TF-IDF算法非常容易理解,并且很容易实现,但其简单结构没有考虑词语的语义信息,无法处理一词多义与一义多词的情况。对于同类文本处理和一些生僻词筛选的效果不理想。

01 TF-IDF算法介绍

TF-IDF(term frequency-inverse doument frequency,词频-逆向文档频率)是一种用于信息检索(information retrieval)与文本挖掘(text mining)的常用加权技术。

TF-IDF是一种统计方法,用以评估一字词对与一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比的增加,但同时会随着它在语料库中出现的频率成反比下降。

TF-IDF的主要思想:如果某个单词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语有很好的类别区分能力,适合用来分类。

(1)TF是词频(Term Frequency)

词频(TF)表示词条(关键字)在文本中出现的频率。

这个数字通常会被归一化(一般是词频除以文档总词数),防止它偏向长的文件

公式:

tf_{ij}=\frac{n_{i,j}}{\sum_{k}^{}n_{k,j}}

其中n_{i,j}是该词在文件d_{j}中出现的次数,分母则是文件d_{j}中所有词汇出现的次数总和;

(2)IDF是逆向文本频率(Inverse Document Frequency)

逆向文件频率(IDF):某一特定词语的IDF,可以由总文件数目除以包含该词语的文件的数目,再将得到的上取对数得到。

如果包含词条的t的文档越少,IDF越大,则说明词条具有很好的类别区分能力。

公式:

idf_{i}=log\frac{|D|}{|\left \{ j:t_{i}\in d_{j} \right \}|}

其中,|D|是语料库中的文件总数。分母表示包含词语t_{i}的文件数目。如果该词语不在语料库中,就会导致分母为0,因此一般情况加会给分母加1

(3)TF-IDF实际上是:TF*IDF

某一特定文件内的高频词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。

TF-IDF = TF *IDF(左边表示连接并非减号)

注:TF-IDF算法非常容易理解,并且很容易实现,但其简单结构没有考虑词语的语义信息,无法处理一词多义与一义多词的情况。

02 TF-IDF应用

(1)搜索引擎

(2)关键词提取

(3)文本相似性

(4)文本摘要

03 Sklearn实现TF-IDF算法

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
 
x_train = ['大模型 是 当今 比较 火热 的 概念','深度学习 火热 现状 的 资源',
           '人工智能 领域 最 重要 的 方法']
x_test=['算力 当今 重要 资源','GPU 火热']
 
#该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
vectorizer = CountVectorizer(max_features=10)
#该类会统计每个词语的tf-idf权值
tf_idf_transformer = TfidfTransformer()
#将文本转为词频矩阵并计算tf-idf
tf_idf = tf_idf_transformer.fit_transform(vectorizer.fit_transform(x_train))
#将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
x_train_weight = tf_idf.toarray()
 
#对测试集进行tf-idf权重计算
tf_idf = tf_idf_transformer.transform(vectorizer.transform(x_test))
x_test_weight = tf_idf.toarray()  # 测试集TF-IDF权重矩阵
 
print('输出x_train文本向量:')
print(x_train_weight)
print('输出x_test文本向量:')
print(x_test_weight)

# 输出:
输出x_train文本向量:
[[0.         0.46735098 0.46735098 0.         0.46735098 0.46735098
  0.         0.35543247 0.         0.        ]
 [0.         0.         0.         0.         0.         0.
  0.52863461 0.40204024 0.52863461 0.52863461]
 [0.70710678 0.         0.         0.70710678 0.         0.
  0.         0.         0.         0.        ]]
输出x_test文本向量:
[[0.         0.         0.70710678 0.         0.         0.
  0.         0.         0.         0.70710678]
 [0.         0.         0.         0.         0.         0.
  0.         1.         0.         0.        ]]

04 使用TF-IDF算法提取关键词

我们使用sklearn中的TF-IDF方法对新闻文本进行关键词提取分析,并和单纯通过词频来提取关键词的方法进行方法对比

from collections import Counter
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba

# 这里省略文本处理的过程
......

filtered_chinese_news_body = []
for content in chinese_news_body:
    filtered_content = drop_stopwords_and_tonkenize(content)
    filtered_chinese_news_body.append(filtered_content)
print(filtered_chinese_news_body)

# 使用传统方法获取文本词频排行前n的词
def get_cnt_list(text,n=5):
    # 统计词频
    cnt_list = []
    for content in text:
        cnt_list.append(Counter(content))
    cnt_word_list = []
    for cnt in cnt_list:
        cnt_word_list.append([word[0] for word in cnt.most_common(n)])
    
    return cnt_word_list
    
# 使用TF-IDF获取TF-IDF排名前n的词

def get_important_words_tfidf(text_list, n=5):    # 获取关键词
    '''
    如果输入的是文本列表,则返回文本列表中每个文本的关键词
    如果是已经分好词的文本列表,先将其转化为文本列表
    '''
    # 计算TF-IDF
    # TfidfVectorizer所接受的对象是列表字符串,我先前已经把正文分词和去停用词了,我还需要
    # 把分词后的正文列表转换成列表字符串
    if type(text_list[0]) == list :
        filtered_news_body_str = []
        for content in text_list:
            filtered_content_str = ' '.join(content)
            filtered_news_body_str.append(filtered_content_str)
        text_list = filtered_news_body_str
        
    tfidf_vectorizer = TfidfVectorizer()
    tfidf_matrix = tfidf_vectorizer.fit_transform(text_list)
    tfidf_matrix.toarray()
    
    feature_names = tfidf_vectorizer.get_feature_names_out()
    
    content_important_words = []
    for doc_num, doc in enumerate(tfidf_matrix):
        # 将该文档的TF-IDF向量转换为数组,并获取每个词的索引及其TF-IDF值
        tfidf_scores = zip(feature_names, doc.toarray()[0])
        
        # 根据TF-IDF值对词进行排序,并获取最重要的前10个词
        sorted_words = sorted(tfidf_scores, key=lambda x: x[1], reverse=True)[:n]
        
        important_words = [word[0] for word in sorted_words]
        content_important_words.append(important_words)
    
    return content_important_words

cnt_chinese_word_list = get_cnt_list(filtered_chinese_news_body,10)
tfidf_chinese_word_list = get_important_words_tfidf(filtered_chinese_news_body,n=10)
# 最后我们来对比输出一下
print('结果对比:')
for i in range(len(chinese_news_title)):
    print(f'新闻标题{i+1}:{chinese_news_title[i]}')
    print('count方法提取关键词:', ' '.join(cnt_chinese_word_list[i]))
    print('TF-IDF方法提取关键词:', ' '.join(tfidf_chinese_word_list[i]))
    print('==========================')
    
# 输出:
结果对比:
新闻标题1:用好“人工智能+” 赋能产业升级(人民融观察)
count方法提取关键词: 人工智能 大模型 算力 研究 方面 数据 创新 领域 治理 研发
TF-IDF方法提取关键词: 人工智能 大模型 算力 治理 智能 机器人 算法 风险 研究 攻关
==========================
新闻标题2:这个雪季,吉林省冰雪旅游市场异常火热
count方法提取关键词: 冰雪 游客 滑雪 旅游 吉林省 增长 吉林 同比 度假区 接待
TF-IDF方法提取关键词: 冰雪 游客 滑雪 旅游 吉林省 度假区 吉林 北大 接待 长白山
==========================
新闻标题3:中国经济有强劲韧性和巨大潜力
count方法提取关键词: 中国 经济 增长 表示 全球 工作 世界 高质量 政府 目标
TF-IDF方法提取关键词: 中国 经济 增长 表示 全球 工作 高质量 经济体 政府 预期
==========================
新闻标题4:外文出版社回应“龙”应该翻译成Loong还是Dragon
count方法提取关键词:   dragon 中国 译文 龙 Chinese 翻译 规范 英文 Loong
TF-IDF方法提取关键词: dragon 译文 chinese 中国 loong 正面 约定俗成 英文 翻译 规范
==========================
新闻标题5:独家|追赶抖音快手,腾讯系多款产品加码短剧
count方法提取关键词: 短剧 腾讯 阅文 视频 内容 平台 抖音 快手 产品 流量
TF-IDF方法提取关键词: 短剧 腾讯 阅文 视频 快手 抖音 平台 ip 流量 内容
==========================
新闻标题6:“超级星期二”基本尘埃落定,特朗普对决拜登,可能性越来越大
count方法提取关键词: 特朗普 选 初选 星期二 拜登 美国 黑莉 对决 可能性 70%
TF-IDF方法提取关键词: 特朗普 初选 拜登 星期二 黑莉 美国 pk 党派 共和党 各州
==========================
新闻标题7:有史以来发现化学元素最多的,是一位诗人
count方法提取关键词: 戴维   发现 法拉第 研究院 诗人 皇家 化学家 化学 气体
TF-IDF方法提取关键词: 戴维 发现 法拉第 皇家 诗人 化学家 气体 研究院 化学 氯气
==========================
新闻标题8:AI引发材料科学变革,有一场“硬仗”无法规避
count方法提取关键词: 数据   模型 材料 集 GNoME 材料科学 化合物 人工智能 Google
TF-IDF方法提取关键词: 数据 模型 材料 gnome 材料科学 化合物 google 人工智能 materials project
==========================
新闻标题9:马斯克痛批“最糟糕的技术”,国内氢能源汽车加速崛起
count方法提取关键词: 汽车 氢能源 氢能 燃料电池 氢气 氢 制氢 运输 生产 成本
TF-IDF方法提取关键词: 汽车 氢能 氢能源 燃料电池 氢气 制氢 成本 运输 续航 马斯克

05 TF-IDF算法的不足

  • 其简单的结构并不能有效地反映单词的重要程度和特征词的分布情况
  • 本质上TF-IDF是一种试图异质噪声的加权,并单纯认为文本频率小的单词就重要,对于大部分的文本信息并不是完全正确,在同类语料库中这一方法就有很大弊端
  • 没有考虑特征词位置因素对文本的区分度,词条出现在文档不同位置对区分度的贡献大小不同
  • 一些生僻词可能会被误认为文档关键词

更详细的内容和其他实现细节见下面这篇文章:

TF-IDF算法介绍及实现-CSDN博客

以上

互联网是最好的课本,实践是最好的老师,AI是最好的学习助手

行动起来,共勉

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

matlab 基于小波变换的油气管道泄露信号检测

1、内容简介 略 71-可以交流、咨询、答疑 基于小波变换的油气管道泄露信号检测 去噪、小波变换、油气管道泄露、信号检测 2、内容说明 摘 要: 油气管道泄漏会造成严重危害,因此,亟需寻找一种能快速检测油气管道信号的技术。传统的 傅里…

Vue2(八):脚手架结构、render函数、ref属性、props配置项、mixin(混入)、插件、scoped样式

一、脚手架结构分析 crlc终止刚刚搭建的vue。 ├── node_modules ├── public │ ├── favicon.ico: 页签图标 │ └── index.html: 主页面 ├── src │ ├── assets: 存放静态资源 │ │ └── logo.png │ │── component: 存放组件 │ │ …

Gin框架 源码解析

https://zhuanlan.zhihu.com/p/136253346 https://www.cnblogs.com/randysun/category/2071204.html 这个博客里其他go的内容也讲的很好 启动 因为 gin 的安装教程已经到处都有了,所以这里省略如何安装, 建议直接去 github 官方地址的 README 中浏览安装…

【数据库基础增删改查】条件查询、分页查询

系列文章目录 🌈座右铭🌈:人的一生这么长、你凭什么用短短的几年去衡量自己的一生! 💕个人主页:清灵白羽 漾情天殇_计算机底层原理,深度解析C,自顶向下看Java-CSDN博客 ❤️相关文章❤️:清灵白羽 漾情天…

AI浸入社交领域,泛娱乐APP如何抓住新风口?

2023年是大模型技术蓬勃发展的一年,自ChatGPT以惊艳姿态亮相以来,同年年底多模态大模型技术在国内及全球范围内的全面爆发,即模型能够理解并生成包括文本、图像、视频、音频等多种类型的内容。例如,基于大模型的文本到图像生成工具…

Samtec科普 | 一文了解患者护理应用连接器

【摘要/前言】 通过医疗专业人士为患者提供护理的种种需求,已经不限于手术室与医院的各种安全状况。当今许多患者的护理都是在其他环境进行,例如医生办公室、健康中心,还有越来越普遍的住家。尤其是需要长期看护的患者,所需的科技…

Mysql数据库概念与安装

目录 一、数据库概述 1、数据库的基本概念 2、数据库管理系统(DBMS) 2.1 数据库管理系统概念 2.2 数据库管理系统工作模式 3、数据库系统(DBS) 3.1 数据库系统概念 3.2 数据库系统发展史 4、关系型数据库与非关系型数据库…

机器学习——终身学习

终身学习 AI不断学习新的任务,最终进化成天网控制人类终身学习(LLL),持续学习,永不停止的学习,增量学习 用线上收集的资料不断的训练模型 问题就是对之前的任务进行遗忘,在之前的任务上表现不好…

【机器学习】无监督学习算法之:K均值聚类

K均值聚类 1、引言2、K均值聚类2.1 定义2.2 原理2.3 实现方式2.4 算法公式2.4.1 距离计算公式2.4.1 中心点计算公式 2.5 代码示例 3、总结 1、引言 小屌丝:鱼哥, K均值聚类 我不懂,能不能给我讲一讲? 小鱼:行&#xf…

AI助手 - Fitten Code

前言 上一篇介绍了商汤AI编程小助手小浣熊 Raccoon,过程中又发现了另外一款国产AI编程助手,那就是本篇要介绍的非十科技出品的Fitten Code。 ​ Fitten Code 主打一个快:超高准确率、超快的响应速度。号称代码生成比GitHub Copilot 快两倍&am…

蓝桥杯模块综合——高质量讲解AT24C02,BS18B20,BS1302,AD/DA(PCF8591),超声波模块

AT24C02——就是一个存储的东西,可以给他写东西,掉电不丢失。 void EEPROM_Write(unsigned char * EEPROM_String,unsigned char addr , unsigned char num) {IIC_Start();IIC_SendByte(0xA0);IIC_WaitAck();IIC_SendByte(addr);IIC_WaitAck();while(nu…

奶牛均分

解法&#xff1a; 假设编号从左到右递增&#xff0c;奶牛每次只能去往左边的牛圈。因此等分最大奶牛数小于等于最右边牛圈奶牛数&#xff0c;不妨设数为k&#xff0c;那么a[i]>k&#xff0c;a[i-1]>2k。。。 做后缀和二分答案就可找到k #include<iostream> #inc…

字符串筛选排序 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 输入一个由n个大小写字母组成的字符串&#xff0c; 按照 ASCII 码值从小到大的排序规则&#xff0c;查找字符串中第 k 个最小ASCII 码值的字母(k>1) , 输出该…

CSS学习(3)-浮动和定位

一、浮动 1. 元素浮动后的特点 脱离文档流。不管浮动前是什么元素&#xff0c;浮动后&#xff1a;默认宽与高都是被内容撑开&#xff08;尽可能小&#xff09;&#xff0c;而且可以设置宽 高。不会独占一行&#xff0c;可以与其他元素共用一行。不会 margin 合并&#xff0c;…

C语言易错知识点

1、数组长度及所占字节数 char x[] {"Hello"},y[]{H,e,l,l,o}; x数组的长度为5&#xff0c;y的长度也是5 x、y数组所占字符串为6为 51(\0)6 strlen&#xff08;&#xff09;函数得到的是数组的长度 2、%%与%的优先级 #include<stdio.h> int main(){ int a…

HarmonyOS4.0—自定义渐变导航栏开发教程

前言 今天要分享的是一个自定义渐变导航栏&#xff0c;本项目基于鸿蒙4.0。 先看效果&#xff1a; 这种导航栏在开发中也比较常见&#xff0c;特点是导航栏背景色从透明到不透明的渐变&#xff0c;以及导航栏标题和按钮颜色的变化。 系统的导航栏无法满足要求&#xff0c;我们…

Visual Studio 2013 - 高亮设置括号匹配 (方括号)

Visual Studio 2013 - 高亮设置括号匹配 [方括号] 1. 高亮设置 括号匹配 (方括号)References 1. 高亮设置 括号匹配 (方括号) 工具 -> 选项… -> 环境 -> 字体和颜色 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

基于信号分解的几种一维时间序列降噪方法(MATLAB R2021B)

自适应信号分解算法是一种适合对非平稳信号分析的方法&#xff0c;它将一个信号分解为多个模态叠加的形式&#xff0c;进而可以准确反应信号中所包含的频率分量以及瞬时频率随时间变化的规律。自适应信号分解算法与众多“刚性”方法(如傅里叶变换&#xff0c;小波变换)不同&…

R语言实现多要素偏相关分析

偏相关分析是指当两个变量同时与第三个变量相关时&#xff0c;将第三个变量的影响剔除&#xff0c;只分析另外两个变量之间相关程度的过程&#xff0c;判定指标是相关系数的R值。 在GIS中&#xff0c;偏相关分析也十分常见&#xff0c;我们经常需要分析某一个指数与相关环境参…

浅谈一下对于DDD模式的理解2

浅谈一下对于DDD模式的理解&#xff0c;相互学习交流&#xff0c;不对之处欢迎大家指正。 在说到DDD(Domain-Driven Design)设计模式之前&#xff0c;先要说下我们在对系统进行架构设时需要遵循的几个原则&#xff1a; 单一职责&#xff08;SRP&#xff09; "单一职责原则…