文本分类中的一些经验和 tricks

标签: NLP 深度学习 NLP | 发表时间:2019-01-26 17:01 | 作者:
出处:http://wulc.github.io/

最近在总结之前做的文本分类实验的一些经验和 tricks,同时也参考了网上的一些相关资料(见文末),其中有些 tricks 没尝试过,先在这里记下,或者日后能用上。

这里的经验和 tricks 大概可分为两部分:预处理部分和模型部分,下面分别介绍

预处理

  • 文本更正,一些基本的操作包括:繁体转简体,全角转半角,拼音纠错等

  • 文本泛化,如一个手机号码,因为有几千万的手机号码,不可能为每个手机号码设一个特征,所以最好将手机号码转化为同一个特征;另外表情符号、人名、地址、网址、命名实体等也要考虑这种泛化,泛化的程度这个视具体的任务,比如说地址可以以国家为粒度,也可以以省份为粒度

  • 规范文本为统一长度时,取所有长度的均值或者中位数,但是别取最大值;截断时根据具体任务考虑从前面阶段或从后面截断

  • 构建数据集的 vocabulary 时,需要考虑以下几个方面

    • 取前N个高频词或者过滤掉出现次数小于某个阈值的词
    • 根据具体任务确定是否需要去掉 stop words
    • 假如采用了预训练的词向量,要尽可能让 vocabulary 中的词语能找到对应的词向量(这个问题也涉及到预训练的词向量和分词器的选择)
  • 词向量的选择,当数据集较小时,直接使用预训练好的词向量(如google、facebook开源的),且不用微调;当训练集比较大的时候,可随机初始化进行训练,也可以对预训练的词向量进行微调(微调收敛得更快,但是结果差异不大)

  • 分词时考虑以下几个方面

    • 是否需要分词,使用 char-level 的方法时不需要分词,但是在很多场景下 word-level 的效果都要比 char-level 的要好
    • 分词时可以只保留长度大于1的词(会去除很多停止词),对结果精度没什么影响,但是可以有效降低特征维度
    • 采用预训练的词向量时,要保证分词后的大部分词语能够出现在预训练的词向量表中,否则这个词语的 embedding 就相当于是随机初始化,预训练的词向量没有提供任何信息;具体方法可参考 这里
  • 文本数据增强的方法有
    • drop: 随机删掉文本
    • shuffle: 随机改变文本顺序
    • replace: 用近义词进行替换
    • ….

模型

  • 规则有时能解决大部分的问题,不一定要用到模型,使用时要权衡模型带来的收益和复杂性

  • 传统的机器学习方法根据其特征工程的不同可分为三大类

    • 词袋模型:将出现的词记为1,否则记为 0,问题是维度高且稀疏性严重
    • 向量空间模型:根据文档频率、互信息、信息增益、χ²统计量等进行了特征(词语)的选择,同时通过 tfidf 值为每个词赋权重;一定程度上缓解了上面提到的词袋模型维度高且稀疏性严重的问题
    • 主题模型:pLSA/LDA/HDP 等主题模型将文本表示低维实数向量,类似于深度学习中的 embedding,但是比 embedding 有更好的解释性
  • fasttext 简单、速度快,是一个非常不错的 baseline;随着问题复杂性增加可依次尝试 CNN -> RNN -> BERT

  • 对于深度学习模型,把模型变得更深更宽更复杂往往能够提升效果;但是当模型复杂到一定程度的时候,提升的效果微乎其微甚至没提升

  • rnn 类模型用双向一般会比单向要好

  • 使用 dropout(一般设为 0.5) 基本都能提升效果,使用的地方包括:embedding 层后、FC层后

  • 训练震荡问题:增加随机采样因素尽可能使得数据分布 iid,默认 shuffle 机制能使得训练结果更稳定。如果训练模型仍然很震荡,可以考虑调整学习率 或 mini_batch_size

  • 学习率一般设置衰减,如在N个 epoch 之后将学习率乘上 0.1,从而不断降低学习率

  • 超参数的设置经验可参考 A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification

  • 模型融合时,差异性越大,融合效果越好,具体可参 这里


参考

相关 [文本 分类 经验] 推荐:

文本分类中的一些经验和 tricks

- - 吴良超的学习笔记
最近在总结之前做的文本分类实验的一些经验和 tricks,同时也参考了网上的一些相关资料(见文末),其中有些 tricks 没尝试过,先在这里记下,或者日后能用上. 这里的经验和 tricks 大概可分为两部分:预处理部分和模型部分,下面分别介绍. 文本更正,一些基本的操作包括:繁体转简体,全角转半角,拼音纠错等.

LibShortText - 短文本分类

- - 互联网旁观者
Chih-Jen Lin的新作.   青春就应该这样绽放   游戏测试:三国时期谁是你最好的兄弟.

用scipy(scikit-learn)做文本分类

- - CSDN博客研发管理推荐文章
文本挖掘的paper没找到统一的benchmark,只好自己跑程序,走过路过的前辈如果知道20newsgroups或者其它好用的公共数据集的分类(最好要所有类分类结果,全部或取部分特征无所谓)麻烦留言告知下现在的benchmark,万谢. 20newsgroups官网上给出了3个数据集,这里我们用最原始的 20news-19997.tar.gz.

基于KNN的文本分类实战

- - 樂天笔记
本文讲述如何使用scikit-learn的KNN工具对文本进行分类. K-近邻算法,简称KNN(k-Nearest Neighbor),是一个相当简单的分类/预测算法. 其主要思想就是,选取与待分类/预测数据的最相似的K个训练数据,通过对这K个数据的结果或者分类标号取平均、取众数等方法得到待分类/预测数据的结果或者分类标号.

python 中文文本分类 - CSDN博客

- -
3,结构化表示--构建词向量空间. 即已经分好类的文本资料(例如:语料库里是一系列txt文章,这些文章按照主题归入到不同分类的目录中,如 .\art\21.txt). 推荐语料库:复旦中文文本分类语料库,下载链接:http://download.csdn.net/detail/github_36326955/9747927.

[转]Tensorflow实现的CNN文本分类

- - Soul Joy Hub
在这篇文章中,我们将实现一个类似于Kim Yoon的卷积神经网络语句分类的模型. 本文提出的模型在一系列文本分类任务(如情感分析)中实现了良好的分类性能,并已成为新的文本分类架构的标准基准. 本文假设你已经熟悉了应用于NLP的卷积神经网络的基础知识. 如果没有,建议先阅读Understanding Convolutional Neural Networks for NLP 以获得必要的背景.

文本分析漫谈-分类器中的关键词提取

- flychen50 - UGC广播站
作者:人人网UGC团队成员 刘威 人人网UGC团队博客. 面对人人网海量的UGC,数据挖掘工作势在必行,能把用户最想要的信息推荐出来,是我们正在研究的课题之一. 在推荐系统中,分类器是个非常重要的部分. 分类器的研究重点落在两个方面,一方面是文本关键词的提取,一方面是对已有关键词或标签的文本进行训练分类.

[转载]基于贝叶斯算法的文本分类算法

- - 小蚊子乐园
原文地址: 基于贝叶斯算法的文本分类算法 作者: TBKKEN.     因为要做一个关于数据挖掘的算法应用PPT,虽然知道很多数据挖掘的算法怎么使用,但是需要讲解它们的原理,还真的需要耗费很多精力,之前做一个曲线拟合,已经发在博客里,现在做贝叶斯算法的基础原理. 分类是把一个事物分到某个类别中.

[转][转]Facebook 开源的快速文本分类器 FastText

- - heiyeluren的blog(黑夜路人的开源世界)
比深度学习快几个数量级,详解Facebook最新开源工具——fastText. 导读:Facebook声称fastText比其他学习方法要快得多,能够训练模型“在使用标准多核CPU的情况下10分钟内处理超过10亿个词汇”,特别是与深度模型对比,fastText能将训练时间由数天缩短到几秒钟. Facebook FAIR实验室在最新博客中宣布将开源资料库fastText,声称相比深度模型,fastText能将训练时间由数天缩短到几秒钟.

自然语言处理第一番之文本分类器

- - 小石头的码疯窝
文本分类应该是自然语言处理中最普遍的一个应用,例如文章自动分类、邮件自动分类、垃圾邮件识别、用户情感分类等等,在生活中有很多例子,这篇文章主要从传统和深度学习两块来解释下我们如何做一个文本分类器. 传统的文本方法的主要流程是人工设计一些特征,从原始文档中提取特征,然后指定分类器如LR、SVM,训练模型对文章进行分类,比较经典的特征提取方法如频次法、tf-idf、互信息方法、N-Gram.