文本分类算法从机器学习的“人工特征 + lr/svm/xgboost”,到深度学习的"word embedding + DNN"、“language model + decoder”,不断演变。
0.文本的预处理
1)清洗数据:带有HTML标签、URL地址等非文本内容,长串数字或字母、无意义的文本。
2)变形词识别和替换:特殊符号替换、同音近型替换(拼音首字母)、简繁替换
3)停用词与标点符号:采用官方词表,针对不同的场景做一些调整
1.文本特征&文本表示
以词还是以字来表示一个句子的输入特征,都需要进行尝试,只有效果相差不大,都需要保留下来做模型融合。
如果文本长度不同,取占比95%或者98%的长度最为最大长度,然后进行截断补齐
文本特征的提取:
方法一:分词之后采用One-hot或TF-IDF等方法将每个样本转化为固定长度的特征编码作为分类算法的输入。
方法二:采用N-gram模型(一般同时采用N为1到3的N-gram)保留词与词之间的的位置和顺序信息。
方法三:Word2Vec和GloVe,拼接Word2Vec和GloVe作为新的特征输入,直接相加或者求平均效果通常都不好。如果要找到最合适的词向量维度,可以看看NeurIPS 2018斯坦福的这篇论文《On the Dimensionality of Word Embedding》。
方法四:语言模型,例如ELMo和BERT
其他特征:是否出现长串数字的布尔值特征HAS_DIGITAL、长串数字按长度归一的DIGIAL_LEN_10、文本长度(形如“长文本_小明”、“短文本_学校”)
同时采用了多种特征方法,不妨对这些特征进行分桶标记。如对分词特征“小明”标记为“wordseg:小明”、对skip-gram特征“小明_学校”标记为“skipgram:小明_学校”。
特征选择方法:
卡方检验:
信息增益:
2.文本分类算法
短文本:CNN配合Max-pooling池化(如TextCNN模型)速度快,而且效果也很好。Capsules效果比CNN好,短文本LSTM/GRU+Capusules是一个不错模型,也是目前Kaggle Quora比赛上(短文本分类)最好的baseline之一。
长文本:
TextCNN:
工作机制是:卷积窗口沿着长度为n的文本一个个滑动,类似于n-gram机制对文本切词,然后和文本中的每个词进行相似度计算,因为后面接了个Max-pooling,因此只会保留和卷积核最相近的词。这就是TextCNN抓取关键词的机制。
HAN模型
HAN的论文是《Hierarchical Attention Networks for Document Classification》
识别句号:训练词向量频次第二高的几乎都是句号
如图可得,不同的场合适用不同的算法:
1)如果是在线分类场景,那么预测速度较快的算法应该成为首选
2)如果需要快速迭代,那么训练速度快且调参难度小的算法更合适
3)若不考虑时间开销,那么尝试对多个模型进行集成(Ensemble)是最常用的提升分类效果的方法
语料语义简单的分类任务,用传统机器学习方法即可:
1)逻辑回归
SVM:
PCA降维(36维),使用SVC模型预测涨跌
PCA:降维依据
第一个是explained_variance_,它代表降维后的各主成分的方差值。方差值越大,则说明越是重要的主成分。
第二个是explained_variance_ratio_,它代表降维后的各主成分的方差值占总方差值的比例,这个比例越大,则越是重要的主成分。
2)贝叶斯分类模型
3)主题模型
如果是像社交数据之类语义丰富的场景,可以考虑深度学习模型:
深度学习的FastText
基于CNN/RNN的分类模型:CNN擅长捕获局部特征,RNN擅长处理时序信息,注意力机制在模型效果不满足时可以考虑一试
DPCNN: https://zhuanlan.zhihu.com/p/35457093
基于预训练模型的BERT
3.具体实现
爬取:数据集,标注标签
文本的预处理:清洗与处理、去停、分词、
预训练:
训练wiki的word2vec模型,编码词向量后加权平均获得文档向量(400维)
代码借鉴:
https://github.com/huseinzol05/NLP-Models-Tensorflow/tree/master/text-classification
embedding
https://github.com/huseinzol05/NLP-Models-Tensorflow/tree/master/embedded
attention
https://github.com/huseinzol05/NLP-Models-Tensorflow/tree/master/attention