当前位置: 首页 > news >正文

深入理解机器学习之TF-IDF:文本特征提取的核心技术

引言
在自然语言处理(NLP)和文本挖掘领域,将文本转换为机器可理解的数值形式是一个关键步骤。TF-IDF(Term Frequency-Inverse Document Frequency)是一种简单而强大的文本特征提取方法,广泛应用于搜索引擎、文档分类、信息检索等领域。本文将深入探讨TF-IDF的原理、实现及应用。

一、什么是TF-IDF?
TF-IDF是一种统计方法,用于评估一个词对于一个文档集或语料库中的某个文档的重要程度。
核心思想:一个词在当前文档中出现的频率越高,同时在所有文档中出现的频率越低,则该词对当前文档的代表性越强。

TF-IDF由两部分组成:

词频(TF, Term Frequency):衡量词在文档中出现的频率
逆文档频率(IDF, Inverse Document Frequency):衡量词的普遍重要性
二、TF-IDF的数学原理
1. 词频(TF)计算
TF即词频,是指某个词语在文章中出现的次数。这个数字通常会被归一化(一般是词频除以文章总词数),以防止它偏向长的文件。
TF的计算公式为:

TF的直观意义:TF越高,说明该词在文档中出现的频率越高,可能是某一篇文档的一个重要关键词。
2. 逆文档频率(IDF)计算
IDF即逆文档频率,其主要思想是:如果包含某个词语的文档越少,则IDF越大,说明这个词语具有很好的类别区分能力。
IDF的计算公式为:

N 是文档集的总文档数。
df(t) 是包含词语 t 的文档数。分母加1是为了避免分母为0的情况。
IDF的直观意义:对于词t来说,包含词t的文档数量越多,IDF越低,说明该词在大多数文档中都出现,因此它们对区分文档的能力较弱。反之,IDF越高的词在所有文档中出现频率低,说明它是具有区分度的关键词。
3. TF-IDF计算
将TF和IDF相乘得到TF-IDF值:


TF(t,d) 是词语 t 在文档 d 中的词频。
IDF(t) 是词语 t 的逆文档频率。
TF-IDF的直观意义:
如果一个词在某篇文档中频繁出现(TF高),同时这个词在其他文档中出现较少(IDF高),那么这个词对该文档的意义较大,TF-IDF值也会较高。如果一个词在文档中出现频繁,但在所有文档中也很常见(IDF低),则它的TF-IDF值较低。
三、TF-IDF的Python实现
下面我们使用Python的scikit-learn库来实现TF-IDF。

1.数据文件介绍
我们在这里使用六行英文单词数据,数据文件命名为 task2_1.txt 。使用TfidfVectorizer计算TF-IDF值,并输出TF-IDF 稀疏矩阵。

2.导入库

from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd


从sklearn库中导入TfidfVectorizer
导入pandas库
3.读取数据

inFile = open(r".\task2_1.txt",'r')  
corpus = inFile.readlines()  


r:以只读模式打开文件。
readlines(): 读取文件的所有行,返回一个列表,每个元素为文件的一行。
4.数据预处理

vectorizer = TfidfVectorizer() tfidf = vectorizer.fit_transform(corpus)
print(tfidf)  wordlist = vectorizer.get_feature_names() 
print(wordlist)df= pd.DataFrame(tfidf.T.todense(),index=wordlist) 
print(df)


vectorizer = TfidfVectorizer() :类,转为TF-IDF的向量转换对象。
fit_transform(): 对输入的文本数据 corpus 进行拟合(计算词汇表和 IDF 值)并转换为TF-IDF 矩阵。
tfidf: 返回的结果是一个稀疏矩阵(scipy.sparse.csr_matrix),表示每个文档的 TF-IDF 特征向量。
打印 TF-IDF 稀疏矩阵。稀疏矩阵只存储非零值,因此输出会显示非零值及其位置。
vectorizer.get_feature_names() :获取特征名称,所有的词。
todense(): 将稀疏矩阵转换为稠密矩阵(普通二维数组)。
df.iloc[:,5].to_list():通过索引号获取第6列的内容并转换为列。
打印出的 TF-IDF 稀疏矩阵:


打印的wordlist列表:

5.对单词进行排序

featurelist = df.iloc[:,5].to_list()  resdict = {}
for i in range(0,len(wordlist)):resdict[wordlist[i]] = featurelist[i]resdict = sorted(resdict.items(),key=lambda x: x[1],reverse=True)
print(resdict)

6.全部代码

from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pdinFile = open(r".\task2_1.txt",'r')  
corpus = inFile.readlines()  vectorizer = TfidfVectorizer()    tfidf = vectorizer.fit_transform(corpus) 
print(tfidf)  wordlist = vectorizer.get_feature_names()  
print(wordlist)df= pd.DataFrame(tfidf.T.todense(),index=wordlist) 
print(df)featurelist = df.iloc[:,5].to_list()  
print(featurelist)resdict = {}   
for i in range(0,len(wordlist)):resdict[wordlist[i]] = featurelist[i]resdict = sorted(resdict.items(),key=lambda x: x[1],reverse=True)
print(resdict)


四、结语
优点:

简单快速,而且容易理解。
可以有效地提取文本中的关键信息,避免了常见词的干扰。
缺点:

用词频来衡量文章中的一个词的重要性不够全面,有时候重要的词出现的可能不够多。
而且这种计算无法体现位置信息(比如在文本第一段的词很重要,中间段的词不重要,即使它们有相同TF-IDF值),无法体现词在上下文的重要性。
希望本文能帮助你全面理解TF-IDF,并在实际项目中灵活应用这一强大的文本特征提取工具。

http://www.lryc.cn/news/618319.html

相关文章:

  • 防御保护11
  • windows版本:Prometheus+Grafana(普罗米修斯+格拉法纳)监控 JVM
  • 《Redis集群故障转移与自动恢复》
  • Myqsl建立库表练习
  • 零基础渗透测试全程记录(打靶)——Prime
  • linux远程部署dify和mac本地部署dify
  • java python
  • c#联合Halcon进行OCR字符识别(含halcon-25.05 百度网盘)
  • Docker 101:面向初学者的综合教程
  • Go 语言中的结构体、切片与映射:构建高效数据模型的基石
  • 五、Nginx、RabbitMQ和Redis在Linux中的安装和部署
  • Homebrew 入门教程(2025 年最新版)
  • docker-compose搭建 redis 集群
  • ETCD的简介和使用
  • 通用同步/异步收发器USART串口
  • Qwen-OCR:开源OCR技术的演进与全面分析
  • 嵌入式学习(day25)文件IO:open read/write close
  • Baumer高防护相机如何通过YoloV8深度学习模型实现木板表面缺陷的检测识别(C#代码UI界面版)
  • iOS混淆工具有哪些?团队协作视角下的分工与防护方案
  • Unity DOTS(一):ECS 初探:大规模实体管理与高性能
  • 鸿蒙下载图片保存到相册,截取某个组件保存到相册
  • 数据库常用操作
  • Linux 可执行程序核心知识笔记:ELF、加载、虚拟地址与动态库
  • 鸿蒙本地与云端数据双向同步实战:从原理到可运行 Demo 的全流程指南
  • Web学习笔记5
  • Linux环境gitlab多种部署方式及具体使用
  • 深入理解二维数组创建与使用
  • 使用正则中的sub实现获取我们匹配的字符串,然后追加指定字符
  • Linux图形化登录界面不显示root
  • SQL Server增加对UTF-8的支持