趁机总结一下之前遇到过的一些小trick吧:

  1. 数据预处理时vocab的选取(前N个高频词或者过滤掉出现次数小于3的词等等)
  2. 词向量的选择,可以使用预训练好的词向量如谷歌、facebook开源出来的,当训练集比较大的时候也可以进行微调或者随机初始化与训练同时进行。训练集较小时就别微调了
  3. 结合要使用的模型,这里可以把数据处理成char、word或者都用等
  4. 有时将词性标注信息也加入训练数据会收到比较好的效果
  5. 至于PAD的话,取均值或者一个稍微比较大的数,但是别取最大值那种应该都还好
  6. 神经网络结构的话到没有什么要说的,可以多试几种比如fastText、TextCNN、RCNN、char-CNN/RNN、HAN等等。哦,对了,加上dropout和BN可能会有意外收获。反正模型这块还是要具体问题具体分析吧,根据自己的需求对模型进行修改(比如之前参加知乎竞赛的时候,最终的分类标签也有文本描述,所以就可以把这部分信息也加到模型之中等等)
  7. 之前还见别人在文本领域用过数据增强的方法,就是对文本进行随机的shuffle和drop等操作来增加数据量


主要做短文本分类,下面做部分补充:

预处理部分:

  1. 文本更正,中文如果是正常的文本多数都不涉及,但是很多恶意的文本,里面会有大量非法字符,比如在正常的词语中间插入特殊符号,倒序,全半角等。还有一些奇怪的字符,就可能需要你自己维护一个转换表了。
    如果是英文的,就涉及拼写检查,可以用python包pyenchant实现,比如 mothjer -> mother
  2. 文本泛化
    - 表情符号、数字、人名、地址、网址、命名实体等,用关键字替代就行。这个视具体的任务,可能还得往下细化。比如数字也分很多种,普通数字,手机号码,座机号码,热线号码、银行卡号,QQ号,微信号,金钱,距离等等,并且很多任务中,这些还可以单独作为一维特征。还得考虑中文数字阿拉伯数字等。
    - 中文将字转换成拼音,许多恶意文本中会用同音字替代。
    - 如果是英文的,那可能还得做词干提取、形态还原等
    分词
    - 这部分主要是中文,可以只保留长度大于1的词,本人在多个任务中实验过,对结果精度没什么影响,但是可以有效降低特征维度。
  3. 停用词
    - 网上中英文的都能找到,但是需要根据自己的任务决定是否需要增加和删除一些,比如not、不是等带有否等意义的停用词在有些任务中还是会影响结果的。
    - 词筛选,出现次数太多和太少的都可以考虑去掉,太多的一般是这类文本的常用词,太少的往往是拼写错误、命名实体、特殊词组等。
    - 也可以考虑根据tfidf来筛选
  4. 数据平衡
    - 相信现实中多数任务的数据集都是很不平衡的,不平衡包括两个方面一是数据量不平衡;二是数据多样性不平衡。
    - 主要从采样和数据增强两面解决。比如直接上/下采样到匹配的量,比如先聚类,再按类别上下采样等等。
    - 数据增强,比如随机的增删一些词,将文本翻译成其他语言再翻译回来等。这个也挺有讲究的,就不再这里细说了。

模型部分:

  1. 主要两个方向吧,词袋模型和词向量模型。
    - 词袋模型更多应用于传统的机器学习分类算法
    - 词向量是传统方法和深度学习方法都可以用。
  2. 通用的技巧
    - 可以只保留某几个词性的词语,比如只要形容词和名词
    - 可以加入词的词性特征
    - 可以加入词的情感特征
  3. 词袋模型
    - 考虑是用词频,还是只关注是否出现用01标示就好。这方面好像就想到这一点,欢迎其他人补充。
  4. 词向量模型
    - 英语还有字符向量,中文还有笔画向量,这是之前在阿里云栖大会上听阿里的人说的,说是实验效果有不少提高,我没实验过,也对这个持怀疑态度。但是在一些特殊场景上适用也是有可能的,比如一些恶意文本,有时候就得用一些形似的字替代。
    - 如果是应用于传统方法,那么根据词向量合成句子向量又比较有讲究了,平均,加权平均等,之前在一个任务中试过根据tfidf来加权平均,有一点提升,但是效果很有限。
    - 在深度学习模型中,就涉及最大取多少个词的问题,我采取的措施是对正负样本分别统计,综合考虑长度与样本覆盖,用 均值 + n*方差的方式确定,尽量能完全覆盖80%以上的负样本,剩下的再截断,长度对rnn一类的算法性能影响比较大,对cnn类要好很多,所以,cnn类的可以稍微长点关系也不大。
    - rnn用双向lstm,一般会比lstm效果好
    - 截断从前面截断还是从后面截断不同的任务上可能不同,需要注意。
    - 对不均衡的数据,除了数据增强和采样,还可以用何凯明大神最新的facal loss损失函数。但是我自己实验发现,在提高了少类样本准确率的同时,多类的准确率是有所降低的,这个需要根据你自己的具体任务来权衡。


暂时就想到这么多吧,欢迎大家补充,共同学习。