开放域文本分类技术思考

每天给你送来NLP技术干货!


来自:CS的陋室

这次给大家介绍一个特定场景的文本分类任务吧,另外还希望大家注意的是这个思考和分析问题的过程,这些思路后续成为大家的关注点后,更有利于解决各种各样的问题。

当然,下面的构造思路和方案其实会冲击很多人的三观,DNA都可能被篡改,预告一下,看完的可能会有这些疑问:

  • 测试集和训练集的抽样方式是否要一样?

  • 训练集和测试集的分布是否要求一致?

  • 准确率和召回率可以对应不同的数据集,分开建设?

  • 测试集和训练集的正负样本比例不同,还可能差异很大?

背景

在开放域的搜索、对话等场景的意图识别,其实开放域文本分类还是挺多的,甚至是在一些垂域,其实都是有类似场景的,里面很多方法其实可以用到,而正因为这些领域其实很常见,其实这块大家的招数都很多,整体技术也是比较成熟的。

问题的形式大概是这样的,在开放域之类的场景,用户来的query是各种各样的,成句不成句天南地北的,非常混乱,我们需要从中找到属于我们意图的query,从这个角度来看,其实就是一个二分类问题,只是因为在线的query乱七八糟,所以存在特定的一些难度。

既然已经不是困难的问题,那我们更加要掌握好。

场景特点分析

相比一般常见的文本分类,这个开放域文本分类会有什么特点,这些特点能不能为我们所用更好地解决这个问题,这里给大家介绍一下。

  • 正类占比很低,百分之1、千分之1甚至更小,换言之样本极其不平衡。

  • 用户query程度很高,永远不清楚用户的query会以什么形式攻击我们的方案。

  • 长尾效应明显。高频的很高频,低频的很多而且很杂。

  • 类目边界模糊,偶尔还会涉及边界的变更。

  • 一般问题会比较在乎正类的准确率,希望不对的尽量不给正类。

当然在一些特定的类目下,会有一些特殊的问题,例如这些:

  • 名词性强的,例如电影、电视剧、音乐等,是对特定名词很敏感的,在现实应用中,这种query占比其实并不低。

  • 在开放域中划分的一些相对也是开放域的类目,边界就更加模糊了,例如百科、闲聊等。

  • 明确的非常小的场景,如天气,对话系统中的成语接龙、猜人物、讲笑话等。

常见解决方案

数据集

在这个角度来看,实验室和实际落地之间的最大差距在于对数据集的把控上。相信在这里数据集的工作应该是最繁琐的,这里对应需要解决的就是问题1里面的问题,这个可以说是非常重要了,我先聊做法再聊原因和思路吧。

训练集上,正样本主要是根据产品需求从多个渠道进行挖掘得到的,例如关键词、高频句式、产品给的样例得到,而负样本其实就比较简单,直接拿在线的随机query(可能有噪音但是占比会很低)以及在线高频来构造即可。

而测试集,由于在线的正负样本极其不平衡,所以正负样本的构造极其困难,这里对准招数据集进行分开整理。准确率只需要考虑正类的准确率,因此可以通过对baseline对在线随机query进行预测拿到正类后自标一部分,这部分就作为测试集,后续召回范围可能会改变,此时不断更新这个集合即可;至于召回集,可以用一定的规则对在线疑似正确的query进行精标,这批精标的数据就可以作为召回集,另外用模型对在线随机query的正类的占比也可以从侧面反应召回情况。

好了,来聊聊这方面的思考。

首先,对训练集,我们不能总是依赖标注数据,一方面是标注的时间肯定是有要求的,另外标注在边界不明确的情况下或者标准复杂的情况下其实人标的质量也不见得很高,通过在线的一些信息或者关键词,往往可以得到还可以的数据集(准确率一般85%-90%以上就已经可用了),而负样本,如果在评估后在线随机query中正类的占比不是很高,其实直接取了就能当负样本了,毕竟在线占比很低。

另外,产品给的需求或者定义都是非常明确的,这些肯定是可以做训练和测试集的,除此之外,也可以通过整理常见句式然后通过替换的方式生成一些样本,这种方式生成的样本质量也比较高。

至于测试集,这里的设计是非常考量业务需求的,我们其实并不关心负类的准招,我们只关心正类,所以我们整的数据集也是关心正类的,另一方面,准确率取决于算法本身在在线随机query中的召回情况,所以需要的集合并不会很大而且也不稳定,对于前者,可以在有baseline后再来标才有意义,对于后者,只能在算法逐步迭代更新的同时逐步迭代这个集合。而召回集,应该是很头疼的部分,这部分要覆盖的是用户期望是正类的这个部分,但是要从成千上万的query中挖出来书是不容易,只能是先粗筛后精标,从而得到这么一个召回集。

算法方案

方案上,通常采用的方式就是分类模型+规则+词典+搜索,当然根据问题的实际情况来进行调整。在方案设计的过程中,要考虑的问题有这么几个:

  • 如果名词性质强,那就需要考虑重词典或者结合词典的模型方式,单独模型是解决不了名词性的分类问题的。

  • 空间较为零散,语义空间并不聚集比较分散的时候,应该考虑以搜代分的形式。

  • 模型性能问题,能抗多少qps,单机平均耗时多少等。

考虑上面的问题,这里提出一种比较常见的思路模式:预处理->规则->模型/搜索->后处理/规则。

  • 预处理这里主要是对一些无意义词、语气词之类的给删除,还有数字、英文、简繁体规范等之类。

  • 规则部分是负责过滤那些肯定不是正类的样本,这块能大幅缓解模型的压力,涉及高频、常见负类等的黑白名单,也有一些其他通过规则的过滤。

  • 模型和搜索,应该就是大家比较熟悉的部分了,不赘述。

  • 后处理和规则,就是在模型召回或者是搜索结果上进行的调整,例如灵活的阈值、搜索的相似度更新等。

这里的第二步和第三步要稍微展开说一下。

第二步的规则和词典来源于正类的一些非常显而易见而且准确度较高的特征,在线query千千万,一些很明显能判断出来的东西就不用交给模型了,甚至极端的规则足够靠谱其实连模型都不要,类似“成语接龙”之类的其实没有必要非要整个模型来做对吧,这时候需要的是我们对数据和业务足够熟悉才能构造出来。至于词典,同样要来源于需求,当然也可以依托其他资源,例如下游的检索库中的特定字段。

对于分类模型,建议是从简单的模型开始,在尝试阶段,能有一个快速的baseline,也能逐步看到数据中存在的问题,经典的模型一般在数据状况较好的情况下效果不会太差,各种标准数据集下这些模型和现在流行的模型相比虽然效果不是那么好,但是还是说可用性还是可以的,在这里可以快速尝试,一般准招达不到70的话,大概率就是数据的问题了,需要调整的是数据集的质量。

这里还需要强调的是,分类模型和以搜代分这两个其实看做是对这个类目的多路召回,后续需要进行后处理和排序,这里所谓的排序其实也是一种后处理,下有这个位置还有机会对这个分类和检索结果进行汇总和最后的决策,这点来看,其实就呼应了原来我聊过的“准招分治”的思想,同样是这样看,其实分类模型和搜索方案做的可以稍微松一些,准确率不必太高,可以适当向召回倾斜一下,在后面后处理还有一道关卡来保证这个准确率。

效果评估

效果评估是值判断我们方案好坏的方案,这块内容同样需要讲究,而不是简单一个准招就完事了,这里有众多复杂的细节。

首先是数据,这个上面已经提到,这里就不再赘述了。

然后是标准,即何为正类、何为负类,这个类别的判断标准,边界是否精准,这个会反馈在标注上和测试集的指标上,这里非常重要,有的时候看着指标不好一个劲地去弄前面的方案而忽略这个标准问题,那怎么优化都优化不好,就和考试复习的东西和考试不同,怎么可能考得好。

最后是指标,都说准招准招,这里的准确要求的是实际正类除以算法认为的正类,这里的分子分母的抽样规则,是否去重,需要关注。指标本身,是评估的最终效果,还是过程、漏斗中的某一步,要清楚,清楚自己的每个数来源于哪一步,分布是否合理,是否符合预期,需要时刻关注。

说到指标,还需要明确的是设计这个指标的目标,要根据目标来定观测的指标,如果是要评估好坏,要确定算法流程的边界,从哪到哪,这个过程的效果,如果是为了诊断问题,例如做漏斗分析、多分类分析,那就需要确定指标内部的数据符合预期,例如多分类就要关注每一个类的准招,看看短板和具体问题点等。

再聊聊数据集

相信在数据集上很多人会有很多疑问,为啥数据集的构造方式会和常规的这么不同,我这里集中以问答的方式回答一下。

问题1:测试集和训练集的抽样方式为什么不一样?

回答1:产品对问题的定义是非常场景化甚至带点感性的,算法要根据产品需求抽象出来,再分门别类构造出数据集,才有可能训练出符合需求的模型,这是训练集视角。而测试集的构造,是需要根据在线的实际情况来构造的,所以抽样就是从在线随机query中抽样,这是其一;其二,我们现在更关注的是正类的准确和召回,对负类的分的好不好其实并不关心(其实正类的准招出来了,负类的也大概可以出来了),所以我们关注准确只需要知道两个数,算法召回正类中实际是正类和算法召回正类就够,召回只需要知道应召回和算法召回两个。

问题2:抽样方式的不同导致训练集和测试集分布不一致是否会带来不好的后果?

回答2:我们的目标是效果好。举个很好的例子让大家理解,一场考试有简单题有难题,也有对应的比例,那我们复习的时候是应该根据出题的比例来安排学习时间还是根据题目的难易来安排,28法则告诉我们,有80%的收益我们只需要付出20%的努力才能得到,而20%的收益需要80%的努力才能拿到,回到问题,有些难一些的问题确实需要更多样本才能够支撑这个点模型学得好,那就需要多点样本,而有些简单的问题就不需要那么多了,这点和测试集里的占比相关吗,其实未必,测试集我们是要用来测试方案在真实环境的效果即可,所以尽可能贴合在线的分布就行。

问题3:为什么评估准确和评估召回可以是两个不同的数据集?

回答3:同样回归问题,正类的准确率需要两个指标,我们构造出符合我们的数据集就能够评估出来,召回率一样。两个是否同一个数据集这么看是不是就不重要了,或者说,之前我们常看的准确率和召回率一个数据集,是不是只是这个情况的一种特殊情况?

问题4:为什么这里的模型只关注正类的准招,不关注负类的?

回答4:一方面也是产品需求吧,要求关注正类的情况,宁可不出也别出错的,另一方面,从指标层面来讲,负类指标基本都很高,意义不大。负类在线占比4个9甚至6个9,算法一些错误在指标上根本看不出来,意义不大。

小结

这里可以看到一些对数据的理解,其实相比一些比较常规的场景差别很大,这里打破一些思维定式后重塑,其实对数据的理解又有了新的提升。

总结

这篇文章主要是给大家介绍开放域文本分类一个子分类问题的解决方案,让大家也能理解一下现实场景的NLP问题是什么样的。


投稿或交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。

方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。

3cf97eef9cf4e09b0af0aba63ea0cc13.png

记得备注呦

整理不易,还望给个在看!
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值