构建企业级推荐系统:算法、工程实现与案例分析
上QQ阅读APP看书,第一时间看更新

3.2.3 构建标的物特征表示

对于标的物的特征,一般可以利用显式的标签来表示,也可以利用隐式的向量(当然one-hot编码也是向量表示,但是不是隐式的)来刻画,向量的每个维度就是一个隐式的特征项。前面提到某些推荐算法需要计算标的物之间的相似度,下面在讲标的物的各种特征表示时,也会简单介绍一下标的物之间的相似度计算方法。顺便说一下,实现标的物关联标的物的推荐范式也需要知道标的物之间的相似度。下面从4个方面来详细讲解怎么样构建标的物的特征表示。

1.标的物包含标签信息

最简单的方式是将标签按照某种序排列,每个标签看成一个维度,那么每个标的物就可以表示成一个N维的向量了(N是标签的个数),如果标的物包含某个标签,向量在相应标签的分量上的值为1,否则为0,即所谓的one-hot编码。N有可能非常大(如在视频行业,N可能是几万甚至几十万、上百万),这时向量是稀疏向量(一般标的物只有少量的几个或者几十个标签),我们可以采用稀疏向量的表示来优化向量存储和计算,提升效率。有了标的物基于标签的向量化表示,很容易基于余弦计算相似度。

实际上,标签不是这么简单的,有很多业务标签是分级的,比如电商(如淘宝),有多级的标签(如图3-3所示),标签的层级关系形成了一个树状结构,这时该怎么向量化呢?最简单的方案是只考虑叶子节点的标签(也是最低层级的标签),然后基于叶子节点标签构建向量表示。更复杂的方法是基于层级结构构建标签表示及计算标的物相似度。

图3-3 标签的层级表示关系

标签可以是通过算法获取的,比如通过自然语言处理(Natural Language Processing,NLP)技术从文本信息中提取关键词作为标签。对于图片/视频,可以从它们的描述信息(标题等)提取标签,另外可以通过目标检测的方法从图片/视频中提取相关对象构建标签。

标签可以是由用户打上的,比如,在与标的物(产品)交互时,用户可以为标的物打上标签,这些标签就是标的物的一种刻画。标签也可是人工标注的,像Netflix在做推荐时,请了上万位专家对视频从上千个维度来打标签,让标签具备非常高的质量。基于这么精细优质的标签做推荐,效果一定不错。很多行业的标的物来源于第三方提供商,他们在入驻平台时会被要求按照某些规范填写相关标签信息(典型的如电商行业)。

2.标的物具备结构化信息

有些行业标的物是具备结构化信息的,比如在视频行业,一般会有媒资库,媒资库中针对每个节目会有标题、演职员、导演、标签、评分、地域、语言等维度数据,这类数据一般存放在关系型数据库中。对于这类数据,我们可以将每一个字段(也是一个特征)作为向量的一个维度,这时的向量化表示中每个维度的值不一定是数值,但是形式还是向量化的形式,即所谓的向量空间模型(Vector Space Model,VSM)。可以通过如下方式计算两个标的物之间的相似度。

假设两个标的物的向量表示分别为

V1=(p1,p2,p3,…,pk),V2=(q1,q2,q3,…,qk)

这时这两个标的物的相似性可以表示为

其中sim(pt,qt)代表的是向量的两个分量pt、qt之间的相似度。可以采用Jacard相似度等方法计算两个分量之间的相似度。上面公式中还可以针对不同的分量采用不同的权重策略,见下面的公式:

其中wt是第t个分量(特征)的权重,具体权重的数值可以根据对业务的理解来人工设置,或者利用机器学习算法来训练学习得到。

第27章会介绍电视猫基于该方法实现视频相似度的一个技术方案,读者可以参考该章,了解更进一步的实现方案细节。

3.包含文本信息的标的物的特征表示

今日头条和手机百度APP这类新闻资讯或者搜索类APP,标的物就是一篇篇的文章(其中会包含图片或者视频),文本信息是最重要的信息载体,构建标的物之间的相似性有很多种方法。下面对常用的方法做一些讲解说明。

(1)利用TF-IDF将文本信息转化为特征向量

TF-IDF通过将所有文档(即标的物)分词,获得所有不同词的集合(假设有M个词),那么就可以为每个文档构建一个M维(每个词就是一个维度)的向量,而该向量中的某个词所在维度的值可以通过统计这个词在文档中的重要性来衡量,这个重要性的度量就是TF-IDF。下面来详细说明TF-IDF是怎么计算的。

TF即某个词在某篇文档中出现的频次,用于衡量这个词在文档中的重要性,出现次数越多的词重要性越大,当然,我们会提前将“的”“地”“啊”等停用词去掉,这些词对构建向量是没有任何实际价值的,甚至是有害的。TF的计算公式如下:

其中,tk是第k个词,dj是第j个文档,公式中分子是tk在dj中出现的次数,分母是dj中词的总个数。

IDF代表的是某个词在所有文档中的“区分度”,如果某个词只在少量文档中出现,那么它包含的价值就是巨大的(所谓物以稀为贵),如果某个词在很多文档中出现,那么它就不能很好地衡量(区分出)这个文档。下面是IDF的计算公式:

其中,N是所有文档的个数,nk是包含词tk的文档个数,这个公式刚好跟前面的描述是一致的,即稀有的词区分度大。

了解了TF和IDF的定义,那么什么是TF-IDF?实际上它就是上面两个量的乘积:

有了基于TF-IDF计算的标的物的向量表示,我们就很容易计算两个标的物之间的相似度了(余弦相似度)。

(2)利用LDA算法构建文章(标的物)的主题模型

LDA算法是一类文档主题生成模型,包含词、主题、文档三层结构,是一个三层的贝叶斯概率模型。对于语料库中的每篇文档,LDA定义了如下生成过程(generative process):

1)对每一篇文档,从主题分布中抽取一个主题。

2)从上述被抽到的主题所对应的单词分布中抽取一个单词。

3)重复上述过程,直至遍历文档中的每一个单词。

我们通过对所有文档进行LDA训练,就可以构建每篇文档的主题分布,从而构建一个基于主题的向量(每个主题就是向量的一个分量,而分量的值就是该主题的概率值),这样我们就可以利用该向量来计算两篇文档的相似度了。主题模型可以理解为一个降维过程,将文档的词向量表示降维成主题的向量表示(主题的个数是远远小于词的个数的,所以是降维)。想详细了解LDA的读者可以看本章参考文献[1][2]

(3)利用Doc2vec算法构建文本相似度

Doc2vec或者叫作paragraph2vec、sentence embeddings,是一种非监督式算法,可以获得句子、段落、文章的稠密向量表达,它是Word2vec的拓展,于2014年由Google的两位专家提出,并大量用于文本分类和情感分析。在通过Doc2vec学习句子、段落、文章的向量表示后,即可通过计算向量之间的相似度来表达句子、段落、文章之间的相似性。

Doc2vec受Word2vec启发,由它推广而来,所以在介绍Doc2vec的核心思想之前,先来简单解释一下Word2vec的思路。

Word2vec通过学习一个唯一的向量来表示每个词,每个词向量作为矩阵W中的一列(W是由所有词的词向量构成的矩阵),矩阵列可以通过词汇表为每个词做索引,排在索引第一位的放到矩阵W的第一列,排在索引第二位的放到矩阵W的第二列,以此类推。它会将学习问题转化为通过上下文词序列中的前几个词来预测下一个词。具体的模型框架如图3-4所示。

图3-4 Word2vec算法框架

注:图片来源于本章参考文献[5]

简单来说,给定一个待训练的词序列w1,w2,w3,…,wT,词向量模型通过极大化平均对数概率

将预测任务通过softmax变换,看成一个多分类问题:

上式中yi是词i归一化的对数概率,此对数概率可用下面的公式来计算

y=b+Uh(wt-k,…,wt+k;W)

其中,U、b是参数,h是通过词向量的拼接或者平均来构建的。

Word2vec算法随机初始化词向量,通过随机梯度下降法来训练神经网络模型,最终得到每个词的向量表示。

Doc2vec与Word2vec类似,将每个段落/文档表示为向量,作为矩阵D的一列,每个词也表示为一个向量,作为矩阵W中的一列。它会将学习问题转化为通过上下文词序列中的前几个词和段落/文档来预测下一个词。使用段落/文档和词向量通过拼接或者平均来预测句子的下一个词(图3-5是通过“the”“cat”“sat”及段落id来预测下一个词“on”的)。在训练的时候固定上下文的长度,用滑动窗口的方法产生训练集,段落向量/文档向量在上下文中共享。

图3-5 Doc2vec模型结构

注:图片来源于本章参考文献[5]

对算法原理感兴趣的读者可以看看本章参考文献[3][4][5]。在工程实现中,很多开源框架有Word2vec或者Doc2vec的实现,比如Gensim中就有很好的实现,笔者公司就用Gensim来做Word2vec嵌入,用于相似视频的推荐业务,效果非常不错,具体可以查看本章参考文献[8]来了解Gensim的实现方案。

4.图片、音频或者视频信息

如果标的物包含的是图片、音频或者视频信息,处理起来会更加复杂。一种方法是利用它们的文本信息(标题、评论、描述信息、利用图像技术提取的字幕等文本信息,对于音频,可以通过语音识别转化为文本),采用上面介绍的技术方案来获得向量化表示。对于图像或者视频,也可以利用OpenCV中的PSNR和SSIM算法来表示图像或视频特征,进而可以计算图像或视频之间的相似度。另外一种可行的方法是采用图像、音频处理技术直接从图像、视频、音频中提取特征进行向量化表示,从而也可以计算出相似度。总之,图片、视频、音频都可以转化为NLP问题或者图像处理问题(见图3-6),通过图像处理和NLP获得对应的特征表示,最终计算出相似度,这里不详细讲解。

图3-6 视频/图片问题都可以转化为NLP或图像处理问题