在处理大量数据时,传统的词袋模型存在局限性,而TF-IDF(词频-逆文档频率)技术能够有效地提升文本分类的效果,增强机器学习模型对文本信息的理解和分析能力。本文将展示如何在Python中从零开始构建TF-IDF模型,并进行数值计算。
TF-IDF是自然语言处理(NLP)中的关键技术,它通过考虑词频和词的稀有度来增强文本分类的效果。本文将详细解释包括词频(TF)、文档频率(DF)和逆文档频率(IDF)在内的核心术语,并逐步介绍TF-IDF分数的数值计算方法。
TF-IDF矩阵在搜索引擎、文本分类、聚类和摘要等领域有广泛应用,但它不考虑词序或上下文。
在深入计算和代码之前,理解以下关键术语是必要的:
t: 词(word)
d: 文档(document,一组词)
N: 语料库中的文档总数
语料库(corpus): 总文档集合
词频(TF)衡量一个词在文档中出现的频率。一个词在文档中的权重与其出现频率直接相关。词频的计算公式为:
文档频率(DF)衡量一个文档在语料库中的重要性。DF统计包含特定短语的文档数量,与TF不同,TF统计一个词在文档中出现的次数。文档频率的计算公式为:
逆文档频率(IDF)衡量一个词的信息量。在计算TF时,所有词被赋予相同的权重,而IDF有助于提升罕见词的权重,降低常见词(如停用词)的权重。IDF的计算公式为:
IDF(t) = log((N + 1) / (DF(t) + 1))
其中N是文档总数,DF(t)是包含词t的文档数量。
TF-IDF是词频-逆文档频率的缩写,是一种统计方法,用于评估一个词对文档在文档集合或语料库中的重要性。它结合了词在文档中的重要性(TF)和词在语料库中的稀有度(IDF)。计算公式为:
让分解给定文档的TF-IDF数值计算:
文档:
“天空是蓝色的。”
“今天太阳很明亮。”
“天空中的太阳很明亮。”
“可以看到闪耀的太阳,明亮的太阳。”
文档1:“天空是蓝色的。”
词 计数 TF
the 1 1/4
sky 1 1/4
is 1 1/4
blue 1 1/4
文档2:“今天太阳很明亮。”
词 计数 TF
the 1 1/5
sun 1 1/5
is 1 1/5
bright 1 1/5
today 1 1/5
文档3:“天空中的太阳很明亮。”
词 计数 TF
the 2 2/7
sun 1 1/7
in 1 1/7
sky 1 1/7
is 1 1/7
bright 1 1/7
文档4:“可以看到闪耀的太阳,明亮的太阳。”
词 计数 TF
we 1 1/9
can 1 1/9
see 1 1/9
the 2 2/9
shining 1 1/9
sun 2 2/9
bright 1 1/9
使用N=4:
词 DF IDF
the 4 log(4/4+1)=log(0.8)≈−0.223
sky 2 log(4/2+1)=log(1.333)≈0.287
is 3 log(4/3+1)=log(1)=0
blue 1 log(4/1+1)=log(2)≈0.693
sun 3 log(4/3+1)=log(1)=0
bright 3 log(4/3+1)=log(1)=0
today 1 log(4/1+1)=log(2)≈0.693
in 1 log(4/1+1)=log(2)≈0.693
we 1 log(4/1+1)=log(2)≈0.693
can 1 log(4/1+1)=log(2)≈0.693
see 1 log(4/1+1)=log(2)≈0.693
shining 1 log(4/1+1)=log(2)≈0.693
现在,让计算每个文档中每个词的TF-IDF值。
文档1:“天空是蓝色的。”
词 TF IDFTF-IDF
the 0.25 -0.223 0.25 * -0.223 ≈-0.056
sky 0.25 0.287 0.25 * 0.287 ≈ 0.072
is 0.25 0 0.25 * 0 = 0
blue 0.25 0.693 0.25 * 0.693 ≈ 0.173
文档2:“今天太阳很明亮。”
词 TF IDFTF-IDF
the 0.2 -0.223 0.2 * -0.223 ≈ -0.045
sun 0.2 0 0.2 * 0 = 0
is 0.2 0 0.2 * 0 = 0
bright 0.2 0 0.2 * 0 = 0
today 0.2 0.693 0.2 * 0.693 ≈0.139
文档3:“天空中的太阳很明亮。”
词 TF IDFTF-IDF
the 0.285 -0.223 0.285 * -0.223 ≈ -0.064
sun 0.142 0 0.142 * 0 = 0
in 0.142 0.693 0.142 * 0.693 ≈0.098
sky 0.142 0.287 0.142 * 0.287≈0.041
is 0.142 0 0.142 * 0 = 0
bright 0.142 0 0.142 * 0 = 0
文档4:“可以看到闪耀的太阳,明亮的太阳。”
词 TF IDFTF-IDF
we 0.111 0.693 0.111 * 0.693 ≈0.077
can 0.111 0.693 0.111 * 0.693 ≈0.077
see 0.111 0.693 0.111 * 0.693≈0.077
the 0.222 -0.223 0.222 * -0.223≈-0.049
shining 0.111 0.693 0.111 * 0.693 ≈0.077
sun 0.222 0 0.222 * 0 = 0
bright 0.111 0 0.111 * 0 = 0
现在让使用scikit-learn中的TfidfVectorizer和内置数据集来应用TF-IDF计算。
确保已安装scikit-learn:
pip install scikit-learn
import pandas as pd
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
获取20 Newsgroups数据集:
newsgroups = fetch_20newsgroups(subset='train')
vectorizer = TfidfVectorizer(stop_words='english', max_features=1000)
将文本文档转换为TF-IDF矩阵:
tfidf_matrix = vectorizer.fit_transform(newsgroups.data)
将矩阵转换为DataFrame以提高可读性:
df_tfidf = pd.DataFrame(tfidf_matrix.toarray(), columns=vectorizer.get_feature_names_out())
df_tfidf.head()
通过使用20 Newsgroups数据集和TfidfVectorizer,可以将大量文本文档转换为TF-IDF矩阵。这个矩阵以数值形式表示每个文档中每个词的重要性,便于进行文本分类、聚类等自然语言处理任务。scikit-learn中的TfidfVectorizer提供了一种高效直接的方式来实现这种转换。