一 、Word2Vec模型的背景引入
1.1 One-hot模型
One-hot模型是是用N位的状态寄存器对N个状态进行编码
如下所示,是有4个样本,每个样本都有三个特征,特征1表示当前样本的性别。
我们喂给算法怎么样的数据,算法就会给我们一个怎么样的结果。
假设如果用1表示女性,2表示男性。那么将相当于还没有进行算法的计算的时候,已经有数据的倾向性,间接认为男性比女性重要。如果我们用这种带着偏见的数据,喂给模型,那么模型也会认为男性比女性重要。所以这样的数据会很大因素影响最后的预测结果。这是我们不希望看到的。
所以我们就需要对这样的数据进行改进,让每个一个数据的重要性都一致。就可以进行One-Hot的编码。
N个寄存器,表示当前数据的N个状态,不同的位置表示不同的状态, 这样就表示数据之间的重要性是一致的,如下所示。
优缺点分析:
通过One-Hot 模型确实会,解决数据过于离散的问题,并且会扩充特征,但是同时也会带来维度灾难的问题。
1.2 One-Hot编码的手动实现
import numpy as np
samples = ['我 毕业 于 北京理工大学','我 就职 于 中国 研究院']
#构建字典索引
token_index = {}
for sample in samples:
for word in sample.split():
if word not in token_index:
token_index[word] = len(token_index) + 1
print(token_index)
#对每个词进行编号
results = np.zeros(shape = (len(samples),len(token)+1,max(token_index.values()) +1 )
for i, sample in enumerate(samples):
for j, word in list(enumerate(sample.split())):
index = token_index.get(word)
print(j,index,word)
results[i,j,index] = 1
print(result)
fi_results = np.zeros(shape=(len(samples), max(token_index.values())+1))
for i, sample in enumerate(samples):
for _,word in list(enumerate(sample.split())):
index = token_index.get(word)
fi_results[i,index] = 1
print(fi_results)
array([[[0., 1., 0., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0., 0.],
[0., 0., 0., 1., 0., 0., 0.],
[0., 0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0.]],
[[0., 1., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 1., 0.],
[0., 0., 0., 1., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 1.],
[0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0.]]])
array([[0., 1., 1., 1., 1., 0., 0.],
[0., 1., 0., 1., 0., 1., 1.]])
1.3 Keras中one-hot编码的实现
from keras.preprocessing.text import Tokenizer
samples = ['我 毕业 于 北京理工大学','我 就职 于 中科院']
#构建单词索引
tokenizer = Tokenizer()
tokenizer.fit_on_texts(samples)
word_index = tokenizer.word_index
print(word_index)
print(len(word_index))
sequences = tokenizer.texts_to_sequences(samples)
print(sequences)
#直接构建one-hot
one_hot_results = tokenizer.texts_to_matrix(samples)
print(one_hot_results)
[[ 0. 1. 1. 1. 1. 0. 0.]
[ 0. 1. 1. 0. 0. 1. 1.]]
2. Word2vec的相关概念与知识
2.1 Word2vec介绍
Word2Vec的作者的相关文章
我们希望引入一个模型,能后减小表示每个词的维度,并且可以将每个词的相互的关系也能表达出来。
就引入了词向量,把所以的词放在一个向量空间当中。
将每个词从一个非常稀疏的向量空间,嵌入到一个向量空间,这个过程就是词嵌入的过程。
Word2Vec的注意点
2.2 Sigmoid函数与Softmax函数
Sigmoid函数
将取值范围映射到0,1区间的一个功能函数
定义域和值域
Softmax函数
实现将向量中所以的元素归一化为一个概率分布,向量中所有的元素取值范围在0,1,之间,且或有元素的和为1,相当与一个归一化。
2.3 二叉树相关概念
树1,按层次编号5结点没有左子树,有右子树,10结点缺失。树2由于3结点没有字数,是的6,7位置空挡了。树3中结点5没有子树。
2.4 哈夫曼树Huffman
路径长度就是,从根结点往下走的路径长值
结点的权,是指的是给结点赋予一个权重
带权路径长度是指的是从路径长度与节点的权的乘积之和。
哈夫曼树就是帯权路径长度最小的二叉树
哈夫曼树的构建过程,即为要选中权重最小的两个节点,将这两个节点进行合并,逐步重下向上何必,最终只剩下一棵树。
构建出来的哈夫曼二叉树,权重值越大的离根节点,越近,权重值越小,就离根节点越远。
2.5 哈夫曼编码
在信息通信领域哈夫曼编码的使用
等长编码,对于哪些不经常使用的字符,就会造成浪费,所以需要一个不等长的编码,进行优化整个流程。
将每个字符的出现频率作权重,将编码问题转为哈夫曼树问题。
文本领域的哈夫曼编码
通过映射可以发现,词之间 相互关系,词之间可以进行相互的计算。
3. 生成词向量的两种方式
Word2Vec的模型架构包括3个部分,one-hot输入层,中间的隐藏层,softmax输出层。
中间的隐藏层,没有激活函数,只是全连接的结构。
通过正向传播和反向传播,最终需要保留前面的输入的向量和隐藏层的参数。
通过原有的one—hot形式,通过隐藏层的计算,最后得到的是当前词向量。
模型的输入和输出
两者的比较,CBOW在小的数据库中比较合适,Skip—Gram在大型的语料中比较合适。
CBOW,相当于四个学生被一个老师带,学习的效果比不过 Skip—gram(一个学生四个老师带)