NLP之什么是TF-IDF模型?

  • Post category:人工智能

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,说明这两个文档相似度相对较低。