JDDC2019总结

EndlessLethe原创文章,转载请注明: 转载自小楼吹彻玉笙寒

本文链接地址: JDDC2019总结

前言

我们小队能获得JDDC2019的并列亚军(3th),既有运气的成分,也离不开我们做的很多工作。

但本文只具体谈谈我参与JDDC2019的感想与收获,大概就是一篇写给自己的流水账吧。至于检索模型的细节可以参见我的github jddc2019-3th-retrieve-model以及我在12月中旬将完成的一篇关于多轮对话的综述。

正文

其实在参加这个比赛之前,我对NLP都只是一知半解,因为NLP的基本模型太多了,看书看得不明白,也没有对模型有个总体的认识。

在完成JDDC这个比赛的过程中,我确实获益良多。主要可以分为三个方面:

数据预处理(数据探索性分析)

在数据探索性分析的过程中,我发现世界之大无奇不有,有很多有趣的事情都蕴含在语料之中。

列举几个影响比较深刻的例子:最长的会话长度(即多次QA的句数之和)有300句,可以说是客服和用户“大战”300回合;最长的用户提问有超过两万个字,是由一个短句复制了无数遍产生,可想而知用户当时的心情有多么的崩溃;有的用户前言不搭后语,还存在大量错别字,可以看出用户是刚刚接触网购,对拼音和手机沟通比较生疏。

而这次的数据预处理工作比较让人头疼。之前没有接触过这种基本没有经过处理、在实际对话中产生的语料,直到这次接触到了京东客服真实对话数据。这次的语料可以说是非常“脏”了,语料中有很多未脱敏完全的地名、网址、表情等等命名实体,以及大量错别字、错误使用和随意使用的标点符号。

在这次语料的预处理过程中,我的感受就是NLP从理论到应用的gap还是非常明显的:现实生活中的语句实验数据集中的语料差异非常大。如果想要模型有好的应用效果,一方面要提高模型的泛化能力,对噪音有较高的容忍度,另一方面要做好的数据清洗工作,尽可能地将数据变“干净”。

词的分布式表示

本来我一开始只打算做一个基于tfidf的检索模型作为baseline,但后来检索模型越做越复杂,分为了Retrieve和Rerank两个模块。

在粗筛Retrieve模块的词的分布式表示方向陆陆续续尝试了很多方法和模型:从传统的LSI与LDA主题模型、经典的SkipGram再到引入了先验知识以及包含句子上下文的预训练模型ELMO与BERT。

在这一步步地尝试中,我对词的分布式表示方法有了比较全面和深刻的认识,对于每个模型的优缺点都很熟悉了,每个模型调参也都是调了很久。

基于历史的多轮对话的检索模型

这次比赛中我做的最有成就感的一点是,我完成了一个检索模型所应该有的全部内容。从一开始基于tfidf的、简单的单轮检索模型慢慢进化到最终版基于BERT的多轮对话检索模型。

不过我的模型缺点也是显而易见:
一是没有创新性,只是在不断尝试使用已有的模型,没有对其进行改进;
二是没有工业界视角,对于索引效率、数据清洗这些部分关注不够;
三是很多细节没有深入继续做,比如文本匹配的传统模型就没有尝试。

一方面是因为做到后面确实没有多余时间来打磨模型,另一方面还是自己水平有限,需要继续看论文,以及学习和理解其他队伍的优秀做法。

我的感受

这里就说一说模型之外的感受吧:

  • 和小伙伴一起打比赛是很有趣的经历,大家能相互促进,共同学习。
  • 这次比赛对我来说,做了什么和收获了什么比结果是什么更重要一点。
  • 囿于大赛时间的限制和我对NLP的不熟悉,我主要看了关于检索模型的论文,对于生成式模型和传统的填槽式模型没有看太多,只看了少数几篇。在年底(12月中旬)左右我应该会完成一篇关于多轮对话的综述,来完善自己关于生成模型和填槽模型的理解。
  • 如何在其他人的代码上继续工作,以及让其他人在自己的代码上继续工作依然是困扰我的一个问题。是不是不同程序员应该首先明确分工和负责的模块来减少这类事情的发生呢?还是说团队应该每个人都对项目代码有所浏览(似乎不太现实)?甚至对于函数复用,因为缺乏关于函数的文档,对于一个比较长的.py文件而言也很难能够复用其里面的代码。
  • 对于结果还是很满意的。感谢京东提供的这次比赛机会,能够让我学到关于多轮对话的很多东西,还见识到了其他团队的优秀模型,给了我很多如何继续改进模型的启发与思考(有点棒的流水句呢hhh)。

发表评论

电子邮件地址不会被公开。 必填项已用*标注