[机器学习与scikit-learn-43]:特征工程-特征提取(编码)-2-什么是特征提取以及文本词频向量
Posted 文火冰糖的硅基工坊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[机器学习与scikit-learn-43]:特征工程-特征提取(编码)-2-什么是特征提取以及文本词频向量相关的知识,希望对你有一定的参考价值。
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://mp.csdn.net/mp_blog/creation/editor/123284311
目录
第1章 从文本中提取特征概述
1.1 概述
有时候,给定的样本数据以一串字符串文本,字符串文本本身是无法进行模型训练的,这就需要对所有样本中的所有字符串单词进行统一编码,然后用编码后的数据表示原先的字符串文本。
每一个字符串文本,我们称为一个样本,样本字符串中的字符的个数有长有短,而不是一个单词是一个样本,也不是整篇文章是一个样本。
1.2 为什么不能采用ASCII编码
在计算机中,ASCII编码是字符编码最基本编码方式,但ASCII编码的数值只是计算机用于代表字母的一种方式,ASCII值本身无法反应字符串的特征!!!比如0和100,无法反应字符或字符串的特征!!!,而机器学习关注数据样本的内在的特征。
1.3 什么是特征
特征的意思是一事物异于其他事物的某一方面的特点。
特征的英文是“feature”
综合来看,特征就是,于己而言,特征是某些突出性质的表现,于他而言,特征是区分事物的关键,所以,当我们要对事物进行分类或者识别,我们实际上就是提取‘特征’,通过特征的表现进行判断。
特征是多个维度的,如年龄、身高、体重这些都是特征 。
1.4 什么是特征提取
机器学习的模型是基于样本的特征来进行了,而不是基于原始的数据来进行的。
传统的机器学习的特征是由人来完成的,人会从原始的数据中,预先提取并转换为机器模型能够识别的特征数据。机器学习的模型,只能够识别经过认为提取后的特征,而不是能识别原始数据,这个过程就是特征提取!!!!比如从文本数据中提取每个单词的出现的频率值,并转换成词频向量,这就是特征提取。
深度学习的特征是有神经网络自动完成的,神经网络能够从原始数据(如视频、文本)中自动发现原始数据内在的特征!然后根据自动发现的特征,进行模型的学习与预测。这也深度学习的强大之处!!!
(1)传统机器学习的特征提取(人为提取)
当原始数据的特征是明确的,人可以方便的把数据的特征提取出来,以结构化或列表的方式把特征数据以数值的方式提供给模型。
没有提取出来的合适的特征,再好的传统的机器学习模型或算法都是徒劳。
(2)深度学习的特征提取(神经网络自动提取)
当原始数据的特征是不明确的,无法通过认为来提取特征,就只能通过深度学习了。
如原始图片中物体的轮廓、颜色,大小、位置等信息,是不太可能通过人来为某个具体的图片来提取他们的特征,然后在提供给模型的,只能让模型自己去发现原始图片(像素)中,物体的特征。卷积神经网络CNN就是自动发现原始图中,物体特征的一种神经网络!!!
这就是深度学习强大之处!!!
大多数时候,发现原始数据内在特征的模型比分类或拟合算法模型更加的重要!!!
比如图像处理,CNN非常复杂,它是用来负责特征发现的。全连接网络比较简单,它是用来分类的。
1.5 要对文本进行编码,需要遵循几个基本的规则
(1)把字符串转换成一个一维的向量,这个向量能够代表字符串文本。
(2)要多样本中的单词进行统一编码,通常采用的是OneHot编码,而不是传统的ASCII编码或unicode编码,因为这些编码本身的数值代表的大小。
(3)编码后的向量与向量之间的差易性可以通过向量距离表示,而不是用两个数值的绝对值的差来表示。
第2章 特征提取方法:词频向量
2.1 什么是词频
词频就是单词出现的频率,单词出现的频率,一定程度上反应了文本内在的特征。
2.1 英文词频向量(CountVectorizer)
(1)定义
根据文本中单词出现的次数进行向量编码:
- 向量中每个分量的值反应了单词出现的频次。
- 向量的长度,反应了所有样本中单词的个数。
- 每个向量位置代表的单词,依据OneHot编码
词库模型(Bag-of-words model)是文字模型化最常用方法,它为每个单词设值一个特征值。依据
是用类似单词的文章意思也差不多。
(2)CountVectorizer工作过程
文本是一篇文章或一段话,或一句话等等,它是样本的最小单位。
- 预处理:CountVectorizer 类会将文档(文本)全部转换成小写。
- 预处理:词块大多是单词,但是他们也可能是一些短语,字母长度小于2的词块(如 I, a)被略去。可以用stop_words选项排除一些常用但没有太多意义的助词(如is,are,in)。
- 分词:把句子分割成词块(token)或有意义的字母序列。
- 词频统计:统计它们出现的次数。
- 构建字典:把文本转换成字典,如:'love': 4, 'china': 1, 'chinese': 2, 'beijing': 0, 'sky': 6, 'eat': 3, 'rice': 5
- 词向量编码:把字典转换成词向量编码(类似oneHot编码),如:[4 1 2 0 6 3 5]。
单词1 Love | 单词2 china | 单词3 Chinese | ...... beijin | .... sky | ...... eat | 单词N rice | |
文本1 | 4 | 1 | 2 | 0 | 6 | 3 | 5 |
文本2 | 2 | 4 | ..... | ||||
.... | |||||||
文本M |
(3)编码的优缺点:
只考虑了单词出现测频次,没有考虑单词的语义和上下文关系。
频次越高,向量中该单词对应分量位置的数值越大。
(3)CountVectorizer代码案例分析
from sklearn.feature_extraction.text import CountVectorizer
# 待编码的文本
Texts = [
'I love china, I love chinese!',
'I love beijing, I love sky',
'I eat rice'
]
# 创建一个词频向量转换器
vectorizer = CountVectorizer(stop_words = 'english') # 设置停用词
# 进行词频向量转换, 数值反应的是在单词在OneHot编码中的位置
X = vectorizer.fit_transform(Texts).todense()
print ("显示单词的编码:\\n", vectorizer.vocabulary_)
print ("\\n显示编码后的词向量:\\n", X)
显示单词的编码: 'love': 4, 'china': 1, 'chinese': 2, 'beijing': 0, 'sky': 6, 'eat': 3, 'rice': 5 备注:单词编码后,转换了key:value字典,value表示在oneHot编码中的位置。 如上述案例有7个单词,可以用7个向量来表示一句话,X X X X X X X. 不同的单词,占用X的不同位置,如love单词,在第4个位置:X X X X X X X 显示编码后的词向量: [[0 1 1 0 2 0 0] [1 0 0 0 2 0 1] [0 0 0 1 0 1 0]]
以'I love china, I love chinese!'样本的编码:[0 1 1 0 2 0 0]为例,解读这种编码的方法。
自左右向:
第0位的0:第0位表示beijing单词的OneHot编码的位置;0表示sky在该单个样本中的次数为0.
第1位的1:第1位表示china单词的OneHot编码的位置;1表示china在该单个样本中的次数为1.
第2位的1:第2位表示chinese单词的OneHot编码的位置;1表示beijing在该单个样本中的次数为1.
第3位的0:第3位表示eat单词的OneHot编码的位置;0表示eat在该单个样本中的次数为0.
第4位的2:第4位表示love单词的OneHot编码的位置;3表示love在该单个样本中的次数为2.
第5位的0:第0位表示rice单词的OneHot编码的位置;0表示sky在该单个样本中的次数为0.
第6位的0:第0位表示sky单词的OneHot编码的位置;0表示sky在该单个样本中的次数为0.
2.2 中文词频编码
(1)概述
对于对中文文本进行词频特征提取,可以先用jieba进行分词。
分词及难点:就是把中文文本,分割成一个个单词,而不是一个个中文字。
英文有26个单字母,26个字母组成单词,如mine,单词之间通过空格分开,因此,因为的分词是比较简单的,通过空格就可以区分开。
然后,中文的最基本单元是笔画,笔画构成了单字,单字构成了单词,单词构成了句子=》段落=》文章。
中文的单字和单词之间都没有空格分离,只有句子之间才有分割,这就给中文的分词带来了极大的麻烦。中文的分词有点类似英文的词组,比如北京,这是两个中文字,但实际是一个中文单词。
中文分词后,就与英文分词后的过程一样了:分词=》频率统计=》构建字典=》词向量编码。
(2)jieba库
中文分词需要专门的库,相当于在文本中对中文词与词之间增加一个类似英文的“空格”的过程。
经过中文分词后的文本,就可以给CountVectorizer进行处理了!!!
jieba库是一款优秀的 Python 第三方中文分词库,jieba 支持三种分词模式:精确模式、全模式和搜索引擎模式,下面是三种模式的特点。
- 精确模式:试图将语句最精确的切分,不存在冗余数据,适合做文本分析。
- 全模式:将语句中所有可能是词的词语都切分出来,速度很快,但是存在冗余数据
- 搜索引擎模式:在精确模式的基础上,对长词再次进行切分。
(3)中文词频编码案例
import jieba
from sklearn.feature_extraction.text import CountVectorizer
Texts = [
'朋友,小红是我的好朋友',
'小明对小红说:“小红,我们还是不是朋友”',
'小明与小红是朋友'
]
cutTexts= ["/".join(jieba.cut(x)) for x in Texts]
print("分词后的文本:\\n", cutTexts)
# 生成一个词频转换器对象, 去除一些不意义的词“好的是的”
vectorizer = CountVectorizer(stop_words = ['好的','是的'])
X = vectorizer.fit_transform(cutTexts).todense()
print ("\\n查看映射字典:\\n", vectorizer.vocabulary_)
print ("\\n查看编码:\\n", X)
分词后的文本: ['朋友/,/小红/是/我/的/好/朋友', '小明/对/小红/说/:/“/小红/,/我们/还/是不是/朋友/”', '小明/与/小红/是/朋友'] 查看映射字典: '朋友': 4, '小红': 1, '小明': 0, '我们': 2, '是不是': 3 查看编码: [[0 1 0 0 2] [1 2 1 1 1] [1 1 0 0 1]]
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://mp.csdn.net/mp_blog/creation/editor/123284311
以上是关于[机器学习与scikit-learn-43]:特征工程-特征提取(编码)-2-什么是特征提取以及文本词频向量的主要内容,如果未能解决你的问题,请参考以下文章
如何使用机器学习模型(或其特征系数)来解释该特征是不是与特定类别相关?