您的位置 首页 > 腾讯云社区

AI研习社 微博立场检测Top1解决方案---mathor

这篇文章主要讲一下我的Top1方案(最高分97.5)

内容比较多,tricks也很多,所以文章可能写的比较乱

首先说下模型,我用的是fastText,没有做模型融合,但是我个人感觉如果将BiLSTM(weibo WordEmbedding)+BERT+fastText结合起来做个voting,效果应该会更好,而且也不用我这么麻烦

其实我用的模型并不复杂,但是我在数据上使用了很多tricks

数据清洗

我一开始在baseline中用的方法还比较温柔,保留了一些英文的单词和其它字符。后来我数据清洗直接保留中文字符,非中文字符全部剔除。因为这里面的数据都是中国微博的评论内容,所以使用英文单词的比较少,最多的都是一些和话题相关的内容,比方说"iphone"、"xiaomi"之类的,而这些出现的特别频繁,其实用处不是很大,所以我都剔除了。然后我还使用了一些中文的停用词进一步过滤

Sample

首先由于数据样本不均衡而且样本总数比较少,共3类,每类大约是4:4:2这样子(具体的记不太清楚,懒得回看代码),样本总数不到3000

所以我对3类样本分别做了一定比例的上采样,来增加样本数以及稍微平衡一下每个类别的样本数量

分词

Sample之后,要对每个样本的text进行分词,这里我考虑了一下,因为使用相同的分词工具对相同的文本进行分词得到的效果肯定是一样的,所以Sample的效果不会特别好,为了增加它的效果,我使用两个分词工具,随机对文本进行分词。这样就能使得,就算对同一句话进行处理,也可以得到不同的效果

测试数据再训练

由于训练集实在是太少,所以我做了个一个操作,就是将测试集(预测后)也丢到训练集中去,进行训练。有的人可能会说,你的测试集又不是100分,存在错误分类的样本,就这样丢进去效果行吗?

效果肯定是不稳定的,有时候好有时候不好,这也是意料之内,毕竟随机性太大。但是其实你仔细想想,假设你的测试集提交后得到了60分,也就是说里面有60%的样本预测的是正确的,将这整个测试集带入训练集,shuffle以后划分train set和val set,其实说不好,因为如果你大部分预测正确的样本都分到了train set中,那效果就很好。但如果大部分错误的样本分到了train set里,效果就会很差。而每个人每天只有5次提交机会,你也很难知道到底最终的效果怎么样。因此就用到了我下面的trick

人肉预判分数

由于每天只有5次提交机会,如果你不嫌烦,其实这么长的比赛时间也足够刷分了。但是如果对于时间比较短的比赛,这种方法就比较实用

这是我自己研究出来的一套方法,是这样的,假设你最开始训练完了一个模型,然后对测试集进行了预测,提交得分是60,我们称这个预测集叫预测集A吧。然后你调了调参,又训练了一个模型,又进行了一次预测,我们称这个预测集叫预测集B吧。如何在不提交的情况下,大概预判预测集B的最终分数呢?

假设预测集总共1000个样本,因为你预测集A只拿了70分,说明里面有30%的数据预测错了,也就是有300个错误样本

写个程序,对比一下预测集A和预测B不同的数量,比方说对于第一条样本,预测集A预测为类别1,但是预测集B预测为类别2,那这就是不一样的。统计出所有不一样的个数count。假如count>=600,我们分析下最好情况,最好情况就是说原来测试集A预测错了的300个样本,全都预测对了,那么还有count-300个不一样的,这剩下不一样的,只可能是预测错的

这个对于分数比较低的时候不太适用,但是对于分数高了以后很有用,比方说我有次提交得到了90分,然后我重新预测的文件和我90分的文件不一样的个数小于100,那我就会提交这次新预测的文件,不然我是不会浪费次数的

总结

上面的各个trick是环环相扣的,Sample如果没有两种分词工具随机使用,是达不到那么好的效果的。把测试集带入模型进行训练如果不人肉预判分数也会比较麻烦

源码:https://github.com/wmathor/weibo-stance

---来自腾讯云社区的---mathor

关于作者: 瞎采新闻

这里可以显示个人介绍!这里可以显示个人介绍!

热门文章

留言与评论(共有 0 条评论)
   
验证码: