[NLP]答案推荐的评估指标设计
智能问答系统中知识库的构建是重中之重。问答库的构建可以分为三个阶段。第一个阶段:人工构建问题-答案对;第二个阶段:自动挖掘问题,人工填写答案;第三个阶段:自动构建问答对。第一个阶段多见于现在的通用问答平台,第二个阶段是目前问答系统落地的主流,特别是针对长尾问题的解决;第三个阶段是问答库构建的高阶。
假设问答对能够自动构建,由于自动化的方案无法保证绝对的正确,因此对于答案的使用,采用推荐的思路,本质上决定权交给人。假设自动化构建的问答库是高准确的,那么就可以不用推荐的思路了。
问题的定义:给定一个问题,基于自动构建的问答库,推荐了N个答案,如何衡量推荐答案的效果呢?
方法论:既然是一个推荐问题,那么理论上就可以采用推荐领域的指标,但是同时要考虑答案推荐场景的特殊性,合理选用的同时,适当改造。
这篇博客主要讨论第一步要思考的问题,哪些推荐领域的指标可以用于答案推荐的场景?
先看下我们要评估的对象吧,数据如下:
问题 | 推荐答案 |
---|---|
你们家发货有点慢啊 | (1)亲,我们在催货了;(2)谢谢,亲亲。(3)还没收到货吗?亲亲。 |
买家咨询打折 | (1)您是想要买什么牌子的?(2)亲亲,建议看下商品详情页哦 |
这件T恤多大码的? | (1)亲亲,你是要退货吗? |
如何评估推荐系统在答案推荐上的效果?思考的出发点是:从业务指标到模型指标,评估维度从粗到细。业务侧的同学只需要理解业务指标,业务指标也是业务落地的北极星,直观的特点是:简单粗暴。这里,可以定义的一个业务指标是答案采纳率,如下:
给定一个问题,推荐的答案中,是否有可用答案?基于上述数据,可以得到标注结果如下:
问题 | 推荐答案 | 是否采纳 |
---|---|---|
你们家发货有点慢啊 | (1)亲,我们在催货了;(2)谢谢,亲亲。(3)还没收到货吗?亲亲。 | 是 |
买家咨询打折 | (1)您是想要买什么牌子的?(2)亲亲,建议看下商品详情页哦 | 是 |
这件T恤多大码的? | (1)亲亲,你是要退货吗? | 否 |
因此,答案采纳率=2/3。为什么是合理的?想象一个业务同学在审核推荐答案的时候,当推荐答案的数量小于K(其中K是一个很小的数)时,快速浏览一下,就可以选择自己想要的答案了。该指标评估的是:推荐答案到底有没有用?
简单粗暴并不意味着不可用,所有指标的选择依据在于想通过该指标评估系统的具体哪个方面。那么,该指标有什么地方没有考虑到?
(1)给定一个问题和推荐答案列表,采纳1个和采纳多个不一样吧?(如何设计指标呢?)
(2)能否把优质的答案排在靠前的位置,很重要吧?(推荐内容的位置很重要)
这里主要讨论(2),传统的推荐或者搜索系统,返回结果量级大,需要翻页处理,因此最有可能被采纳的结果放在靠前的位置是一个重要的因素,但是对于答案推荐的场景,总共推荐的答案量级非常小,用户第一眼就可以全部浏览完,相比之下,对位置的要求不太严苛,但是绝大多数用户都是从上向下浏览,并且用户习惯默认排在前的答案是优质答案,当结果不符合预期的时候,用户体验就会变差,因此在答案推荐的场景下,对答案位置的考察也是必要的。
这里直接借鉴推荐的三个指标:MAP, MRR和NDCG。
(1)平均准确率(MAP)
为了计算该指标,按照既定格式给上述数据重新打标,假设结果如下:
问题 | 推荐答案 | 是否采纳 | |
---|---|---|---|
你们家发货有点慢啊 | (1)亲,我们在催货了; | 是 | |
(2)谢谢,亲亲。 | 否 | ||
(3)还没收到货吗?亲亲。 | 是 | ||
买家咨询打折 | (1)您是想要买什么牌子的? | 否 | |
(2)亲亲,建议看下商品详情页哦 | 是 | ||
这件T恤多大码的? | (1)亲亲,你是要退货吗? | 否 |
MAP首先计算每个问题的推荐准确率,其次对所有问题取平均。具体计算过程如下:
P(你们家发货有点慢啊) = (1/1+2/3)/3 = 5 /9,其中1/1表示,前1个位置的采纳率;2/3表示前3个位置的采纳率;因此,这里就是对推荐位置考察的体现,分母的3表示推荐答案总数。
依次类推,可以得到:
P(买家咨询打折)= (1/2)/2 = 1/4
P(这件T恤多大码的?)= 0
则,MAP = (5/9+1/4+0)/3 = 29/108,该值的范围为[0,1],且越大越好。
(2)平均倒数序(MRR)
为了计算该指标,按照既定格式给上述数据重新打标,假设结果如下:
问题 | 推荐答案 | 采纳答案序号 | 倒数 |
---|---|---|---|
你们家发货有点慢啊 | (1)亲,我们在催货了;(2)谢谢,亲亲。(3)还没收到货吗?亲亲。 | 1 | 1/1 |
买家咨询打折 | (1)您是想要买什么牌子的?(2)亲亲,建议看下商品详情页哦 | 2 | 1/2 |
这件T恤多大码的? | (1)亲亲,你是要退货吗? | 0 |
MRR=(1/1+1/2+0)/3=1/2
标准的MRR计算是从推荐答案中选择一个最佳的答案,当可以选择多个答案的时候,如何计算MRR呢?
(3)NDCG(normalized discounted cumulative gain)
对比(1)中的MAP,对于每个答案,只关心采不采纳,但是更细粒度的评估是这个答案有多好?(用量化的方式表达)
为了计算该指标,按照既定格式给上述数据重新打标,假设结果如下:
问题 | 推荐答案 | 有多好? | |
---|---|---|---|
你们家发货有点慢啊 | (1)亲,我们在催货了; | 5 | |
(2)谢谢,亲亲。 | 0 | ||
(3)还没收到货吗?亲亲。 | 3 | ||
买家咨询打折 | (1)您是想要买什么牌子的? | 0 | |
(2)亲亲,建议看下商品详情页哦 | 4 | ||
这件T恤多大码的? | (1)亲亲,你是要退货吗? | 0 |
为了计算NDCG,可以按照CG,DCG,NDCG的计算顺序。
CG(你们家发货有点慢啊) = 5+0+3 = 8
但是CG没有考虑顺序,添加对顺序的考察,计算DCG。这里是一种对顺序的考察:
对有多好?的评分,做变换:(2^评分-1)/log2(位置+1)。那么,可以得到:
DCG(你们家发货有点慢啊) = (2^5-1)/log2(2)+(2^0-1)/log2(3)+(2^3-1)/log2(4)
从上述标注结果可以看到,虽然有的答案排在第三位,但是用户给出的评分确实第二位的。这里可以计算IDCG,其中I表示理想的。和DCG的计算区别在于:需要按照评分从大到小排序后计算DCG。
IDCG(你们家发货有点慢啊) = (2^5-1)/log2(2)+(2^3-1)/log2(3)+(2^0-1)/log2(4)
那么,NDCG = DCG/IDCG,该值的范围为[0,1],且越大越好。当然,NDCG是针对给定一个问题计算的,可以对所有问题取平均。
对上述指标的深入讨论暂不展开,围绕答案推荐场景,综合来看,MAP是一个相对合适的指标。
综上,针对答案推荐,指标选择如下:业务侧采用采纳率;模型侧采用MAP。还有其他的一些想法吗?