文本特征提取-TfidfVectorizer和CountVectorizer

简介: 文本特征提取-TfidfVectorizer和CountVectorizer

Bag of words(词袋)


统计每个词在文档中出现的次数


from sklearn.feature_extraction.text import CountVectorizer
documents = ['我 爱 北京 天安门,天安门 很 壮观',
             '我 经常 在 广场 拍照']
count_vec = CountVectorizer()
count_data = count_vec.fit_transform(documents)
print(count_data, count_data.shape, type(count_data))
count_array = count_data.toarray()
print(count_array, count_array.shape, type(count_data))
print('词汇表为:\n', count_vec.vocabulary_)


输出为:


(0, 1)    1  # 这里=>0代表第一个文档,也就是我们语料中第一句话,1地表词汇的索引,在这里是壮观
  (0, 2)    2
  (0, 0)    1
  (1, 4)    1
  (1, 3)    1
  (1, 5)    1 (2, 6) <class 'scipy.sparse.csr.csr_matrix'>
[[1 1 2 0 0 0] =>第一个文档对应的单词索引
 [0 0 0 1 1 1]] (2, 6) <class 'scipy.sparse.csr.csr_matrix'>
词汇表为:
 {'北京': 0, '天安门': 2, '壮观': 1, '经常': 5, '广场': 3, '拍照': 4}


tfidf


计算文档中每个词的tfidf值


from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vecc = TfidfVectorizer()
count_data = tfidf_vecc.fit_transform(documents)
print(count_data, count_data.shape, type(count_data))
count_array = count_data.toarray()
print(count_array, count_array.shape, type(count_data))
print('词汇表为:\n', tfidf_vecc.vocabulary_)


(0, 0)    0.408248290463863
  (0, 2)    0.816496580927726
  (0, 1)    0.408248290463863
  (1, 5)    0.5773502691896257
  (1, 3)    0.5773502691896257
  (1, 4)    0.5773502691896257 (2, 6) <class 'scipy.sparse.csr.csr_matrix'>
[[0.40824829 0.40824829 0.81649658 0.         0.         0.        ]
 [0.         0.         0.         0.57735027 0.57735027 0.57735027]] (2, 6) <class 'scipy.sparse.csr.csr_matrix'>
词汇表为:
 {'北京': 0, '天安门': 2, '壮观': 1, '经常': 5, '广场': 3, '拍照': 4}


csr_matrix


其实我比较疑惑的地方是toarray()这个方法,count_data 为什么可以通过这个方法可以转化成那个样子,后来查了一下资料:

下面是一个关于csr_matrix的实例:


import numpy as np
from scipy.sparse import csr_matrix
arr = np.array([[0, 1, 0, 2, 0], [1, 1, 0, 2, 0], [2, 0, 5, 0, 0]])
b = csr_matrix(arr)
print(b.shape)
# 非零个数
print(b.nnz)
# 非零值
print(b.data)
# 稀疏矩阵非0元素对应的列索引值所组成数组
print(b.indices)
# 第一个元素0,之后每个元素表示稀疏矩阵中每行元素(非零元素)个数累计结果
print(b.indptr)
print(b)


输出为:


(3, 5)
7
[1 2 1 1 2 2 5]
[1 3 0 1 3 0 2]
[0 2 5 7]  =>是因为[0, 1, 0, 2, 0]有两个非0元素,[1, 1, 0, 2, 0]有3个非0,默认第一行为0,其次累加:2,2+3=5,5+2=7
  (0, 1)    1
  (0, 3)    2
  (1, 0)    1
  (1, 1)    1
  (1, 3)    2
  (2, 0)    2
  (2, 2)    5


101.png


我们看下toarray的结果


b为:
  (0, 1)    1
  (0, 3)    2
  (1, 0)    1
  (1, 1)    1
  (1, 3)    2
  (2, 0)    2
  (2, 2)    5


print(b.toarray())
[[0 1 0 2 0]
 [1 1 0 2 0]
 [2 0 5 0 0]]


我们可以看书,[0 1 0 2 0]就是将(0, 1) 1  (0, 3) 2,相对应的值,填到索引位置上。

这里比较绕,然我整理下思绪O(∩_∩)O哈哈~。。。。


参考资料:

csr_matrix矩阵

sparse.csr_matrix矩阵的压缩存储

CountVectorizer与TfidfVectorizer的参数设置



相关文章
|
5月前
|
机器学习/深度学习 自然语言处理 算法
使用sklearn+jieba完成一个文档分类器
使用sklearn+jieba完成一个文档分类器
|
11月前
|
机器学习/深度学习
FastText
简单文本分类网络
|
算法
【文本分类】基于改进CHI和PCA的文本特征选择
【文本分类】基于改进CHI和PCA的文本特征选择
105 0
【文本分类】基于改进CHI和PCA的文本特征选择
|
机器学习/深度学习 自然语言处理 算法
【文本分类】基于改进TF-IDF特征的中文文本分类系统
【文本分类】基于改进TF-IDF特征的中文文本分类系统
190 0
【文本分类】基于改进TF-IDF特征的中文文本分类系统
|
存储 人工智能 Python
sklearn中的文本特征提取方法
什么是特征提取? 特征提取就是将一些原始的输入的数据维度减少或者将原始的特征进行重新组合以便于后续的使用。 比如: 我们知道有的时候原始数据的特征很多,而且有的高度相关,有的却又和最终的目的没有关系。我们需要去除没有关系的特征。(减少数据维度) 对于图像来说,每个图像有很多数据,这时候如果直接拿这些原始数据去计算则会非常缓慢,这对我们实时运行没有好处,我们需要提取出新的特征。(减少数据维度) 我们通过原始数据很多维特征,得到一个新的特征,最后通过这个新的特征来指导做决策。(整理已有的数据特征) 作者:吃果冻不吐果冻皮 链接:https://juejin.cn/post/69986867315
|
Serverless
CountVectorizer与TfidfVectorizer的区别
CountVectorizer与TfidfVectorizer的区别
360 0
|
机器学习/深度学习 算法 测试技术
特征工程(三):特征缩放,从词袋到 TF-IDF
字袋易于生成,但远非完美。假设我们平等的统计所有单词,有些不需要的词也会被强调。在第三章提过一个例子,Emma and the raven。我们希望在文档表示中能强调两个主要角色。示例中,“Eama”和“raven”都出现了3词,但是“the”的出现高达8次,“and”出现了次,另外“it”以及“was”也都出现了4词。
3447 0
|
机器学习/深度学习 自然语言处理 Python
基于jieba、TfidfVectorizer、LogisticRegression的垃圾邮件分类
2018年9月27日笔记 jieba中文叫做结巴,是一款中文分词工具,官方文档链接:https://github.com/fxsjy/jieba TfidfVectorizer中文叫做___ 词频逆文档频率向量化模型,是用来文章内容向量化的工具,官方文档链接:http://sklearn.
3784 0
|
机器学习/深度学习 自然语言处理 测试技术
基于jieba、TfidfVectorizer、LogisticRegression的文档分类
学习资源来源:容大教育,致以诚挚的谢意。 重新编辑:潇洒坤 jieba中文叫做结巴,是一款中文分词工具,官方文档链接:https://github.com/fxsjy/jieba TfidfVectorizer中文叫做词袋向量化模型,是用来文章内容向量化的工具,官方文档链接:http://sklearn.
1272 0
|
机器学习/深度学习 测试技术
基于SVM、Pipeline、GridSearchCV的鸢尾花分类
SVM中文叫做支持向量机,support vector machine的简写,是常用的分类方法。 Pipeline中文叫做管道,是sklearn中用来打包数据预处理、模型训练这2个步骤的常用方法。
1872 0