任务:
- 词袋模型:离散、高维、稀疏;
- 分布式表示:连续、低维、稠密。word2vec词向量原理并实践,用来表示文本;
1. 词袋模型:
词集模型: 单词构成的集合,集合中每个元素都只有一个;
词袋模型:在词集的基础上,如果一个单词在文档中出现不止一次,统计其出现的次数;
词袋在词集的基础上增加了频率的维度,词集关注的是单词是否存在,词袋增加关注了单词出现的频率;
其python的实现:参见前面“TF-IDF”文章
2. one-hot
中文名叫独热编码、一位有效编码。方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有其独立的寄存器位,并且任意时刻,有且仅有一个状态位是有效的。比如,手写数字识别,数字为0-9共10个,那么每个数字的one-hot编码为10位,数字i的第i位为1,其余为0,如数字2的one-hot表示为:[0,0,1,0,0,0,0,0,0,0]。
1) one-hot在提取文本特征上的应用
one-hot在特征提取上属于词袋模型(bags of words)
假设语料库有这么三段话:
我爱中国
爸爸妈妈爱我
爸爸妈妈爱中国
对语料库分词并进行编号
1我;2爱;3爸爸;4妈妈;5中国
对每段话用onehot提取特征向量
则三段话由onehot表示为:
我爱中国 -> 1,1,0,0,1
爸爸妈妈爱我 ->1,1,1,1,0
爸爸妈妈爱中国 ->0,1,1,1,1
2)优点
可以将数据用onehot进行离散化,在一定程度上起到了扩充特征的作用
3)缺点
没有考虑词与词之间的顺序,并且假设词与词之间相互独立,得到的特征是离散稀疏的(如果365天用onehot,就是365 维,会很稀疏)
4)举例
在实际的机器学习的应用任务中,特征有时候并不总是连续值,有可能是一些分类值,如性别可分为“male”和“female”。在机器学习任务中,对于这样的特征,通常我们需要对其进行特征数字化,如下面的例子:
有如下三个特征属性:
性别:["male","female"] # 所有可能取值,0,1 两种情况
地区:["Europe","US","Asia"] #0,1,2 三种情况
浏览器:["Firefox","Chrome","Safari","Internet Explorer"] #0,1,2,3四种情况
所以样本的第一维只能是0或者1,第二维是0,1,2三种情况中的一种,第三维,是0,1,2,3四种情况中的一种。
对于某一个样本,如["male","US","Internet Explorer"],我们需要将这个分类值的特征数字化,最直接的方法,我们可以采用序列化的方式:[0,1,3]。但是这样的特征处理并不能直接放入机器学习算法中。
对上述问题,我们发现性别2维,地区3维,浏览器4维则我们进行onehot编码需要9维。对["male","US","Internet Explorer"]进行onehot编码为:[1,0,0,1,0,0,0,0,1]
下面看如何用代码实现:
1 from sklearn import preprocessing
2 oh = preprocessing.OneHotEncoder()
3 oh.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]])#四个样本
4 oh.transform([[0,1,3]]).toarray()
结果:[[ 1. 0. 0. 1. 0. 0. 0. 0. 1.]]
[0,0,3] #表示是该样本是,male Europe Internet Explorer
[1,1,0] #表示是 female,us Firefox
[0,2,1]#表示是 male Asia Chrome
[1,0,2] #表示是 female Europe Safari
参考: https://www.cnblogs.com/NPC-assange/p/10879624.html
3.word2vec
(1)简单介绍word2vec
当今互联网迅猛发展,每天都在产生大量的文本、图片、语音和视频数据,要对这些数据进行处理并从中挖掘出有价值的信 息,离不开NLP,其中统计语言模型 就是很重要的一环,它是所有NLP的基础,被广泛应用于语音识别、机器翻译、分词、词性标注和信息检索等任务。
2013年Google开源了一款直接计算低微词向量的工具----Word2Vec,不仅能够在百万级的词典亿级数据集上高效训练,而且能够很好的度量词与词之间的相似性。
(2)word2vec的两种重要模型原理
1) CBOW模型
模型架构:
网络结构:
推导:
2)Skip-gram模型
网络结构:
推导:
(3)实践
创建模型:
# -*- coding: utf-8 -*-
from gensim.models import word2vec
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.Text8Corpus("b.txt") # 加载语料
model = word2vec.Word2Vec(sentences, size=200) # 默认window=5
model.save(u"c.model")
其中b是语料库,形式为:
使用模型:
# -*- coding: utf-8 -*-
from gensim.models import word2vec
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
model = word2vec.Word2Vec.load(u"c.model")
y2 = model.most_similar(positive=[u"中国",u"战争"],topn=20) # 20个最相关的
for i in y2:
print i[0],
# 抗日战争 国人 中日战争 侵略战争 二战 国家 我国 本国 中华民族 鸦片战争 抗战 南京大屠杀 文化大革命 别国 战败国 中日 当今世界 美国 国民性 解放战争
y2 = model.most_similar(positive=[u"美国",u"战争"],topn=20) # 20个最相关的
for i in y2:
print i[0],
# 二战 越战 伊战 越南战争 侵略战争 内战 第二次世界大战 南北战争 国家 二次世界大战 二次大战 朝鲜战争 太平洋战争 当今世界 抗日战争 米国 独立战争 殖民主义 霸权主义 强权政治
参考:https://www.cnblogs.com/NPC-assange/p/10879624.html
https://www.cnblogs.com/itmorn/p/8196605.html#ct7
4. one-hot与word2vec的区别
one-hot没有包含任何语料信息,所有的词之间的距离都是相同的。word2vec根据上下文关系定义了词的向量,关联度高的词有更近的距离。也就是说Word2vec表现力更强,更能表现数据的内在特征。