意图识别和纠错问题

一、为什么要做意图识别

意图识别算是query理解中比较上有的位置,对query进行意图识别,是指分析用户的核心搜索需求,例如是要找电影、找小说,还会想问百科知识,还有查快递、市政办公等需求,这些需求在底层的检索策略会有很大的不同,错误的识别几乎可以确定找不到能满足用户需求的内容,导致产生非常差的用户体验,因此精准的意图识别非常重要。

来举一个例子,用户输入唐人街探案,一般是电影、网剧、网评之类的需求,退一步可能是比较弱的新闻、明星之类的意图,而肯定不是汽车、体育、快递之类的意图。而在底层的检索策略,只有我们识别到了电影意图,我们才会去电影的数据库里面检索,里面就不会有汽车、体育、快递,换言之,没有识别到电影意图,压根就不可能出现唐人街探案的电影的卡片甚至咨询,而如果我们错误的识别到了汽车,那我们就只会在这个意图下出汽车的相关内容了。可想而知,错误的意图识别会带来多大的负面影响。


意图识别的具体内容

其实从上面的描述可以看到,意图识别是对query进行意图的分类,因此总体思路上采用文本分类的方式进行,这个相信大家能想的明白。而在架构上,也需要对意图识别的逻辑进行设计。


意图识别的架构设计

考虑搜索场景的下面这些原因,进行意图识别的架构设计:

  •     用户输入内容模糊或者涵盖内容广,因此经常会出现多意图,如“苹果”(手机、水果)、“长城”(景点、电影、汽车)、口罩(医疗、购物)。
  •     多个意图不可能同时开发上线,必须一个一个开发迭代。
  •     开发一个意图时要求独立,尽可能不影响其他意图的计算。
  •     虽然每个意图独立,但是要求意图之间尽可能可比(例如意图强弱打分),这个信息需要传导到排序层。
  •     每一个意图的识别算法可能会不同,需要分别设计。

当然上面的所有很难兼顾,我们一般根据搜索系统当前的情况进行设计,按照《美团机器学习》的建议,采用多个二分类器并联的方法能够较好的保证框架拓展的完整性,一个新意图的上线对其他意图的影响降到最低,但是在可比性上可能会较欠缺。


意图识别的方法

虽说是文本分类,但是大家千万不要把这个分类限制在基于深度学习和机器学习的文本分类里面了,在搜索场景下,这些方法很可能会失效。大家拓宽思路,也多想想没有深度学习之前大家可以怎么做意图识别,手里多几把武器,刀子切菜,斧头砍柴,锤子锤钉子,能解决的问题就多了。
基于词典和规则的方法

基于词典和规则的方法在搜索中最为常见,好的词典一般能够解决超过80%甚至以上的问题,而准确率也能达到90%甚至以上,这应该是搜索领域最应该首先想到的方法。

  •     搜索query绝大部分很短,没有上下文、特征词,识别非常困难,如“都挺好”(电视剧),用户就这么输入,没有额外信息,除了词典难以处理。
  •     词汇含义变化很快,随着一些热点信息的变化,需要快速上下线,词典可以处理,如“少年的你”,识别到是新电影,马上更新词典,意图就可出。
  •     语义信息有的时候反而是误导。“少年的你”是一部电影,“年轻的你”可就不是了。
  •     部分的搜索要求有限保高准确,低召回可接受,词典就是为了这个场景量身打造的。

基于词典,就是对用户query内容和词典内容进行比对,比较常见的方式是序列标注问题里用的最大逆向匹配,通过这种方式找到词典里的实体词,匹配触发了自然就有意图了,而在词典匹配的时候,不是使用链表之类的来构造匹配结构,而是使用搜索树的结构,这种匹配的复杂度最低,速度也快,两者结合,其速度甚至比很多模型要快得多(基本上1ms以内就能完成),fasttext速度非常快,但是textcnn之类的其实就已经达到ms级别以上,bert甚至在10ms级别。

基于规则,其实和词典的区别并不大,但是处理query会比词典更为灵活,例如正则表达式,相比词典能处理更加复杂的内容,构造对应的模板,query命中这个模板就触发意图,这种当时依赖个人对query的理解,一般结合词典来使用。


基于ML和DL的方法

机器学习和深度学习就这么一无是处?当然不是,他也有存在的意义,把他搬出来往往是因为这些原因。

  •     规则和词典的泛化能力不足,召回率达不到预期。
  •     用户在这个意图下输入的内容比较复杂,规则和词典难以覆盖:如“劳动节去哪玩”可以是一个电影意图,这里没有指向意图的实体词。
  •     可以依赖语义进行识别的内容,例如词典里没有“让子弹飞”,但是用户输入了“让子弹飞的票房怎么样,一些修饰词之类的可以帮助进行意图识别,此时语义,也就是深度学习的方法,可以协助完成意图识别。

有关文本分类,这块相信绝大部分人都了解的不少了,简单的就是fasttext,复杂一点可以升级为textcnn。但是注意几个点:

  •     rnn系列并不推荐,一个是耗时,另一方面query的内容很短并不适合抽取序列信息。
  •     bert之类的大家伙,使用时需要谨慎,耗时虽然要考虑,但是性价比、提升空间之类的也要好好分析,fasttext效果很差,很多时候bert也不见得好到哪里去。

大模型想用其实也有方法,可以考虑用蒸馏的方式来寻求替代方案,2015年(不知道有没有记错)Hinton提出了知识蒸馏的概念,首次应用在图像处理上,至今已经过了5年(其实我也比较好奇为啥工业界用的,媒体吹的都不是很多),而有一些论文在nlp上进行了尝试,效果尚可,现在科研界有很多尝试对bert进行轻量化的方案,蒸馏就是其中一个,大家可以多尝试一下。


其他定制化方法

因地制宜、因时制宜,因XXX制宜,都在告诉我们,要从实际出发,实事求是,通识通法是帮助我们解决大部分问题的尚方宝剑,但是在特殊情况下也需要我们采取特殊手段解决问题,在遇到这些问题的时候,我们也要懂得应对,类似的说法我在之前的文章也有提到过,这是作为算法工程师的其中一个凸显能力的重要素养。来举一个特殊的场景,供大家思考:

  •     如何识别用户输入的是一段歌词、台词。
  •     用户对热点事件的关注点不同,描述不同,如何匹配到特定的热点新闻上去。
  •     图书的模糊搜索如何实现。

这些问题如何解决,取决于你对用户query的理解,多看日志,多看用户是怎么尝试描述他们想要的东西的,才能让你更好的解决这类问题。


二、纠错问题

纠错是搜索引擎中一个非常有特色的模块,对用户输入的内容进行改写从而让用户得到正确的结果,有的时候也会带有一些惊喜度,所以纠错技术是一个搜索体验的加分项,近期突然对这块有兴趣,所以就了解了一下。(学习周报本周停,学习内容都在这了)


纠错技术的背景

人非圣贤,孰能无过,别说是搜索的时候,哪怕是我们打字、写作文的时候,都会出现错字,一般的错别字不会对最终目标带来很大影响,且出现频率很低,不拘小节的我们常常会忽略这样的小问题,但是,在搜索场景下,错别字意味着可能就搜不到内容了,对于用户而言,就是需求无法满足,造成了很差的体验,因此在搜索场景中,就很有必要去纠错。


错误是如何产生的

要去纠错,先要去看看错误是怎么产生的。

首先是误操作类型,这种类型可以从输入法角度去看。

  •     拼音输入法。常会出现同音异形字,例如周节伦等。
  •     笔画输入法或者手写输入法。常会出现形似字,例如博和傅。

然后是用户的主观理解,有的时候用户只是听说过而没见过,或者就是理解问题,导致主动地出入了错误的内容,例如飞扬拔(跋)扈,然后有一些名词,例如小说、音乐、电影等,写错字是非常容易的。

当然,也有用户图方便,或者输入问题,导致直接输入拼音或者拼音前缀,或者就是因为记忆的原因,输错了。

当然这里也要补充一些常见的问题举例:

  •     谐音。深圳-森圳。
  •     别字。师傅-师博。
  •     中英文。Taylor swift-泰勒斯威夫特。
  •     近义词。爱情呼叫转移-恋爱呼叫转移。
  •     形近字。高粱-高梁。
  •     全拼。深圳-shenzhen。
  •     拼音前缀。北京-bj。
  •     内容不完整。唐人街探案-唐人。

总之错误千奇百怪。理解错误产生的机理,我们就可以尝试去处理这些问题。


词典与规则方法

词典是搜索系统中非常常用的方法,词典具有高速、高准的优点,如果词典的覆盖度高,甚至可以达到高召回的效果,因此词典基本是搜索系统中的核心存在,我们不应该小看他,而是尽可能挖掘他的潜能。

词典方法,说白了就是对query找对应词典里有没有,如果有就改写过去,这种方法的优点在于速度快,而难点在于怎么去挖掘这个词典。

至于怎么挖掘这个词典,方法有很多底层数据库抽取,用户日志等,都有很多构建起这样的词典,能够大大降低耗时,复杂度至于query和单词长度有关。那么一般都有什么词典呢,我们来一个一个看看。

  •     拼音和拼音前缀词典。先将query或者单词转为拼音,然后通过通过拼音召回对应的结果,完成纠错。
  •     别字词典,记录一些常见的错别字,例如百度的形近词表就很不错(就在百度百科里面)。
  •     其他改写字典。一般基于具体业务来改写,例如用户输入唐人街探案,其实唐人街探案有3部,我们应该给那个,需要基于热度等方面去改写到具体最合适的一部。

词典只是能够匹配到合适的结果,但是我们需要知道的是,改写的内容不能和原来差距太远,否则会出现很多意料之外的结果,因此改写不能大改,只能改微调,否则出来的结果会让用户感到很懵逼。控制的方法主要是编辑距离。

所谓的编辑距离,就是改写前到改写后,需要经过的操作多少,说人话就是两句话的不同点有几个,精确到字级别。深圳-森圳的编辑距离就是1。通过编辑距离的约束,一般能够让两者的差距不是很大。

我知道很多人热衷于用语义相似度之类的操作,不管别的什么方法,编辑距离一定要约束,用户强调的是直观感受,语义相近与否不是他们第一个关心的,只有当字相近的结果不好的时候考虑语义相近才是用户的实际反映,且错别字带来的语义变化非常大,此处用予以相似度其实不完全合适。
模型类方法

说是词典和规则好处很多,但是在泛化能力上,模型还是很强的。那么在模型视角下,其实会分为下面3个步骤进行分析处理。

  •     错误诊断。即判断有没有错。
  •     修正召回。召回可能的修改项。保证召回率
  •     修正确认。判断最终需要的修改项。保证准确率。

当然,如果模型足够强力,召回和确认两个步骤也可以合并,具体看准招和耗时了。

其实这个思路最广泛的应用就是推荐系统,召回和排序分离,这是推荐系统里面非常重要的思想。

至于模型层面,有下面的思路。

  •     kenlm统计语言工具。运用统计学方法进行语言建模从而检测和修正错误。
  •     rnn_attention。RNN加上attention还是一个非常有意思的方法。
  •     rnn_crf模型:说起来你们可能不信,这个思路来自阿里2016参赛中文语法纠错比赛的第一名的方法。
  •     seq2seq_attention模型:比RNN强一些,长文本效果不错,但是容易过拟合。
  •     transformer:线性优秀的序列表征模型,大家懂的。
  •     bert:中文微调,最妙的是mask可协助纠正错别字。
  •     conv_seq2seq模型:基于Facebook出品的fairseq,在NLPCC-2018的中文语法纠错比赛中,是唯一使用单模型并取得第三名的成绩。


参考:
https://blog.csdn.net/baidu_25854831/article/details/105898150
https://blog.csdn.net/baidu_25854831/article/details/104744564

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值