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

 

 

 

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来回答你关于聚类算法的问题。 聚类算法是一种无监督学习方法,它将数据集中的对象分成若干组或者类,使得同一组内的对象之间相似度较高,而不同组之间的相似度较低。聚类算法广泛应用于数据挖掘、模式识别、图像处理、自然语言处理等领域中。 常见的聚类算法有K-Means、层次聚类、DBSCAN等。其中,K-Means算法是最常用的聚类算法之一。 K-Means算法的基本思想是:首先随机选取K个中心点(质心),然后将每个样本点归属于距离其最近的中心点所在的簇,接着重新计算每个簇的中心点,重复上述过程直到簇不再发生变化或达到预设的迭代次数。 层次聚类算法是一种基于距离的聚类算法,它将样本点视为一棵树,从下往上逐步合并相似的簇,最终形成一棵树形结构。层次聚类算法可分为自底向上的凝聚聚类和自顶向下的分裂聚类两种。自底向上的凝聚聚类从每个样本点开始,逐步合并相似的簇,最终形成一棵树形结构;自顶向下的分裂聚类从所有样本点开始,逐步将簇分裂成较小的簇,最终形成一棵树形结构。 DBSCAN算法是一种基于密度的聚类算法,它将样本点分为核心点、边界点和噪音点三类,核心点周围的样本点被划分为同一个簇,边界点则被划分到离其最近的核心点所在的簇中,而噪音点则被剔除。DBSCAN算法具有不需要预先指定聚类数、对噪音点不敏感等优点,但对于不同密度的簇,其聚类效果可能不尽如人意。 以上是聚类算法的基础知识,希望能够对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值