离散表示文本:
文档向量One-hot
step 1:构建所有词构建一个词典。
step 2:对词典的每一个词做One-hot编码
每个词向量只有一个位置有1,其他位置全为零。
文档向量可以直接将各词的词向量表示加和
ps:基于词的one-hot编码,来表示句子向量。
TF-IDF模型(逆文档频率)
词权重(TF-IDF)词不是出现次数越高,就一定重要!(例如:惯用词)
权重是啥:你在此文本出现频率越高,而在其他文本出现频率越低,才会认为这个词是个重要词,最终的值才会大!
通过词的概率来构建文档向量!
ps:优化了词的重要性表达,但是忽略了词与词之间的顺序。(李雷喜欢韩梅梅,和韩梅梅喜欢李雷)
ps:基于频数的词袋模型。/词袋模型就是对词来说的,忽略了词之间关系的模型。
ps:基于tf-idf的词袋模型。
N-gram词向量表示
通过滑窗的思路保住词的顺序,保留一元组,二元组,三元组........N元组来构建这样的一个词典!
结果:数量太多,引出N元语言模型近似表示!!
N元语言模型
这样顺序的一组词组成这样的句子出现的概率。
这不就类似朴素贝叶斯嘛!
依赖上一级:
总结:就是描述这些词以这种顺序排列的概率有多高!
连续表示文本:
现代统计自然语言处理中最有创见的想法之一:词的含义可能会被附近的词进行代表
Co-currence矩阵的行(列)向量作为词向量(共现矩阵)
通过滑窗,捕捉语义,可以挖掘语法和语义信息。(每一个词可以用周边的词来表示出来)
滑窗的大小一般设置为5-10,因为需要扑捉到更多的信息嘛!
利用了n-gram的滑窗思想!window_size=1时!只有2个组合 i对i , i对like 等等........
Co-currence矩阵的SVD降维的低维词向量表示
使用n-gram的话,词典会非常的大,对空间消耗很大。
最直接的想法:直接使用SVD对共现矩阵做降维!
但是,随着语料库和词典增长太快,直接做降维时间复杂度是O(n立方),而且每加一个词矩阵就会加很多,
而且与其他深度学习的学习矿建差异很大,数据都会变动很大,学出来的模型能行吗?
NNLM(Neural Network Language model)
目标:训练语言模型,通过窗口的前若干(N-1)个词,来预估最后一个(N)词!
假设函数:N元语言模型。
损失函数:
归一化条件:
思路:对前n-1个前向词用one-hot编码生成n-1个v*1维的列向量,把这n-1个稀疏列向量映射到投影矩阵(D*V)在进行拼接得到D*(N-1)矩阵(是我们要得到的矩阵),然后就进入神经网络进行计算!输出层:softmax,损失函数优化:BP+SGD
V代表词典维度,D代表稠密词维度,D*V就是稠密词向量矩阵
Word2Vec:Continuous(连续) Bag of Words Model(CBOW)连续词袋模型
step 1 (样本):利用滑窗的思想,从左往右滑动,把每个滑窗把中间的词当成目标词,上下文的词当成输入。构建一个样本(训练方式是有监督的哈,输入数据是无监督的)
ps:进行词典的one-hot映射生成词的向量,在通过词对的形式构建出样本。
step 2(模型):把样本输入(上下文的词)(n-1个v*1维的词向量),在D*V上进行投影,对n-1个结果进行求和得到稠密词的列向量D*1维度(是最后我们需要的向量),然后用softmax进行分类(D个类别,词典的词数),D个词的全连接!
ps:对词向量进行稠密矩阵的映射得到了稠密词向量,然后进行相加合并,在进行分类。
小结:你会发现,softmax分类的维度太高了,词典有多少次你就有多少类别,而且还是全连接,这会产生神经元*类别个参数!
step 3(层次化softmax):平铺开的多分类,变为若干次二分类问题。将Haffman树加在这里会怎样?(简单介绍下,基于贪心的思想每次合并出现频率最小的两个树,依次构建即可,最后这棵树出现概率最大的节点一定会出现在离根节点最近的地方!本质还是尽可能多的信息复用)!
step 4(负例采样):另一种优化softmax平铺的思路,一个正样本,v-1个负样本,我考虑下采样负样本,然后不就好做了吗?
采样的策略:统计词出现概率高低,来计算一个长度,并且把所有样本的长度都归一化到[0,1]区间,每次随机选一个位置即可,长度大的样本选中概率大!
Word2Vec:Skip(跳跃)-Gram Model
利用中心词去预估周边词!
word2vec存在的问题:
算法思想是建立在滑窗上来进行的,你只看到了滑窗里面的信息,而没有注意到全局的信息。
word2vec的优点:
可以学习到词和词之间的分布。
ps:可以生成词向量。