NLP文本分类学习笔记1:文本表示
1. 分词
文本需要经过处理,成为计算机理解的语言。
对于中文文本首先需要分词。如:“安全的出行环境”分词后为“安全 的 出行 环境”。(同时也应使用停用词表,罕见词表对分词结果进行过滤)
但是这样处理后会忽略词序,造成信息的损失。所以也可以使用N-gram,可以保留一定的词序,一般为2-gram。如上一句话可以变为“安全的 的出行 出行环境”
2. 向量化
主要介绍静态词向量,主要有:one-hot,word2vec,Glove。静态词向量无法表示词的多义性,不会随着词前后文的变化而变化。与之相对的有动态的词向量,有:ELMo,Bert等。
2.1. one-hot独热编码
该编码保留了原始文本所有信息。首先需要一个词表,对于“I like playing football”编码如下
2.2. 词袋向量
忽略了词的词序,统计词的频次,构造向量,假设词表为[like,football,I,playing,and,basketball,he],对于“I like playing football and he like palying basketball”的词袋向量为:[2,1,1,2,1,1,1],其中第一个2表示“like”出现了两次
2.3. 基于TF-IDF向量
基于思想:一个词越能代表一个文章,则其在该文章中出现的次数越多,同时在别的文章中出现的越少。
计算公式:
所以A词的TF-IDF=$TF*IDF $
注:对于N-gram序列同样适用
2.4. SVD奇异值分解
利用SVD将原TF-IDF矩阵\(W_{m\times n}\)(词-文档向量)分解为3个简单的矩阵,其中m为词项数,n为文档数,p为主题数(类别)
- 左奇异向量\(U_{m\times p}\)——词的特性:U中每个元素其实相当于词在某个类上的权重,这也就是前面所要求的权重,利用U可将词-文档向量转化为主题-文档向量
- 奇异值向量\(S_{p\times p}\)——每一维度所代表的信息量:该维的值越大则代表每个矩阵中这一列越重要
- 右奇异向量\(V_{p\times n}^{T}\)——文档的特性:文档与该主题的相关性
- 因此可以对U,S,V降维只取前几列,再\(U*S*V^{T}\)后重构原矩阵,这个矩阵就包含了隐性语义,且减少了噪音。
2.5. word2vec词向量
词向量能够识别同义,反义,同类别的词,甚至能进行数学运算,比如:中国 - 北京 + 东京 = 日本。
基本思想:句子中相邻的词之间都有一定的联系
训练方法主要有以下两种:
2.5.1. skip_gram
用中心词预测周围的词
- 确定训练数据:通过一个窗口滑动选取,如“我爱吃橘子”对于3-gram(即窗口大小为3) 得到训练数据如下:
输入 | 期望输出 |
---|---|
我 | 爱 |
爱 | 我 |
爱 | 吃 |
吃 | 爱 |
吃 | 橘子 |
橘子 | 吃 |
对每个词进行独热编码,比如
词 | one-hot |
---|---|
我 | 1000 |
爱 | 0100 |
吃 | 0010 |
橘子 | 0001 |
- 训练:以给每个词训练5维向量为例,下图为输入“我”时训练过程
其中右箭头处使用了softmax函数,将结果归一到0-1,且结果每个元素的和为1
之后就为了使“爱”处的值最大,计算交叉熵误差,进行反向传播,调整W和U的参数值,最后得到的W就是训练的词向量
代价函数如下,使J最大:
此处m为窗口大小,\(w_{t}\)为一个词,P为求概率
- 所以一般的
其中O为词独热向量,v为词数,d为词向量的维数,P为输出
全部训练完成后,可以将W作为词向量,其中每一行为该词的词向量,如“我”为$$\begin{pmatrix} w_{11} & w_{12}& w_{13}& w_{14}& w_{15}\end{pmatrix}$$
也可以将\(\dfrac{W+U^{T}}{2}\)作为词向量
2.5.2. CBOW连续词袋
用周围的词预测中心词
与上类似,以3-gram为例,训练数据变为
输入1 | 输入2 | 期望输出 |
---|---|---|
我 | 吃 | 爱 |
爱 | 橘子 | 吃 |
吃 | - | 橘子 |
以输入“我”“吃”为例,训练过程如下图,最后要反向传播,使“爱”处值最大
2.5.3. 优化
- 转为二分类并负采样:将多分类问题转化为二分类问题,输出层使用sigmod函数,训练数据就变为如下(其中第二条为负样本):
输入1 | 输入2(本来为期望输出) | 期望输出 |
---|---|---|
我 | 爱 | 1 |
我 | 橘子 | 0 |
爱 | 我 | 1 |
爱 | 吃 | 1 |
吃 | 爱 | 1 |
吃 | 橘子 | 1 |
橘子 | 吃 | 1 |
- 重采样:基于词频越高的词含有信息量越少,词频越低的词含有信息量越大的思想,在确定训练数据时(采样时)以一定的概率删除一些词组
2.5.4. 实现
# hanlp训练API
Word2VecTrainer = JClass('com.hankcs.hanlp.mining.word2vec.Word2VecTrainer')
trainerBuilder = Word2VecTrainer();
trainerBuilder.train(TRAIN_FILE_NAME, MODEL_FILE_NAME)
# gensim训练API
# word2vec向量
dataset=word2vec.Text8Corpus('C:/Users/DELL/Downloads/icwb2-data/icwb2-data/training/msr_training.utf8')
# vector_size向量维数 window窗口大小 workers并行数 min_count小于该数的词会被丢弃
model = word2vec.Word2Vec(sentences=dataset, vector_size=200, window=5, min_count=1, workers=4)
# fasttext向量
dataset2=word2vec.Text8Corpus('C:/Users/DELL/Downloads/icwb2-data/icwb2-data/training/msr_training.utf8')
model2 = fasttext.FastText(sentences=dataset2, vector_size=200, window=5, min_count=1, epochs=10)
2.6. fasttext词向量
参考链接:http://albertxiebnu.github.io/fasttext/
将单个词拆分,为每个subwords字符(即子词)训练一个向量。如对于“subway”训练时,对“<su” “sub” “ubw” “bwa” “way” “ay>” “<subway>”分别计算词向量,整个单词就可以用这些向量表示。
2.7. GloVe全局向量
基本思想:GloVe将全局的特征与word2vec使用滑动窗口利用了局部的上下文特征两者结合起来,所以GloVe基于以下三个步骤:
- 构建共现矩阵(将局部和全局特征结合起来)
首先定义一个窗口大小,矩阵中每个元素是单词w时,上下窗口中,单词a出现的次数。
以窗口为1,以下句子为语料为例,共现矩阵为:
我爱吃苹果和梨。
我爱吃水果。
梨是水果。
- | 我 | 爱 | 吃 | 和 | 是 | 苹果 | 梨 | 水果 |
---|---|---|---|---|---|---|---|---|
我 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 |
爱 | 2 | 0 | 2 | 0 | 0 | 0 | 0 | 0 |
吃 | 0 | 2 | 0 | 0 | 0 | 1 | 0 | 1 |
和 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
是 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
苹果 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
梨 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
水果 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 |
如:“爱”上下1个窗口中“吃”出现两次
但是次数的统计并不完全如此。对于远的词,次数所占的比重会被相应调小,权重为\(\frac{1}{d}\),d为两个词的距离
如:我 爱 吃 冰激凌。在窗口为2的统计中,爱-吃次数记为1,而爱-冰激凌,因为“冰激凌”距离“爱”为2,所以只记为1/2
- 构建词向量与共现矩阵之间的关系(即用词向量去尽量拟合共现矩阵)
关系式如下:
\(X_{ij}\)为单词i上下文中单词j出现的次数,即共现矩阵。\(w_{i}^{T}\)和\(\overline{w}_{j}\)为单词i和单词j的词向量
- 构造代价函数(即尽量拟合上式左右两边)
其中权重函数\(f\left( x_{ij}\right)\)为$$f\left( x\right) =\begin{cases}\left( \dfrac{x}{x_{max}}\right) ^{\alpha },x <x_{max}\ 1,other\end{cases}$$
图像如下,它是非递减的,当\(X_{ij}\)的次数到达设定的最大值时就不在增加,并且对于次数为零的,权重也为0
- 训练
初始化时将\(w_{i}^{T}\)和\(\overline{w}_{j}\)设置不同的初始值,并最终将\(w_{i}^{T}+\overline{w}_{j}\)作为最终的词向量(\(w_{i}^{T}\)和\(\overline{w}_{j}\)是对称的)
在原论文中,采用了AdaGrad梯度下降,学习率设置为0.05,对于训练小于300维的词向量迭代50次,其它迭代100次