[机器学习与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编码

1.3 什么是特征

1.4 什么是特征提取

1.5 要对文本进行编码,需要遵循几个基本的规则

第2章 特征提取方法:词频向量

2.1 什么是词频

2.1 英文词频向量(CountVectorizer)

2.2 中文词频编码


第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

文本14120635
文本224.....
....
文本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-什么是特征提取以及文本词频向量的主要内容,如果未能解决你的问题,请参考以下文章

Python 与金融数据|生成机器学习的标签和特征

机器学习实战 | 机器学习特征工程最全解读

机器学习 - 特征筛选与降维

如何使用机器学习模型(或其特征系数)来解释该特征是不是与特定类别相关?

[机器学习与scikit-learn-42]:特征提取-1-从字典中提取特征

机器学习特征筛选:相关系数法(correlation)