TF-IDF(Term Frequency-Inverse Document Frequency)是自然语言处理(NLP)中常用的一种文本分析方法。该方法通过计算在一个文档库中一个词语在一个文档中出现的频率,以及该词语在整个文档库中的出现频率,来衡量一个词语在文档中的重要程度。
具体来说,TF-IDF模型中的TF和IDF表示如下:
- Term Frequency(词频,TF):指一个词语在一个文档中出现的频率,可以简单地表示为:
TF(t) = (词语t在文档中出现的次数) / (文档中词语总数)
其中,t为指定的词语。
- Inverse Document Frequency(逆文档频率,IDF):指一个词语在整个文档库中出现的频率,可以简单地表示为:
IDF(t) = log_e(文档库中文档总数 / 包含词语t的文档数)
其中,文档库指的是所有文档的集合。
而TF-IDF的最终值就是将上述两个值相乘:
TF-IDF(t) = TF(t) * IDF(t)
这个值越高,就代表该词语在该文档中越重要。因此,在文本分类、信息检索、文本聚类等任务中,TF-IDF被广泛应用。
示例1:计算词语在单个文档中的TF-IDF
假设有以下文本:
This is a sample document. It contains words and more words.
我们想计算词语“words”的TF-IDF值。首先,计算该词在本文档中的出现次数为2次,而文本总共包含了9个词语,因此“words”的TF就是2/9。接着,计算文档库中包含“words”的文档数,发现只有该文档包含了“words”,因此IDF为log_e(1/1) = 0。最终,这个词语的TF-IDF就是0。
示例2:检查两个文档之间的相似度
假设现在有两个文档:
文档1:
The quick brown fox jumps over the lazy dog.
文档2:
A dog is a faithful companion to a man.
我们想比较这两个文档的相似度。首先,我们需要将这两个文档转化为词向量,即将每个词都转化为一个数字表示。可以使用sklearn中的CountVectorizer来实现这个过程:
from sklearn.feature_extraction.text import CountVectorizer
docs = [
'The quick brown fox jumps over the lazy dog.',
'A dog is a faithful companion to a man.'
]
# 将文本转成词向量
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(docs)
此时,X就是一个2×9的稀疏矩阵,每一行代表一个文档,每一列代表一个词语,里面的数字代表该词语在该文档中出现的次数。
接下来,计算每个词语的TF-IDF值,可以使用sklearn中的TfidfTransformer来实现:
from sklearn.feature_extraction.text import TfidfTransformer
# 计算每个词的TF-IDF值
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(X)
# 转化为数组
tfidf_array = tfidf.toarray()
现在,tfidf_array就是一个2×9的数组,里面的数字就代表每个词语在对应文档中的TF-IDF值。
最后,我们可以计算这两个文档的余弦相似度,来衡量它们的相似度:
from sklearn.metrics.pairwise import cosine_similarity
# 计算余弦相似度
similarity = cosine_similarity(tfidf_array[0].reshape(1,-1), tfidf_array[1].reshape(1,-1))
print(similarity)
这里输出的余弦相似度为0.1667,说明这两个文档相似度相对较低。