NLP文本分类入门学习及TextCnn实践笔记(一)

    碎碎念:

之前有一些机器学习相关的概念基础,但从未实践过,看的知识也不系统。这次刚好工作中有应用需求,就以NLP的文本分类为切入点,进行相关知识的学习和模型实践。

    当前进展:

研究了两周,完成文本预处理、word embedding、TextCnn模型训练、API封装等代码工作,模型效果调优、验证中。计划以笔记的形式记录几篇博客。

    首篇主要是个人对NLP及文本分类的理解、一些基础知识的学习及参考资料记录。下一篇计划关于TextCnn算法学习和代码实践等。

    本次个人学习方式:

1. 基础知识补充,形成系统概念,明确方向(多看,遇见不会的就查,把概念盲点都补齐)。

2. 选定算法,找开源代码,针对中文文本及业务场景进行改版、调试。

3. 训练样本标注、分析

5. 模型训练、评估

6. API封装、线上数据测试、模型调整。

 

    正文:

我个人理解的NLP文本分类分为两大步,特征提取和模型训练(对这两部分展开介绍后,最后再简单记一下模型分析的概念)。

一、特征提取

无论是基于统计的机器学习,还是基于神经网络的深度学习,都是用样本数据训练模型,教给机器做特定的工作的(NLP能做那些工作参考:https://blog.csdn.net/yimingsilence/article/details/54934516)。而样本数据都需要转化成向量的数学表示才能输入给模型的。

在非NLP的场景,可以是选定的n个特征,每个特征可以有自己的取值,归一化到0-1的范围,就可以形成n维的向量,输入给模型进行训练。

而在NLP的场景文本怎么转化向量?转化的过程中怎么把原来的文本信息尽量多的保留?(你教给模型的信息越多,它可能学习的越好,当然也可能学“死”了,也就是过拟合问题,把一些不该学到的特征也学到了)

这就包含两部分,即文本预处理和word embedding词嵌入。

1. 文本预处理

将文本中的无用信息剔除或归一化处理(例如URL、长串数字字母、表情等),有用信息保留,变体信息转换(如特殊符号替换、同音近型替换、简繁替换、中英文转换)等。

例如在涉赌等非法内容,为了对抗识别,经常在文本中插入无意义的字符或者用各种音近字、形近字、拼音表情等,如果直接那来训练就会要么提取不到有用的信息(变体的词都找不到词向量,例如‘啋僄’是彩票的变体词),要么把无用的特征保留了(例如‘投猪’是投注的变体,分词的时候会把‘猪’单独分成一个词,那机器就会错误的认为提到‘猪’是涉赌的特征之一)

可参考https://www.sohu.com/a/271534609_383123前半部分描述。

2. 分词+word embedding词嵌入

文本梳理顺了,就要做文本到向量的转换了,这个过程就是词嵌入。

那么怎么让一个向量就代表一段文本?那我们要反过来考虑一段文字中包含了那些信息是我们想要带到向量中表示的。

文本是由一些词按照一定顺序排列起来形成的。那么关键信息简单说来就是出现了那些词(分词)?词序是什么(位置)?词出现了多少次(词频)?

(1)分词+词向量(一般直接用别人已经预训练好的)

首先,要把句子切成一个个的词,就是分词,常用的如jieba分词。jieba又是怎么知道这个句子该怎么切呢?也是大量的数据训练出来的。

其次,每个单词要有一个向量表示。

这个向量是哪来的呢?就是用大量的语料库预训练得来的。只要这个训练的语料库足够全,那么用到的词就都有自己的唯一向量表示。但语料库一定是有限的,一般是基于公开的内容,例如百度百科、微博等几百万条数据训练得来。其它的一些方言、专业词汇、新兴网络语、姓名等就会存在词向量找不到的情况。

我正在用的word2vec,https://github.com/Embedding/Chinese-Word-Vectors 这个据说是中文词向量最全的了。其训练出的词向量包含了词和词可能在同一语境出现的位置关系信息,两个词向量的空间距离越近就越有可能在同一语境出现。

在我个人实践中大约1/3的词找不到词向量,有一些部分是前面提到的语料库不全导致的,还有一部分可能是预处理做的不够充分、导致分词不准确造成的。

还有一种情况是词向量直接用随机向量表示,只要是唯一表示就行。缺点就是其不包含word2vec似的词相关性距离信息。

(2)文本向量

词向量有了,那么一段文本或一篇文章,再根据词序、词频等信息是否提取、提取方式不同而分为多种embedding方式,常用的如:one-hot(低频词如何处理)、词袋、n-grams(窗口选择)、tf-idf等。ps:TextCnn中用的是词库-词索引-词向量的方式做的embedding,这个将在下篇或下下篇中介绍。

  • one-hot:

https://www.cnblogs.com/lianyingteng/p/7755545.html

独热编码,属于词袋模型中如果生成向量的解决思路。得到所有字符串中的分词后的n个词,然后针对每一个字串,按照词是否出现(出现,则取值1,否则取值0)得到一个向量。其不包含词序信息。

  • N-Gram:

https://www.jianshu.com/p/e0598adb07ad

N元特征是指通过窗口(一个单元包含几个字符或汉字)来将字符串拆解,然后计算不同的字符串的相似度,或者评估语句是否合理(有明确语义)等。一般N选3,1和2容易过拟合,大于3特征空间会过大。

这个是从文本切割的方式上做差别的,貌似不太应用于文本分类场景。

  • 词袋

词袋和词向量是同等级别的概念。

https://www.cnblogs.com/chenyusheng0803/p/10978883.html

词袋:将字符串(语句)分词,然后按照词出现的顺序及词频形成一个向量,无位置(语义位置)信息

词向量:训练得出每个词的唯一向量表示,向量信息中包含词位置信息,即那些词最可能一起出现。

  • TF-IDF:

TF(Term Frequency,词频)文档(例如一条微博)内部某个词出现的次数;

IDF(Inverse Document Frequency,逆向文件频率)在全部文档中某个词出现的指标,越大表示词越专业或越冷僻。

TF和IDF相乘后作为词的权重值。

https://www.jianshu.com/p/0d7b5c226f39

二、模型训练

样本的向量表示有了,就可以交给后面的分类器进行分类了。

基于传统统计学的机器学习算法有:knn、svm、lr逻辑回归、NB朴素贝叶斯(优缺点,理论背景、关键参数)等

基于神经网络的深度学习算法有:TextCnn、RCnn、fastText、HANlp、Bert(Attention机制+transformer)等

集成方法(是指模型融合,即把多个nlp模型任务整合到一起)

embedding部分提到的预训练也是模型训练的一种,涉及算法或概念有:fine-tune or not,char-level or word-level,lstm or cnn

上面任意一个算法都够开几篇blog的。下面大致列一下我的学习笔记和参考资料。

1. 传统机器学习算法

  • knn k-nearest neighbor classification

样本在特征空间中,其附近最近的k个样本大多数属于什么分类,就把它算到什么分类。

k通常选取小于等于20的数字。经验值是小于训练样本数的平方根(看来这个算法不适合训练样本过多的情况)。

邻居必须是已经确定分类的样本对象。

距离一般是指欧式距离或曼哈顿距离。

优点:不用训练;适合对稀有事件进行分类;适合多标签分类;

缺点:懒惰算法(分类时才开始计算k个近邻)内存开销大;解释性差。

改进:加权重,距离近的权重大;维数越多欧式距离分类效果越差;变量取值范围不均衡,会出现大小变量的问题(有些变量的作用过大),需要进行标准化;训练样本,不同的样本可以具备不同优先级;

  • SVM:

(Support Vector Machines)支持向量机:

二分类算法,支持线性和非线性,求解将数据点分离的超平面。非线性可分的升到高纬空间转化为线性可分。

https://www.jianshu.com/p/bcf069ff9dd3

https://blog.csdn.net/u012370185/article/details/90205231

  • 逻辑回归 logistics regression

https://blog.csdn.net/weixin_39445556/article/details/83930186

监督学习算法

输出为连续的就是回归问题;输出为离散的就是分类问题。

用最大似然函数推导出交叉熵损失函数,即用最大似然求解出所有样本(正+负)被预测正确的最大概率。

缺点:对于正负样本数量悬殊时预测效果不好;

  • 朴素贝叶斯nave Bayes

https://blog.csdn.net/qiu_zhi_liao/article/details/90671932

https://www.jianshu.com/p/82027e9f0a40

优点:可处理多标签分类;数据较少的情况仍适用。

缺点:对输入数据的表达形式准备敏感,要求特征独立分布;需要提前知道先验概率。

分为先验为高斯分布(正态分布)的朴素贝叶斯、先验为多项式分布的朴素贝叶斯、先验为伯努利分布(预测结果要么0要么1)的朴素贝叶斯

用到的概率有 1. 每个分类的概率  2. 在某一分类下某一特征属性出现的概率。

贝叶斯概率问题后验概率预测问题,就是在不知全貌的情况下,通过有限的观测数据,预测实际情况。

先验概率(因推果):传统的已知全貌(例如袋子里黑白球的数量),得出发生某种情况(拿到白球)的概率。

后验概率(果推因):根据发生的情况(抽几次拿到什么球)预测实际情况(袋子里黑白球的数量)

条件概率:B发生时A也发生的概率。

联合概率:A、B同时发生的概率。

2. 机器学习算法

  • TextCnn 

https://zhuanlan.zhihu.com/p/77634533?from_voters_page=true

稀疏链接;

卷积运算(一个卷积核只能提取一种特征);

参数共享(模型中不同模块共享同一套参数);

等变表示(平移变换不影响结果,即一部分特征换了一个位置,识别结果应该是一致的,对于图片,一只猫在图片中的任何位置都是一只猫)

一维卷积主要用于NLP、序列模型等;二维用于计算视觉、图片处理;三维用于医学影像、视频处理等。

池化:数据降维采样,分为均值池化(窗口内平均)、最大池化(窗口内最大值)等。

这个是实践的算法,再后续篇幅还会展开说,其它的几类算法感兴趣的自己扩展学习把,Bert是这两年比较火的。

3. 预训练算法或概念

  • 迁移学习&fine-tune

迁移学习是指用已经训练出来的模型参数迁移到新的模型训练中。

fine-tune是其手段之一。

跟传统统计机器学习类似,也是先特征提取再分类。

多层网络,前几层是提取通用特征,后几层是提取分类特征。

迁移学习时保持前几层的参数不变,后几层全联接微调。

是否启用fine-tune主要的考量点是新数据的量级及与旧数据的相似性,如果数据量小,相似性也小肯定不能迁移学习;数据量大,相似性小的时候fine-tune有益,但也可重新训练;数据量小,相似性大,fine-tune容易过拟合,可以用预训练模型;数量大,相似性大是最适合迁移学习的。

综上数据量大的时候可用迁移学习,相似性高时最好。

  • char-level or word-level

主要是指解码器时是按照字符解码还是按照单词解码。

暂时没找到如何选取的资料。

  • LSTM

Long Short-Term Memory

长短期记忆网络

  • RNN

擅长处理线性不定长输入。并行计算不行。

需要预处理,依赖词序。

  • CNN

CNN远距离特征不容易获取。

  • Seq2Seq

https://www.jianshu.com/p/b2b95f945a98

适用于输出长度不确定的情况。例如翻译、人机对话等场景。

也是encoder-decoder的编解码结构。它使用cnn或者rnn作为子结构训练出来的模型结构。

  • Resnet 残差网络

得到那种特别深,好几十层的神经网络,用来学习那种高阶特征。

  • Position enocding

位置编码是transformer中应用的一种编码形式,能将语句中的词语的位置信息编码进去。

 

三、模型分析

指标:准确率,召回率,roc曲线,marco-F1,micra-F1.

阈值设定

服务性能。

  • ROC曲线:

https://www.jianshu.com/p/2ca96fce7e81

Receiver Operating Characteristic Curve

反应敏感性(sensitivity, FPR)和其精确性(specificity, TPR)的趋势曲线,TPR(纵坐标,真阳性率)越高越好,FPR(横坐标,假阳性率)越低越好,所以曲线是越靠近纵轴,越高越好。

也就是AUC(Area under roc Curve)面积越大越好。

  • macro-F1和micro-F1

是多标签(也就是一个样本允许打多个标签)分类下的效果评估方式。

micro-F1是对“F1”的值平均;macro-F1是运算平均,即把多分类的数值加一起再往F1公式里套。

https://blog.csdn.net/qq_37942706/article/details/83899518

 

最后留大神链接:

1. 知乎大神们对于NLP入门的解答,其中文本分类部分的值得详读。https://www.zhihu.com/question/324189960

2. 复旦大学NLP实验室的入门课程任务:https://github.com/FudanNLP/nlp-beginner

 

 

 

 

你可能感兴趣的:(python,NLP,深度学习,tensorflow,自然语言处理,文本分类,TextCnn)