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

news2024/12/24 0:35:46

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

#学习笔记# 

目录

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是最好的学习助手

行动起来,共勉

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp使用Canvas给图片加水印把临时文件上传到服务器

生成的临时路径是没有完整的路径没办法上传到服务器 16:37:40.993 添加水印后的路径, _doc/uniapp_temp_1710923708347/canvas/17109238597881.png 16:37:41.041 添加水印后的完整路径, file://storage/emulated/0/Android/data/com.jingruan.zjd/apps/__UNI__BE4B000/doc/…

【大屏设计】如何进行软件系统网站大屏页面设计?不限于智慧城市、物联网、电商、园区领域

【大屏设计】如何进行软件系统网站大屏页面设计?不限于智慧城市、物联网、电商、园区领域 一、什么是网站大屏设计二、网站大屏设计原型素材三、网站大屏设计设计素材四、他山之石 一、什么是网站大屏设计 网站大屏设计是网站设计中至关重要的一部分,因…

Kafka生产者相关概念

文章目录 Kafka工作流程Kafka文件存储生产者分区策略生产者ISR生产者ack机制数据一致性问题ExactlyOnce Kafka工作流程 Kafka中消息是以topic进行分类的,Producer生产消息,Consumer消费消息,都是面向topic的。 Topic是逻辑上的概念&#xff…

【Godot4.2】实现简单时钟组件

概述 Godot的CanvasItem类型提供的绘图函数,以及向量旋转,玩起来很有意思。 基于_draw的实现 用向量旋转的方法,可以实现时钟的分针、时针、秒针的旋转。再通过每帧调用_draw更新绘图就可以让时钟动起来了。 当然我们还需要从Time单例那里…

Amuse .NET application for stable diffusion

Amuse github地址:https://github.com/tianleiwu/Amuse .NET application for stable diffusion, Leveraging OnnxStack, Amuse seamlessly integrates many StableDiffusion capabilities all within the .NET eco-system Welcome to Amuse! Amuse is a profes…

【Maven】使用maven-jar、maven-assembly、maven-shade优雅的实现第三方依赖一同打Jar包

文章目录 一.前言二.常规Jar 打包:maven-jar-plugin三.Shade 打包:maven-shade-plugin1.如何使用2.将部分jar包添加或排除3.将依赖jar包内部资源添加或排除4.自动将所有不使用的类排除5.将依赖的类重命名并打包进来 (隔离方案)6.修…

使用ansible批量修改操作系统管理员账号密码

一、ansible server端配置 1、对于Linux主机配置免密登录ssh-copy-id -i ~/.ssh/id_rsa.pub rootremote_ip 2、在/etc/ansible/hosts文件中添加相应主机IP 3、对于Windows主机需要在/etc/ansible/hosts文件中进行以下配置 192.168.83.132 ansible_ssh_useradministrator an…

147 Linux 网络编程3 ,高并发服务器 --多路I/O转接服务器 - select

从前面的知识学习了如何通过socket ,多进程,多线程创建一个高并发服务器,但是在实际工作中,我们并不会用到前面的方法 去弄一个高并发服务器,有更加好用的方法,就是多路I/O转接器 零 多路I/O转接服务器 多…

电脑硬盘误删怎么恢复,误删硬盘的文件能不能再恢复

误删硬盘的文件能不能再恢复?很多朋友都很关心这个问题,不用担心,误删硬盘文件是可以恢复的!使用电脑不可避免会遇到一些糊涂的时刻,比如误删了重要的文件。当我们发现自己不小心将硬盘上的文件删除时,心里…

【STM32】读写BKP备份寄存器RTC实时时钟

目录 BKP BKP简介 BKP基本结构 BKP测试代码 RTC RTC简介 RTC框图 RTC基本结构 硬件电路 RTC操作注意事项 接线图 初始化 使用BKP解决只初始化一次时间 初始化参考代码 RTC设置时间 RTC读取时间 完整代码 MyRTC.c MyRTC.h main.c BKP BKP简介 BKP&#xff0…

Centos7部署单节点MongoDB(V4.2.25)

🎈 作者:互联网-小啊宇 🎈 简介: CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作,擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

Apipost数据模型上线,解决相似数据结构复用问题

在API设计和开发过程中,存在许多瓶颈,其中一个主要问题是在遇到相似数据结构的API时会产生重复性较多的工作:在每个API中都编写相同的数据,这不仅浪费时间和精力,还容易出错并降低API的可维护性。 为了解决这个问题&a…

乐优商城(九)数据同步RabbitMQ

1. 项目问题分析 现在项目中有三个独立的微服务: 商品微服务:原始数据保存在 MySQL 中,从 MySQL 中增删改查商品数据。搜索微服务:原始数据保存在 ES 的索引库中,从 ES 中查询商品数据。商品详情微服务:做…

【phoenix】flink程序执行phoenix,phoenix和flink-sql-connector-hbase包类不兼容

问题报错 Caused by: java.lang.RuntimeException: java.lang.RuntimeException: class org.apache.flink.hbase.shaded.org.apache.hadoop.hbase.client.ClusterStatusListener$MulticastListener not org.apache.hadoop.hbase.client.ClusterStatusListener$Listener如下图&…

语音识别教程:Whisper

语音识别教程:Whisper 一、前言 最近看国外教学视频的需求,有些不是很适应,找了找AI字幕效果也不是很好,遂打算基于Whisper和GPT做一个AI字幕给自己。 二、具体步骤 1、安装FFmpeg Windows: 进入 https://github.com/BtbN/FF…

使用光标精灵更换电脑鼠标光标样式,一键安装使用

想要让自己在使用电脑时更具个性化,让工作和娱乐更加愉快,改变你的电脑指针光标皮肤可能是一个简单而有效的方法。很多人或许并不清楚如何轻松地调整电脑光标样式,下面我就来分享一种简单的方法。 电脑光标在系统里通常只有几种默认图案&…

支付宝手机网站支付,微信扫描二维码支付

支付宝手机网站支付 支付宝文档 响应示例 <form name"punchout_form" method"post" action"https://openapi.alipay.com/gateway.do?charsetUTF-8&methodalipay.trade.wap.pay&formatjson&signERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE…

软件的安装与卸载(YUM)

YUM&#xff1a;yum 是一个方便的"应用商店"&#xff0c;你可以通过它轻松地安装、更新和删除软件包&#xff0c;就像从应用商店中下载和安装应用程序一样。&#xff08;这个得用root身份&#xff0c;普通用户权限不够&#xff09; 常用命令&#xff1a; 1.安装软件…

提供数字免疫力:采取整体方法来优化您的网络

采用数字技术已成为许多美国企业的关键竞争优势&#xff0c;导致其在与新部署的云解决方案的安全连接方面的投资不断增加。然而&#xff0c;随着越来越多的关键应用程序迁移到云端&#xff0c;公司保护其敏感数据和资源变得更具挑战性&#xff0c;因为这些资产现在超出了内部防…

计算机网络相关

OSI七层模型 各层功能&#xff1a; TCP/IP四层模型 应用层 传输层 网络层 网络接口层 访问一个URL的全过程 在浏览器中输入指定网页的 URL。 浏览器通过 DNS 协议&#xff0c;获取域名对应的 IP 地址。 浏览器根据 IP 地址和端口号&#xff0c;向目标服务器发起一个 TCP…