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

发布于:2025-03-29 ⋅ 阅读:(29) ⋅ 点赞:(0)

引言

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

一、什么是TF-IDF?

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

TF-IDF由两部分组成:

  1. 词频(TF, Term Frequency):衡量词在文档中出现的频率
  2. 逆文档频率(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列表:

在这里插入图片描述
TF-IDF矩阵转换为DataFrame矩阵格式:

在这里插入图片描述

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)
  • featurelist = df.iloc[:,5].to_list():通过索引号获取第6列的内容并转换为列
  • resdict = {}:创建一个空字典 resdict,用于存储词汇和对应的特征值。
  • resdict[wordlist[i]] = featurelist[i]:将 wordlist 中的每个词作为键,featurelist 中对应的值作为值,存入字典 resdict。例如,如果 wordlist = [‘apple’, ‘banana’],featurelist = [0.5, 0.8],则 resdict = {‘apple’: 0.5, ‘banana’: 0.8}。
  • sorted(): 返回排序后的列表,每个元素是一个 (key, value) 元组。
  • resdict.items(): 将字典转换为 (key, value) 对的列表。
  • key=lambda x: x[1]: 指定排序依据为字典的值(即特征值)。
  • reverse=True: 按降序排序(从大到小)。

6.全部代码

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

inFile = 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,并在实际项目中灵活应用这一强大的文本特征提取工具。