Fork me on GitHub

【贝壳网】两种简单有效的标签选择方法

不论是通过搜索还是推荐,用户看到了很多我们用各种逻辑和理由展示给他的物品,他只从中消费了一部分物品。那么问题来了,到底是那些特性吸引了用户消费呢?

一种简单粗暴的办法是直接把用户产生过行为的物品标签累积在一起。但是这里要说的是另一种思路。

我们把用户对物品的行为,消费或者没有消费看成是一个分类问题,比如点击是“正样本”,“未点击是负样本”。用户用实际行动帮我们标注了若干数据,那么挑选出他实际感兴趣的特性就变成了特征选择问题。

最常用的是两个方法:卡方检验(CHI)和信息增益(IG)。基本思想是:

  • 把物品的结构化内容看成文档。

  • 把用户对物品的行为看成是类别。

  • 每个用户看见过的物品就是一个文本集合。

  • 在这个文本集合上使用特征选择算法选出每个用户关心的东西。

CHI

CHI就是卡方检验,本身是一种特征选择方法。

前面的TF-IDF和TextRank都是无监督关键词提取算法,而CHI则是有监督的,需要提供分类标注信息。为什么需要呢?在文本分类任务中,挑选关键词就得为了分类任务服务,而不仅仅是挑选出一种直观上看着重要的词。卡方检验本质上在检验“词和某个类别C相互独立”这个假设是否成立,和这个假设偏离越大,就越说明这个词和类别C有关联,这个词当然就是关键词了。

计算一个词 Wi 和一个类别 Cj 的卡方值,需要统计四个值:

  • 类别为Cj的文本中出现词 Wi的文本数 A。

  • 词 Wi在非Cj的文本中出现的文本数 B 。

  • 类别为Cj的文本中没有出现Wi的文本数 C。

  • 词 Wi在非Cj的文本中没有出现的文本数 D。

听起来有点绕,我把它画成一个表格更加一目了然。

然后按照如下公式计算每一个词和每一个类别的卡方值:

关于这个卡方值计算说明几点:

  • 每个词和每个类别都要计算,只要对其中一个类别有帮助的词都应该留下。

  • 由于是比较卡方值的大小,所以公式中的N可以不参与计算,因为它对每个词都一样,是总的文本数。

  • 卡方值越大,意味着偏离“词和类别相互独立”的假设越远,靠“词和类别互相不独立”这个备择假设越近。

实现卡方算法时候,需要稍微对原公式做一定的变化,降低实现复杂度。观察表格中,有些统计量是不好统计的,比如“不属于类别 C_{j} 且不包含 W_{i}”这个统计量。我们借助另外的统计量来计算卡方值,目的是对语料库一次遍历就得到每个标签的卡方值。

只需要统计这几个量:

  • A:类别Cj中包含词Wi的数量;

  • M: 类别Cj的语料数量,也就是A+C的值;

  • Q:包含词Wi的语料数量,也就是A+B;

  • N:全部语料数量

于是原公式中的B,C,D分别就是:

  • B = Q - A

  • C = M - A

  • D = N + A - Q - M

每个标签与每个类别的卡方值计算方式为:

python实现如下:

IG(信息增益)

IG即Information Gain,信息增益,是一种有监督的关键词选择方法,需要有标注信息。要理解信息增益,理解了信息熵就差不多了。

如何理解信息熵?我们还是以上述表格示例说明。一批文本被标注了类别,那么任意挑出一条文本问你,“猜猜这是什么类别?”如果原来每个类别的文本数量都一样,那肯定最不好猜,如果其中一个类别的文本C数远远多于其他类别,那么你猜这条文本属于类别C就很可能猜对。这两个情况区别就在于信息熵不同:

  • 各个类别的文本数量差不多时,信息熵就比较大。

  • 其中少数类别的文本数量明显较多时,信息熵就较小。

再进一步想一件事,如果从这一堆文本中再挑出包含有词W的文本,再来猜任意一条文本的类别时,仍然会有上面两种情况。这时候考虑一个情况:如果在整个文本上的情况属于情况1,但挑出包含词W后变成情况2了,那么你自然会想:这个词W是不是非常有用?因为,有了它我们就能以较高的成功率猜对任意一条文本的类别了。

对,上面这个思考过程就是信息增益的思想,信息增益计算分为一下三步:

1. 统计全局文本的信息熵,通常是按照类别的分布计算,计算公式为:

其中,p(C_i) 是类别在语料库中的概率

2. 统计每个词的条件熵,就是知道了一个词后再统计文本的信息熵,只不过这里要分别计算包含词和不包含词两部分的信息熵,再按照各自文本比例加权平均,计算公式为:

计算待评估标签在整个语料库上的概率 p(tag),以及在出现标签的语料库子集中的熵和在不出现标签的语料库子集的熵,最后按照概率加权平均。

3. 两者相减就是每个词的信息增益。即:

信息增益应用最广就是数据挖掘中的决策树分类算法,经典的决策树分类算法挑选分裂节点时就是计算各个属性的信息增益,始终挑选信息增益最大的节点作为分裂节点。

卡方检验和信息增益不同之处在于:前者是针对每一个分类单独筛选一套标签出来,后者是则是全局统一筛选。

这些方法都是在离线阶段批量完成的,把用户的画像生成配置成离线任务,每天更新一遍,次日就可以使用新的用户画像。对于一个新用户,能不能在他刚刚进入产品时就快速生成一个简单的画像呢?答案是:当然可以。后面的文章中会讲到这个MAB问题。

信息增益用Python实现如下:

还有一句

两个标签选择方法,实现简单,原理清晰,居家旅行必备,你值得一试,或者加入我们团队一起试试其他方法,我们在折腾的事情有:对话系统,智能客服,知识图谱,语义理解,信息流,搜索排序……凡所应有,无所不有。

简历发送至:sunlin01@ke.com或chenkaijiang001@ke.com。


本文地址:https://www.6aiq.com/article/1552148186102
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出