部分文字来自TennielM的博客,已联系转载!
————————————————————————————
这几天看见实验室的师兄们在报名了知乎的机器学习比赛,因为我自己对于NLP领域属于婴儿阶段,还不是初学阶段,所以就跟着他们凑凑热闹,给他们端端水,倒倒茶,顺便学习点经验.
话不多说,开始谈谈我的看法
自从参加这些比赛开始,师兄们就告诉我,作为参赛者,不要顾及名次和奖金,一定要调节心态和自己的预期,最好的心态是把自己当做一项公开的学术的交流和算法的研究.多数人也不是冲着拿第一名的奖金去的,只是想在企业的真实数据集上演练一番,试试技术深浅,提高提高自身姿势水平。
这一次知乎提供的数据还是比较有意思的:
1:通过了知乎的NLP数据,不仅仅是这个比赛,以后进行研究后不必在用爬虫进行爬取,并且在群中的知乎工作人员也说在比赛结束后数据依旧公开
2:知乎提供的数据最大限度地保留了原始数据信息:标题的单字和词语、问题描述的单字和词语、话题标签。并且提供了每个词语的word2vec数据,这样一来比赛词语的分析的时间将大大缩小,要省了不少的精力
3:这些词汇语句之间的词条中包含有不同的层次结构,这样分类将变得容易.
准确率计算公式:
2. EDA
word2vec数据:
char_embedding.txt:包括11973个不同的char,char_id格式为'c' +整数。word_embedding.txt:包括411720个不同的word,word_id格式为'w' +整数。
训练集与测试集:
question_train_set.txt和question_topic_train_set.txt:2999967行,5列、2列
question_eval_set.txt:217360行:5列
5列特征:quesiton_id,title_char,title_word,desc_char,desc_word
2列目标:quesiton_id,topic
话题信息:
topic_info.txt:知乎的话题标签构成了一个有向无环图。
数据分布来自比赛官网
词句的长度分布:
在以下的直方图中,红色代表测试集,蓝色代表训练集。
上图:title_char(标题单字)的分布,主要集中在10~20个字。
上图:title_word(标题词语)的分布,主要集中在10个词左右,略少于标题单字的数量。
上图:取对数之后的desc_char(描述单字)分布;取对数的具体函数为:lambda x: np.log(x + 1),其中x是原始问题里的单字数量。可见,大量的问题并没有描述,但有一些问题有极长的描述,呈现一个skewed distribution。取对数之后,问题描述单字长度呈近似正态分布。最长的问题描述有25698个单字。
上图:取对数之后的desc_word(描述词语)分布。不出意外地,除零点处的峰值以外,取对数后的描述词语数量呈正态分布。训练集和测试集中,最长的描述只有2787个词,比较符合现实的习惯。如果有描述,那么平均的描述词语数量约为60个。
上图:话题标签数量的分布。同一个问题,最多有19个标签,但一般都集中在5个以内。
3:模型的思路
理论上讲,只要足够大的RNN结构就能去生成任意复杂的序列结构。
但是我看师兄们用bilstm+atten居然还不如cnn
应该是train的设计出错了吧
用LSTM算了下不收敛
但是基本的bilstm回到0.375
所以有理由相信rnn+attn更高
但是我觉得我觉得给一个小数据集拿来验证比较好,拿topic model跑出来的结果没法评判主题学习的怎么样.并且embedding的语义距离对调参的方向有比较大的影响
看了看一些代码,大致可以跑到0.4左右:
其余的,等我学学这再说吧!
PS:
链接: https://pan.baidu.com/s/1nvJmEa1密码: 9jq7这个是我解压后上传的数据大家有需要的可以去上面下载数据不是广告
版权印为您的作品印上版权20066889