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=A

IDF=logA

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

2.4. SVD奇异值分解#

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

Wm×n=Um×pSp×pVp×nT

  • 左奇异向量Um×p——词的特性:U中每个元素其实相当于词在某个类上的权重,这也就是前面所要求的权重,利用U可将词-文档向量转化为主题-文档向量
  • 奇异值向量Sp×p——每一维度所代表的信息量:该维的值越大则代表每个矩阵中这一列越重要
  • 右奇异向量Vp×nT——文档的特性:文档与该主题的相关性
  • 因此可以对U,S,V降维只取前几列,再USVT后重构原矩阵,这个矩阵就包含了隐性语义,且减少了噪音。

2.5. word2vec词向量#

词向量能够识别同义,反义,同类别的词,甚至能进行数学运算,比如:中国 - 北京 + 东京 = 日本。
基本思想:句子中相邻的词之间都有一定的联系
训练方法主要有以下两种:

2.5.1. skip_gram#

用中心词预测周围的词

  • 确定训练数据:通过一个窗口滑动选取,如“我爱吃橘子”对于3-gram(即窗口大小为3) 得到训练数据如下:
输入 期望输出
橘子
橘子

对每个词进行独热编码,比如

one-hot
1000
0100
0010
橘子 0001
  • 训练:以给每个词训练5维向量为例,下图为输入“我”时训练过程

(1000)(w11w12w13w14w15w21w22w23w24w25w31w32w33w34w35w41w42w43w44w45)(u11u12u13u14u21u22u23u24u31u32u33u34u41u42u43u44u51u52u53u54)(0.0020.9960.0010.001)

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

J(θ)=1Tt=1TmjmlogP(wt+j|wt)

此处m为窗口大小,wt为一个词,P为求概率

  • 所以一般的

O1×v×Wv×dA1×d×Ud×vP1×v

其中O为词独热向量,v为词数,d为词向量的维数,P为输出
全部训练完成后,可以将W作为词向量,其中每一行为该词的词向量,如“我”为(w11w12w13w14w15)
也可以将W+UT2作为词向量

2.5.2. CBOW连续词袋#

用周围的词预测中心词
与上类似,以3-gram为例,训练数据变为

输入1 输入2 期望输出
橘子
- 橘子

以输入“我”“吃”为例,训练过程如下图,最后要反向传播,使“爱”处值最大

2.5.3. 优化#

  • 转为二分类并负采样:将多分类问题转化为二分类问题,输出层使用sigmod函数,训练数据就变为如下(其中第二条为负样本):
输入1 输入2(本来为期望输出) 期望输出
1
橘子 0
1
1
1
橘子 1
橘子 1
  • 重采样:基于词频越高的词含有信息量越少,词频越低的词含有信息量越大的思想,在确定训练数据时(采样时)以一定的概率删除一些词组

2.5.4. 实现#

Copy
# 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个窗口中“吃”出现两次

但是次数的统计并不完全如此。对于远的词,次数所占的比重会被相应调小,权重为1d,d为两个词的距离
如:我 爱 吃 冰激凌。在窗口为2的统计中,爱-吃次数记为1,而爱-冰激凌,因为“冰激凌”距离“爱”为2,所以只记为1/2

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

wiTw¯j+bi+b¯j=log(Xij)

Xij为单词i上下文中单词j出现的次数,即共现矩阵。wiTw¯j为单词i和单词j的词向量

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

J=j,i=1vf(xij)(wiTw¯j+bi+b¯jlog(xij))2

其中权重函数f(xij)f(x)={(xxmax)α,x<xmax 1,other
图像如下,它是非递减的,当Xij的次数到达设定的最大值时就不在增加,并且对于次数为零的,权重也为0

  • 训练
    初始化时将wiTw¯j设置不同的初始值,并最终将wiT+w¯j作为最终的词向量(wiTw¯j是对称的)
    在原论文中,采用了AdaGrad梯度下降,学习率设置为0.05,对于训练小于300维的词向量迭代50次,其它迭代100次
posted @   启林O_o  阅读(271)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示
CONTENTS