NLP竞赛综述

文章目录

    • 综述
      • [如何到top5%?NLP文本分类和情感分析竞赛总结](https://zhuanlan.zhihu.com/p/54397748)
    • 预处理
      • [EDA探索](https://www.kaggle.com/sudalairajkumar/simple-exploration-notebook-qiqc)
      • [embedding预处理](https://www.kaggle.com/christofhenkel/how-to-preprocessing-when-using-embeddings)
    • 文本可以抽取的特征

综述

如何到top5%?NLP文本分类和情感分析竞赛总结

NLP竞赛综述_第1张图片
就像他说的那样
机器学习提取的是如tf-idf的具体(concrete)特征
深度学习提取的是如词向量的抽象(abstract)特征
对于分类器,传统的朴素贝叶斯分类、SVM、XGB、LGB算法,在NLP竞赛中都不太好使,因此NLP比赛里用到的基本都是深度学习。竞赛中最重要的两步就是:

做好文本表示工作,可以简单理解成词向量训练,即做好 “数据–>信息” 的流程
做好分类器,可以理解成模型的设计,即做好 “信息–>知识” 的流程

语义粒度与文本长度
语义粒度是指对文本是否分词,以词还是以字来表示一个句子的输入特征。一般来讲,我们都需要对他们进行尝试,只要效果不相差太多,我们都需要保留,为最后的模型融合增加差异性。

文本长度我一般用占比95%或者98%的长度最为最大长度,对超过最大长度的句子进行截取,不足的进行填充(padding)。另外就是对句子进行padding的时候,keras补0默认是补在前面,我想了下这应该是RNN结构的隐藏层参数空间最开始初始化为0,有个冷启动过程,所以我觉得补在前面是不错的。
** 词向量模型与维度**
如果数据没有脱敏,可以直接用github上训练好的词向量;否则就自己训练。
这里面有一个重要的trick是拼接Word2Vec和GloVe作为新的特征输入会对模型由一定提升效果,直接相加或者求平均效果通常都不好。
在单种词向量维度选择上,一般要费点时,加上拼接的话需要做的测试就更多了。而且不同模型上表现也不一样,最后大概率也选不到最佳维度,做这种事情心里都会觉得草蛋,但是心态要平和。这也是我为什么觉得态度端正,不要眼高手低非常重要。

当然,牛逼的人总是会想办法自动找一下最合适的词向量维度,感兴趣的同学可以看看NeurIPS 2018斯坦福的这篇论文《On the Dimensionality of Word Embedding》。
语言模型词向量
因为我们需要预训练语言模型,因此这就很像图像领域的迁移学习:先根据大规模语料训练好网络的一部分,然后用这部分网络接个分类器在小规模语料上重新finetune提高性能。

有了语言模型词向量最好的一点是,我们可以不用太纠结Word2Vec和GloVe的词向量维度选择了,可以选一个200维或者300维的最后再一起融合就好了。
** 训练模型**
我觉得文本分类最重要的是抓取关键词,而影响关键词抓取最重要的一点是文本的长度,就像人类做阅读题一样,越长的内容越难把握住重心。但是如果我们过于优化长文本性能,在短文本上的性能就会受到影响。因此我们关注的重点是:

  • 关键词特征
  • 长文本
  • 短文本
    主要是以下的这个图片:
    NLP竞赛综述_第2张图片
    对于短文本,CNN配合Max-pooling池化(如TextCNN模型)速度快,而且效果也很好。因为短文本上的关键词比较容易找到,而且Max-pooling会直接过滤掉模型认为不重要特征。虽然Attention也突出了重点特征,但是难以过滤掉所有低分特征。而Capsules效果比CNN好,所以我个人觉得在短文本上LSTM/GRU+Capusules是一个不错模型,这也是目前Kaggle Quora比赛上(短文本分类)最好的baseline之一。
    但是对于长文本直接用CNN就不行了,在客服领域意图分类任务里,TextCNN会比HAN模型低十多个点,几乎没法用。当然我们可以在TextCNN前加一层LSTM,这样效果就能提升很多。

上面讲的这些网络我还不太懂,懂了会好好再写出来各个网络是什么
** trick**
Finetune

  • 微调Embedding学习率
  • 训练过程中,验证集得分或loss变差,重新加载上一轮的模型,并降学习率降半。
  • Snapshot Ensemble。

半监督假标签

  • 通过训练集训练好的模型,去预测测试集的结果
  • 把测试集这个结果作为测试集的标签,和训练集混合在一起训练模型
  • 一般模型能忍受10%的噪音,所以建议假标签方法不要一股脑把所有测试集和训练集混合,尽量保持比例在10:1附近

预处理

EDA探索

** 任务分析**
每个任务分析数据时,我们要有这样几个问题:

  • 数据类别有几种,分别占比是多少?(已经查看)
  • 词在不同类别中是如何分布的?
  • 哪些词是重要词?
  • 词长是如何分布的?
  • 我们如何选取特征?

    特征观察
    分类查看词长和词频。包括:
  • 每个类中词数量(word)
  • 每个类中字数量(char)
  • 每个类中符号数量(punc)

embedding预处理

核心思想在于他提出的两个黄金法则:

  • Don’t use standard preprocessing steps like stemming or stopword removal when you have pre-trained embeddings
    不要执行一些常用的预处理步骤,当你有一个已经训练好的embeddings模型。因为你必须要依赖这个训练好的embeding模型,所以训练样本的内容可以不丢弃,从而更好的体现数据的特点
  • Get your vocabulary as close to the embeddings as possible
    尽量让你的训练样本和embeddings尽量靠近,同理,因为你最后要用到的是embedings,两者相差要是太大自然就会有问题。

他就是做了以下几项工作:

  • 构造频数字典
  • 计算覆盖率:unique的覆盖率以及包含频数的覆盖率(很重要!!!)
  • 训练样本没有被覆盖的特点(如数字,标点符号,停用词)
  • 对训练样本进行处理

文本可以抽取的特征

  • the number of words
  • the number of unique words
  • the number of characters
  • the number of upper characters
  • Bag of characters: Implemented by CountVectorizer(ngram_range=(1, 1), min_df=1e-4, token_pattern=r’\w+’,analyzer=‘char’)

你可能感兴趣的:(NLP竞赛)