NLP
词向量
用一个向量表示一个词
基于One-hot 的词向量
特点
- 每个词的词向量都是一个地方为1,其他的地方为0的稀疏向量
优缺点
- 基于one-hot的是简单的词袋模型,并没有考虑词与词之间的顺序问题,且假设了词与词之间相互独立
- 虽然增加了识别特征,但是很可能会出现维度灾难
word2vec得到词向量
- “一个单词的意思经常是由其附近的单词给出的”—现代统计NLP最成功的概念之一
特点
word2vec将每个词以固定维度的向量表现出来,如前面的“向量表现出来”,一共有三个词,每个词都有一个n维的向量。
与one-hot不同的是,word2vec充分利用上下文信息,对上下文进行训练
每个词不再是只有一个地方是1的稀疏向量,而是一个稠密的固定维度的向量
优缺点
- 直观上可以减少额外的储存和计算开销
- 在深层次的语义上训练后能利用上下文的信息,能判定找到相似的词语
实现方式
- 1、用上下文预测中心词(CBOW: continue baga of word)
- 2、用中心词预测上下文(skip-gram)
从实现方式来看只是输入层和输出层上的变化(输入层是上下文或是中心词)
当然在预测的时候不会用全部上下文的数据,会有一个窗口([x-r,x+r]),用这个窗口中的数据来搞
CBOW模型
- 输入层:上下文单词的one-hot(1*V)
- 所有的onehot分别乘以共享的输入权重矩阵W(V*N)
- 所得到的向量(1*N)相加,作为隐层向量(再加上偏置)
- 乘以输出权重矩阵(N*V)
- 得到的向量用激活函数处理得到概率分布
Huffman
Huffman树(合并果子的流程树)
- 每个叶子节点有一个点权,构建一颗树使得每个叶子节点的点权乘上根节点到叶子节点的路径只和最小(在合并果子上就相当于,根节点到叶子节点的路劲就相当于一个果子被合并的次数)
Huffman树的构建
- 就用合并果子的方法构建就行了
Huffman编码
在数据通信中,需要将传送的文字转化成二进制的字符串。比如说一串文字,出现了”A,B,C,D”的字符,分别出现了100,100,10,10。然而我们在进行二进制编码的时候如果用00,01,10,11来编码,那么00,和01的出现次数会很多,这样会浪费空间
- 我们的策略是:出现频率低的用短码,出现频率高的用长码,以此来优化整个串的编码
- 所以我们可以直接根据出现的评率来构建一颗树,然后每个分叉的左右子树的标记为0和1,然后一个词的编码就是沿着Huffman树从上至下的01串
计算一个句子的出现概率
直接基于条件概率
$$
P(S)=(w_1,w_2,…,w_n)\
=P(w_1)P(w2|w1)P(w3|w1,w2)…P(wn|w1,w2,…)
$$
这样计算到后面,参数空间过大,条件概率非常难计算
马尔科夫假设
为了解决参数空间过大的问题,根据马尔科夫链的定义:随意一个词的出现的概率只与前面出现的有限的一个或几个词有关
所以假设每个词只和前面那个词的出现概率有关,所以就有
$$
P(w_1,w_2,…,w_n)≈P(w_1)P(w_2|w_1)P(w_2|w_3)…P(w_{n-1}|w_n)
$$
然后$P(w_i)和P(w_x|w_y)$的概率直接用大数定律就可以了
一元语言模型
各个词出现概率独立
$$
P(w_1,w_2…w_n)=P(w_1)P(w_2)…P(w_n)
$$
二元语言模型
每个词的出现概率和前一个有关
$$
P(w_1,w_2,…,w_n)≈P(w_1)P(w_2|w_1)P(w_2|w_3)…P(w_{n-1}|w_n)
$$
三元语言模型
每个词的出现概率和前两个有关
$$
P(w_1,w_2,…,w_n)≈P(w_1)P(w_2|w_1)P(w_1,w_2|w_3)…P(w_{n-2},w_{n-1}|w_n)
$$