【机器学习】TF-IDF词袋模型简介

文章目录

    • 引言
    • TF-IDF 计算公式
    • 使用sklearn 来计算TF-IDF
    • 总结

引言

TF-IDF 全称为TF-IDF(Term Frequency-Inverse Document Frequency, 词频-逆文档频率), 这是一种统计方法,用来评估一个词对于一个文件集或语料库中的其中一份文件的重要程度,字词的重要性随着它在文件中出现的次数成正比增加, 但是同时也会随着它在语料库中出现的频率成反比下降。

也就是说,一个词语在一个文章中出现的次数越多, 同时在所有文档中出现的次数越少,则越能够代表这篇文章。

TF-IDF 计算公式

TF(Term Frequency,词频)表示词条在文本中出现的频率

公式使用文字的描述会比较清晰。
TF = 某个词在文章中出现的总次数/文章的总词数

IDF 用来表示逆文档频率, 所谓逆文档频率其实是用来反映一个词在所有文档中出现的频率, 当一个词在很多文档中出现的时候, 对应的IDF的值也会变低, 当一个词在很少的文档中出现的时候, 其对应的IDF的值就会变高。计算公式如下:

IDF = log(语料库中的文档总数/ (包含该词的文档数 + 1))

我们把TF-IDF 定义为:

TF-IDF = TF * ID

思考:

  1. TF-IDF输出来的数据形状是啥样子?
    计算出来的应该是一个矩阵,第一个维度的大小,是所有词的个数, 第二个维度的大小,是文章的个数。 这个矩阵一般是非常稀疏的,因为词库中词的数量是非常多的,但是一个句子中的词的数量比较少。
  2. TF-IDF矩阵中每个元素的值域是什么呢?
    TF的值域为[0, 1]
    IDF 的值域: 接近0的负数 到 正无穷
    考虑两个极端情况:
  • 如果包含该词的文档数很少, 例如 1, 那么IDF的值会非常大。
  • 如果包含该词的文档数很多, 例如,每个文档都有这个字, 那么IDF的值为负数,接近于0。

使用sklearn 来计算TF-IDF

这里写一个具体的实例,代码分析结果和数据结构。重点关注: 函数库的输入是啥,输出是啥?

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

text = [
    "what is the weather like today",
    "what is for dinner tonight",
    "this is a question worth pondering",
    "it is a beautiful day today",
    "i want go school"
]

# CountVectorizer()这个函数的作用是啥,什么场景下用比较合适? 答: 这个函数可以用来转换为词频矩阵。
# 一般来讲, 可以根据场景来确定使用词频矩阵作为特征还是 TF-IDF矩阵作为特征。

tfidf_vec = TfidfVectorizer()
# 得到 tfidf 的矩阵, 输入是一个可以迭代的访问字符串的对象, 比如列表,列表中的元素为字符串。
tfidf_matrix = tfidf_vec.fit_transform(text)
# 得到不重复的单词
print(tfidf_vec.get_feature_names())

# 得到每个单词所对应的ID,这是一个字典
print(tfidf_vec.vocabulary_)
# 输出矩阵,初学者可能看不懂这个矩阵,这里解释一下,由于是稀疏的, 采用三元组的形式表示这个矩阵的元素,对于非0的元素, 前面两个值表示元素在矩阵中的位置, 后面一个元素表示元素的值大小。
print(tfidf_matrix)
## 转化为pd 矩阵, 通过打印可以知道tfidf矩阵的大小, 列数为所有不同的单词数, 行数为句子的格式
df_pd = pd.DataFrame(tfidf_matrix.toarray())
# 打印数组的形状。
print(df_pd.shape)

# 如何打印这个矩阵的大小呢?
print(df_pd)
# 如何把这个矩阵变为列表呢?
weight = tfidf_matrix.toarray()
print(weight)

# data_list = df_pd.values.tolist()
# print(data_list)
# 如何把这个矩阵压缩呢? 希望使用PCA降维的方式来降低维度。
from sklearn.decomposition import PCA
print('原有维度: ', len(weight[0]))
print('开始降维')
pca = PCA(n_components=4)
X = pca.fit_transform(weight)
print('降维后维度: ', len(X[0]))
print(X)

总结

本文介绍了TF-IDF的基本概念,然后介绍了sklearn 中的具体使用方法,数据的输入输出以及降维处理。 了解了这些,基本就可以在实际的业务场景中灵活使用TF-IDF特征 进行机器学习训练了。

你可能感兴趣的:(深度学习,tf-idf,sklearn)