前言:笔者之前是cv方向,因为工作原因需要学习NLP相关的模型,因此特意梳理一下关于NLP的几个经典模型,由于有基础,这一系列不会关注基础内容或者公式推导,而是更侧重对整体原理的理解。顺便推荐两个很不错的github项目——开箱即用的中文教程以及算法更全但是有些跑不通的英文教程。
一. NLP常见概念
- 分词:将完整的句子划分成一个个word,也可以划分为char级别,例如今天/天气/非常/好或者今/天/天/气/非/常/好
- 词表:分词后的集合构建而来,可以视作字典,其中key是所有可能的char或者word,而value则是其对应的id。一般来说,文本不像图像可以用像素值来表示,因此一般采用分词+词表映射的方式把文本转化为一串数字序列
二. word2vec模型
1. word2vec的目的
得到更好更准确的词向量。和图像的表示方法不同,NLP中一般用向量来表示不同的单词,向量一般采用one-hot的方法来初始化,但是这样会带来两个问题:
- 有多少个单词词向量的长度就要多长,维数过高
- one-hot是一种随机初始化的方式,并不能很好地代表向量
因此诞生了word2vec模型,本质上和先做人脸分类、再根据人脸特征距离判断是不是一个人的思路很像,word2vec也是训练分类问题,从而得到更优的词向量表示。
2. word2vec的结构
word2vec包括两种结构:CBOW模型(根据周围的词预测中心词,多对一模型)与Skip-gram模型(根据中心词预测周围词,一对多模型),两者结构如下——
需要注意的是,word2vec只有一个隐层,输出层使用softmax等loss进行监督。隐层没有激活层,因此word2vec中词向量是其它词向量的线性组合。
3. word2vec的CBOW模型例子
学习{I drink coffee everyday}一句话,其中coffee是中心词,window size设定为2