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向量

基于思想:一个词越能代表一个文章,则其在该文章中出现的次数越多,同时在别的文章中出现的越少。
计算公式:

\[TF=\frac{词A在文中出现的次数}{文中词的总数} \]

\[IDF=\log\frac{文档数}{包含A词的文档数} \]

所以A词的TF-IDF=$TF*IDF $
注:对于N-gram序列同样适用

2.4. SVD奇异值分解

利用SVD将原TF-IDF矩阵\(W_{m\times n}\)(词-文档向量)分解为3个简单的矩阵,其中m为词项数,n为文档数,p为主题数(类别)

\[W_{m\times n}=U_{m\times p}S_{p\times p}V_{p\times n}^{T} \]

  • 左奇异向量\(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维向量为例,下图为输入“我”时训练过程

\[\begin{pmatrix} 1 & 0 & 0&0 \end{pmatrix}\begin{pmatrix} w_{11} & w_{12}& w_{13}& w_{14}& w_{15} \\ w_{21} & w_{22}& w_{23}& w_{24}& w_{25}\\w_{31} & w_{32}& w_{33}& w_{34}& w_{35}\\w_{41} & w_{42}& w_{43}& w_{44}& w_{45} \end{pmatrix}\begin{pmatrix} u_{11} & u_{12}& u_{13}& u_{14} \\ u_{21} & u_{22}& u_{23}& u_{24}\\u_{31} & u_{32}& u_{33}& u_{34}\\u_{41} & u_{42}& u_{43}& u_{44}\\u_{51} & u_{52}& u_{53}& u_{54}\end{pmatrix}\Rightarrow\begin{pmatrix} 0.002 & 0.996 & 0.001&0.001 \end{pmatrix} \]

其中右箭头处使用了softmax函数,将结果归一到0-1,且结果每个元素的和为1
之后就为了使“爱”处的值最大,计算交叉熵误差,进行反向传播,调整W和U的参数值,最后得到的W就是训练的词向量
代价函数如下,使J最大:

\[J\left( \theta \right) =\dfrac{1}{T}\sum ^{T}_{t=1}\sum _{-m\leq j\leq m}\log P\left( w_{t+j}| w_{t}\right) \]

此处m为窗口大小,\(w_{t}\)为一个词,P为求概率

  • 所以一般的

\[O_{1\times v}\times W_{v\times d}\Rightarrow A_{1\times d}\times U_{d\times v}\Rightarrow P_{1\times v} \]

其中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

  • 构建词向量与共现矩阵之间的关系(即用词向量去尽量拟合共现矩阵)
    关系式如下:

\[w_{i}^{T}\overline{w}_{j}+b_{i}+\overline{b}_{j}=\log \left( X_{ij}\right) \]

\(X_{ij}\)为单词i上下文中单词j出现的次数,即共现矩阵。\(w_{i}^{T}\)\(\overline{w}_{j}\)为单词i和单词j的词向量

  • 构造代价函数(即尽量拟合上式左右两边)

\[J=\sum ^{v}_{j, i=1}f\left( x_{ij}\right)\left( w_{i}^{T}\overline{w}_{j}+b_{i}+\overline{b}_{j}-\log \left( x_{ij}\right)\right) ^{2} \]

其中权重函数\(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次
posted @ 2022-04-08 10:20  启林O_o  阅读(239)  评论(0编辑  收藏  举报