欢迎各位阅读本篇,关于人类行为与沟通程序的一套详细可行的模式。虽然它本身并非一套心理治疗法,NLP的重要法则可以被运用于了解人类经验和行为,和使之有所改变。本篇文章讲述了自然语言处理技术(NLP)的应用剖析。
个性化推荐是大数据时代不可或缺的技术,在电商、信息分发、计算广告、互联网金融等领域都起着重要的作用。具体来讲,个性化推荐在流量高效利用、信息高效分发、提升用户体验、长尾物品挖掘等方面均起着核心作用。在推荐系统中经常需要处理各种文本类数据,例如商品描述、新闻资讯、用户留言等等。具体来讲,我们需要使用文本数据完成以下任务:
候选商品召回。候选商品召回是推荐流程的第一步,用来生成待推荐的物品集合。这部分的核心操作是根据各种不同的推荐算法来获取到对应的物品集合。而文本类数据就是很重要的一类召回算法,具有不依赖用户行为、多样性丰富等优势,在文本信息丰富或者用户信息缺乏的场合中具有非常重要的作用。
相关性计算。相关性计算充斥着推荐系统流程的各个步骤,例如召回算法中的各种文本相似度算法以及用户画像计算时用到的一些相关性计算等。
作为特征参与模型排序(CTR/CVR)。在候选集召回之后的排序层,文本类特征常常可以提供很多的信息,从而成为重要的排序特征。
但是相比结构化信息(例如商品的属性等),文本信息在具体使用时具有一些先天缺点。
首先,文本数据中的结构信息量少。严格来说,文本数据通常是没有什么结构的,一般能够有的结构可能只是“”、“正文”、“评论”这样区分文本来源的结构,除此以外一般就没有更多的结构信息了。
为什么我们要在意结构信息呢?因为结构代表着信息量,无论是使用算法还是业务规则,都可以根据结构化信息来制定推荐策略,例如“召回所有颜色为蓝色的长款羽绒服”这样一个策略里就用到了“颜色”和“款式”这两个结构化信息。但是如果商品的描述数据库中没有这样的结构化信息,只有一句“该羽绒服为蓝色长款羽绒服”的自由文本,那么就无法利用结构信息制定策略了。
其次,文本内容的信息量不确定。与无结构化相伴随的,是文本数据在内容的不确定性,这种不确定性体现在内容和数量上,例如不同用户对同一件二手商品的描述可能差异非常大,具体可能在用词、描述、文本长短等方面都具有较大差异。同样的两个物品,在一个物品的描述中出现的内容在另外一个物品中并不一定会出现。这种差异性的存在使得文本数据往往难以作为一种稳定可靠的数据源来使用,尤其是在UGC化明显的场景下更是如此。
再次,自由文本中的歧义问题较多。歧义理解是自然语言处理中的重要研究课题,同时歧义也影响着我们在推荐系统中对文本数据的使用。例如用户在描述自己的二手手机时可能会写“出售iPhone6一部,打算凑钱买iPhone7”这样的话,这样一句对人来说意思很明确的话,却对机器造成了很大困扰:这个手机究竟是iPhone6还是iPhone7?在这样的背景下如何保证推荐系统的准确率便成为了一个挑战。
但是文本数据也不是一无是处,有缺点的同时也具有一些结构化数据所不具有的优点:
数据量大。无结构化的文本数据一般来说是非常容易获得的,例如各种UGC渠道,以及网络爬取等方法,都可穿获得大量文本数据。
多样性丰富。无结构化是一把双刃剑,不好的一面已经分析过,好的一面就是由于其开放性,导致具有丰富的多样性,会包含一些结构规定以外的数据。
信息及时。在一些新名词,新事物出现之后,微博、朋友圈常常是最先能够反应出变化的地方,而这些都是纯文本的数据,对这些数据的合理分析,能够最快得到结构化、预定义数据所无法得到的信息,这也是文本数据的优势。
综上所述,文本数据是一类量大、复杂、丰富的数据,对推荐系统起着重要的作用,本文将针对上面提到的几个方面,对推荐系统中常见的文本处理方法进行介绍。
从这里出发:词袋模型
词袋模型(Bag of Words,简称BOW模型)是最简单的文本处理方法,其核心假设非常简单,就是认为一篇文档是由文档中的词组成的多重集合(多重集合与普通集合的不同在于考虑了集合中元素的出现次数)构成的。这是一种最简单的假设,没有考虑文档中诸如语法、词序等其他重要因素,只考虑了词的出现次数。这样简单的假设显然丢掉了很多信息,但是带来的好处是使用和计算都比较简单,同时也具有较大的灵活性。
在推荐系统中,如果将一个物品看作一个词袋,我们可以根据袋中的词来召回相关物品,例如用户浏览了一个包含“羽绒服”关键词的商品,我们可以召回包含“羽绒服”的其他商品作为该次推荐的候选商品,并且可以根据这个词在词袋中出现的次数(词频)对召回商品进行排序。
这种简单的做法显然存在着很多问题:
首先,将文本进行分词后得到的词里面,并不是每个词都可以用来做召回和排序,例如“的地得你我他”这样的“停用词”就该去掉,此外,一些出现频率特别高或者特别低的词也需要做特殊处理,否则会导致召回结果相关性低或召回结果过少等问题。
其次,使用词频来度量重要性也显得合理性不足。以上面的“羽绒服”召回为例,如果在羽绒服的类别里使用“羽绒服”这个词在商品描述中的出现频率来衡量商品的相关性,会导致所有的羽绒服都具有类似的相关性,因为在描述中大家都会使用类似数量的该词汇。所以我们需要一种更为科学合理的方法来度量文本之间的相关性。
除了上面的用法,我们还可以将词袋中的每个词作为一维特征加入到排序模型中。例如,在一个以LR为模型的CTR排序模型中,如果这一维特征的权重为w,则可解释为“包含这个词的样本相比不包含这个词的样本在点击率的log odds上要高出w”。在排序模型中使用词特征的时候,为了增强特征的区分能力,我们常常会使用简单词袋模型的一种升级版——N-gram词袋模型。
N-gram指的就是把N个连续的词作为一个单位进行处理,例如:“John likes to watch movies.Mary likes movies too.”这句话处理为简单词袋模型后的结果为:
而处理为bigram(2-gram)后的结果为:
做这样的处理有什么好处呢?如果将bigram作为排序模型的特征或者相似度计算的特征,最明显的好处就是增强了特征的区分能力,简单来讲就是:两个有N个bigram重合的物品,其相关性要大于有N个词重合的物品。
从根本上来讲,是因为bigram的重合几率要低于1-gram(也就是普通词)的重合几率。那么是不是N-gram中的N越大就越好呢?N的增大虽然增强了特征的区分能力,但是同时也加大了数据的稀疏性,从极端情况来讲,假设N取到100,那么几乎不会有两个文档有重合的100-gram了,那这样的特征也就失去了意义。
一般在实际应用中,bigram和trigram(3-gram)能够在区分性和稀疏性之间取到比较好的平衡,N如果继续增大,稀疏性会有明显增加,但是效果却不会有明显提升,甚至还会有降低。
综合来看,虽然词袋模型存在着明显的弊端,但是只需要对文本做简单处理就可以使用,所以不失为一种对文本数据进行快速处理的使用方法,并且在预处理(常用的预处理包括停用词的去除,高频/低频词的去除或降权等重要性处理方法,也可以借助外部高质量数据对自由文本数据进行过滤和限定,以求获得质量更高的原始数据)充分的情况下,也常常能够得到很好的效果。
统一度量衡:权重计算和向量空间模型
从上文我们看到简单的词袋模型在经过适当预处理之后,可以用来在推荐系统中召回候选物品。但是在计算物品和关键词的相关性,以及物品之间的相关性时,仅仅使用简单的词频作为排序因素显然是不合理的。为了解决这个问题,我们可以引入表达能力更强的基于TF-IDF的权重计算方法。在TF-IDF方法中,一个词t在文档d中权重的计算方法为:
其中tft,d代表t在d中出现的频次,而dft指的是包含t的文档数目,N代表全部文档的数目。
TF-IDF以及其各种改进和变种(关于TF-IDF变种和改进的详细介绍,相比简单的TF方法,核心改进在于对一个词的重要性度量,例如:
原始TF-IDF在TF的基础上加入了对IDF的考虑,从而降低了出现频率高而导致无区分能力的词的重要性,典型的如停用词。
因为词在文档中的重要性和出现次数并不是完全线性相关,非线性TF缩放对TF进行log缩放,从而降低出现频率特别高的词所占的权重。
词在文档中出现的频率除了和重要性相关,还可能和文档的长短相关,为了消除这种差异,可以使用最大TF对所有的TF进行归一化。
这些方法的目的都是使对词在文档中重要性的度量更加合理,在此基础之上,我们可以对基于词频的方法进行改进,例如,可以将之前使用词频来对物品进行排序的方法,改进为根据TF-IDF得分来进行排序。
但是除此以外,我们还需要一套统一的方法来度量关键词和文档,以及文档和文档之间的相关性,这套方法就是向量空间模型(Vector Space Model,简称VSM)。
VSM的核心思想是将一篇文档表达为一个向量,向量的每一维可以代表一个词,在此基础上,可以使用向量运算的方法对文档间相似度进行统一计算,而这其中最为核心的计算,就是向量的余弦相似度计算:
其中V(d1)和V(d2)分别为两个文档的向量表示。这样一个看似简单的计算公式其实有着非常重要的意义。首先,它给出了一种相关性计算的通用思路,那就是只要能将两个物品用向量进行表示,就可以使用该公式进行相关性计算。
其次,它对向量的具体表示内容没有任何限制——基于用户行为的协同过滤使用的也是同样的计算公式,而在文本相关性计算方面,我们可以使用TFIDF填充向量,同时也可以用N-gram,以及后面会介绍的文本主题的概率分布、各种词向量等其他表示形式。只要对该公式的内涵有了深刻理解,就可以根据需求构造合理的向量表示。
再次,该公式具有较强的可解释性,它将整体的相关性拆解为多个分量的相关性的叠加,并且这个叠加方式可以通过公式进行调节,这样一套方法很容易解释,即使对非技术人员,也是比较容易理解的,这对于和产品、运营等非技术人员解释算法思路有很重要的意义。最后,这个公式在实际计算中可以进行一些很高效的工程优化,使其能够从容应对大数据环境下的海量数据,这一点是其他相关性计算方法很难匹敌的。
VSM是一种“重剑无锋,大巧不工”的方法,形态简单而又变化多端,领会其精髓之后,可以发挥出极大的能量。
透过现象看本质:隐语义模型
前面介绍了文本数据的一些“显式”使用方法,所谓显式,是指我们将可读可理解的文本本身作为了相关性计算、物品召回以及模型排序的特征。这样做的好处是简单直观,能够清晰地看到起作用的是什么,但是其弊端是无法捕捉到隐藏在文本表面之下的深层次信息。
例如,“羽绒服”和“棉衣”指的是类似的东西,“羽绒服”和“棉鞋”具有很强的相关性,类似这样的深层次信息,是显式的文本处理所无法捕捉的,因此我们需要一些更复杂的方法来捕捉,而隐语义模型(Latent Semantic Analysis,简称LSA)便是这类方法的鼻祖之一。
隐语义模型中的“隐”指的是隐含的主题,这个模型的核心假设,是认为虽然一个文档由很多的词组成,但是这些词背后的主题并不是很多。换句话说,词不过是由背后的主题产生的,这背后的主题才是更为核心的信息。这种从词下沉到主题的思路,贯穿着我们后面要介绍到的其他模型,也是各种不同文本主体模型(Topic Model)的共同中心思想,因此理解这种思路非常的重要。
在对文档做LSA分解之前,我们需要构造文档和词之间的关系,一个由5个文档和5个词组成的简单例子如下:
LSA的做法是将这个原始矩阵C进行如下形式的SVD分解:
其中U是矩阵CCT的正交特征向量矩阵,V是矩阵CTC的正交特征向量矩阵,∑k是包含前k个奇异值的对角矩阵,k是事先选定的一个降维参数。
得到原始数据的一个低维表示,降低后的维度包含了更多的信息,可以认为每个维度代表了一个主题。
降维后的每个维度包含了更丰富的信息,例如可以识别近义词和一词多义。
可以将不在训练文档中的文档d通过
变换为新向量空间内的一个向量(这样的变换无法捕捉到新文档中的信息,例如词的共现,以及新词的出现等等,所以该模型需要定期进行全量训练。),从而可以在降维后的空间里计算文档间相似度。由于新的向量空间包含了同义词等更深层的信息,这样的变换会提高相似度计算的准确率和召回率。
为什么LSA能具有这样的能力?我们可以从这样一个角度来看待:CCT中每个元素CCTi,j代表同时包含词i和词j的文档数量,而CTC中每个元素CTCi,j代表文档i和文档j共享的词的数量。所以这两个矩阵中包含了不同词的共同出现情况,以及文档对词的共享情况,通过分解这些信息得到了类似主题一样比关键词信息量更高的低维度数据。
从另外一个角度来看,LSA相当于是对文档进行了一次软聚类,降维后的每个维度可看做是一个类,而文档在这个维度上的取值则代表了文档对于这个聚类的归属程度。
LSA处理之后的数据推荐中能做什么用呢?首先,我们可以将分解后的新维度(主题维度)作为索引的单位对物品进行索引,来替代传统的以词为单位的索引,再将用户对物品的行为映射为对新维度的行为。这两个数据准备好之后,就可以使用新的数据维度对候选商品进行召回,召回之后可以使用VSM进行相似度计算,如前文所述,降维后的计算会带来更高的准确率和召回率,同时也能够减少噪音词的干扰,典型的,即使两个文档没有任何共享的词,它们之间仍然会存在相关性,而这正是LSA带来的核心优势之一。此外,还可以将其作为排序模型的排序特征。
简单来讲,我们能在普通关键词上面使用的方法,在LSA上面仍然全部可用,因为LSA的本质就是对原始数据进行了语义的降维,只需将其看作是信息量更丰富的关键词即可。
可以看到LSA相比关键词来说前进了一大步,主要体现在信息量的提升,维度的降低,以及对近义词和多义词的理解。但是LSA同时也具有一些缺点,例如:
训练复杂度高。LSA的训练时通过SVD进行的,而SVD本身的复杂度是很高的,在海量文档和海量词汇的场景下难以计算,虽然有一些优化方法可降低计算的复杂度,但该问题仍然没有得到根本解决。
检索(召回)复杂度高。如上文所述,使用LSA做召回需要先将文档或者查询关键词映射到LSA的向量空间中,这显然也是一个耗时的操作。
LSA中每个主题下词的值没有概率含义,甚至可能出现负值,只能反应数值大小关系。这让我们难以从概率角度来解释和理解主题和词的关系,从而限制了我们对其结果更丰富的使用。
概率的魔力:概率隐语义模型
为了进一步发扬隐语义模型的威力,并尽力克服LSA模型的问题,Thomas Hofmann在1999年提出了概率隐语义模型(probabilistic Latent Semantic Analysis,简称pLSA)。
从前面LSA的介绍可以看出,虽然具体的优化方法使用的是矩阵分解,但是从另一个角度来讲,我们可以认为分解后的U和V两个矩阵中的向量,分别代表文档和词在隐语义空间中的表示,例如一个文档的隐向量表示为(1,2,0)T, 代表其在第一维隐向量上取值为1,第二维上取值为2,第三维上取值为0。
如果这些取值能够构成一个概率分布,那么不仅模型的结果更利于理解,同时还会带来很多优良的性质,这正是pLSA思想的核心:将文档和词的关系看作概率分布,然后试图找出这个概率分布来,有了文档和词的概率分布,我们就可以得到一切我们想要得到的东西了。
在pLSA的基本假设中,文档d和词w的生成过程如下:
以 P(d) 的概率选择文档d。
以 P(z|d) 的概率选择隐类z。
以 P(w|z) 的概率从z生成w。
P(z|d)和P(w|z) 均为多项式分布。
将这个过程用联合概率进行表达得到:
图1 pLSA的生成过程
可以看到,我们将隐变量z作为中间桥梁,将文档和词连接了起来,形成了一个定义良好、环环相扣的概率生成链条(如图1所示)。虽然pLSA的核心是一种概率模型,但是同样可以用类似LSI的矩阵分解形式进行表达。为此,我们将LSI中等号右边的三个矩阵进行重新定义:
在这样的定义下,原始的矩阵C仍然可以表述为C=U∑VT。这样的对应关系让我们更加清晰地看到了前面提到的pLSA在概率方面的良好定义和清晰含义,同时也揭示了隐语义概率模型和矩阵分解之间的密切关系(关于概率模型和矩阵分解的密切关系。在这样的定义,隐变量z所代表的主题含义更加明显,也就是说,我们可以明确的把一个z看作一个主题,主题里的词和文档中的主题都有着明确的概率含义。也正是由于这样良好的性质,再加上优化方法的便捷性,使得从pLSA开始,文本主题开始在各种大数据应用中占据重要地位。
从矩阵的角度来看,LSA和pLSA看上去非常像,但是它们的内涵却有着本质的不同,这其中最为重要的一点就是两者的优化目标是完全不同的:LSA本质上是在优化SVD分解后的矩阵和原始矩阵之间的平方误差,而pLSA本质上是在优化似然函数,是一种标准的机器学习优化套路。也正是由于这一点本质的不同,导致了两者在优化结果和解释能力方面的不同。
至此我们看到,pLSA将LSA的思想从概率分布的角度进行了一大步扩展,得到了一个性质更加优良的结果,但是pLSA仍然存在一些问题,主要包括:
由于pLSA为每个文档生成一组文档级参数,模型中参数的数量随着与文档数成正比,因此在文档数较多的情况下容易过拟合。
pLSA将每个文档d表示为一组主题的混合,然而具体的混合比例却没有对应的生成概率模型,换句话说,对于不在训练集中的新文档,pLSA无法给予一个很好的主题分布。简言之,pLSA并非完全的生成式模型。
而LDA的出现,就是为了解决这些问题。
概率的概率:生成式概率模型
为了解决上面提到的pLSA存在的问题,David Blei等人在2003年提出了一个新模型,名为“隐狄利克雷分配”(Latent Dirichlet Allocation,简称LDA),这个名字念起来颇为隐晦,而且从名字上似乎也看不出究竟是个什么模型,在这里我们试着做一种可能的解读:
Latent:这个词不用多说,是说这个模型仍然是个隐语义模型。
Dirichlet:这个词是在说该模型涉及到的主要概率分布式狄利克雷分布。
Allocation:这个词是在说这个模型的生成过程就是在使用狄利克雷分布不断地分配主题和词。
上面并非官方解释,但希望能对理解这个模型能起到一些帮助作用。
LDA的中心思想就是在pLSA外面又包了一层先验,使得文档中的主题分布和主题下的词分布都有了生成概率,从而解决了上面pLSA存在的“非生成式”的问题,顺便也减少了模型中的参数,从而解决了pLSA的另外一个问题。在LDA中为一篇文档di生成词的过程如下:
从泊松分布中抽样一个数字N作为文档的长度(这一步并非必须,也不影响后面的过程)。
从狄利克雷分布Dir(α)中抽样一个样本θi,代表该篇文档下主题的分布。
从狄利克雷分布Dir(β)中抽样一组样本Φk,代表每个主题下词的分布。
对于1到N的每个词wn:
从多项式分布Multinomial(θi) 中抽样一个主题ci,j。
从多项式分布Multinomial(Φi) 中抽样一个词wi,j。
图2 LDA的生成过程
忽略掉最开始选择文档长度的步骤,我们发现LDA的生成过程相比pLSA来讲,在文档到主题的分布和主题到词的分布上面都加了一层概率,使得这两者都加上了一层不确定性,从而能够很自然地容纳训练文档中没有出现过的文档和词,这使得LDA具有了比pLSA更好的概率性质。
LDA的应用
这部分我们介绍LDA在用作相似度计算和排序特征时需要注意的一些地方,然后介绍以LDA为代表的文本主题在推荐系统中更多不同角度的应用。
相似度计算
上面提到LSA可以直接套用到VSM中进行相似度计算,在LDA中也可以做类似的计算,具体方法是把文档的主题分布值向量化然后用余弦公式进行计算。但是把余弦相似度替换为KL divergence或Jensen–Shannon divergence效果更好,原因是LDA给出的主题分布是含义明确的概率值,用度量概率之间相似度的方法来进行度量更为合理。
排序特征
将物品的LDA主题作为排序模型的特征是一种很自然的使用方法,但并不是所有的主题都有用。物品上的主题分布一般有两种情况:
有少数主题(三个或更少)占据了比较大的概率,剩余的主题概率加起来比较小。
所有主题的概率值都差不多,都比较小。
在第一种情况下,只有前面几个概率比较大的主题是有用的,而在第二种情况下,基本上所有的主题都没有用。那么该如何识别这两种情况呢?
第一种方法,可以根据主题的概率值对主题做一个简单的K-Means聚类,K选为2,如果是第一种情况,那么两个类中的主题数量会相差较大——一个类中包含少量有用主题,另一个类包含其他无用主题;而第二种情况下主题数量则相差不大,可以用这种方法来识别主题的重要性。第二种方法,可以计算主题分布的信息熵,第一种情况对应的信息熵会比较小,而第二种情况会比较大,选取合适的阈值也可以区分这两种情况。
物品打标签&用户打标签
为物品计算出其对应的主题,以及主题下面对应的词分布之后,我们可以选取概率最大的几个主题,然后从这几个主题下选取概率最大的几个词,作为这个物品的标签。在此基础上,如果用户对该物品发生了行为,则可以将这些标签传播到用户身上。
这种方法打出的标签,具有非常直观的解释,在适当场景下可以充当推荐解释的理由。例如我们在做移动端个性化推送时,可供展示文案的空间非常小,可以通过上面的方式先为物品打上标签,然后再根据用户把标签传播到用户身上,在推送时将这些标签词同时作为召回源和推荐理由,让用户明白为什么给他做出这样的推荐。
主题&词的重要性度量
LDA训练生成的主题中,虽然都有着同等的位置,但是其重要性却是各不相同的,有的主题包含了重要的信息,有的则不然。
例如,一个主题可能包含“教育、读书、学校”等词,和这样主题相关的文档,一般来说是和教育相关的主题,那么这就是一个信息量高的主题;相反,有的主题可能会包含“第一册、第二册、第三册……”等词(如果在一个图书销售网站的所有图书上训练LDA,就有可能得到这样的主题,因为有很多套装图书都包含这样的信息),和这样主题相关的文档却有可能是任何主题,这样的主题就是信息量低的主题。
如何区分主题是否重要呢?从上面的例子中我们可以得到启发:重要的主题不会到处出现,只会出现在小部分与之相关的文档中,而不重要的主题则可能在各种文章中都出现。基于这样的思想,我们可以使用信息熵的方法来衡量一个主题中的信息量。通过对LDA输出信息做适当的变换,我们可以得到主题θi在不同文档中的概率分布,然后我们对这个概率分布计算其信息熵,通俗来讲信息熵衡量了一个概率分布中概率值分散程度,越分散熵越大,越集中熵越小。所以在我们的问题中,信息熵越小的主题,说明该主题所对应的文档越少,主题的重要性越高。
使用类似的方法,我们还可以计算词的重要性,在此不再赘述。
更多应用
除了上面提到的,LDA还有很多其他应用,甚至在文本领域以外的图像等领域也存在着广泛应用。LSA/pLSA/LDA这些主题模型的核心基础是词在文档中的共现,在此基础上才有了各种概率分布,把握住这个核心基础,就可以找到文本主体模型的更多应用。例如,协同过滤问题中,基础数据也是用户对物品的共同行为,这也构成了文本主题模型的基础,因此也可以使用LDA对用户对物品的行为进行建模,得到用户行为的主题,以及主题下对应的物品,然后进行物品/用户的推荐。
捕捉上下文信息:神经概率语言模型
以LDA为代表的文本主题模型通过对词的共现信息的分解处理,得到了很多有用的信息,但是pLSA/LDA有一个很重要的假设,那就是文档集合中的文档,以及一篇文档中的词在选定了主题分布的情况下都是相互独立,可交换的,换句话说,模型中没有考虑词的顺序以及词和词之间的关系,这种假设隐含了两个含义:
在生成词的过程中,之前生成的词对接下来生成的词是没有影响的。
两篇文档如果包含同样的词,但是词的出现顺序不同,那么在LDA看来他们是完全相同的。
这样的假设使得LDA会丢失一些重要的信息,而近年来得到关注越来越多的以word2vec为代表的神经概率语言模型恰好在这方面和LDA形成了一定程度的互补关系,从而可以捕捉到LDA所无法捕捉到的信息。
word2vector的中心思想用一句话来讲就是:A word is characterized by the company it keeps(一个词的特征由它周围的词所决定)。
这是一句颇有哲理的话,很像是成语中的“物以类聚人以群分”。具体来讲,词向量模型使用“周围的词=>当前词”或“当前词=>周围的词”这样的方式构造训练样本,然后使用神经网络来训练模型,训练完成之后,输入词的输入向量表示便成为了该词的向量表示,如图3所示。
这样的训练方式,本质上是在说,如果两个词具有类似的上下文(上下文由周围的词组成),那么这两个词就会具有类似的向量表示。
有了词的向量表示之后,我们可以做很多事情,最常见的是将这一层向量表示作为更深层次模型的一个嵌入层。除了在深度学习中的使用以外,在推荐系统中还可以做很多其他的事情,其中之一就是做词的聚类,以及寻找相似词。
我们知道LDA天然就可以做到词的聚类和相似词的计算,那么使用word2vec计算出来的结果和LDA有什么不同呢?它们之间的不同具体体现在两点:第一是聚类的粒度不同,LDA关注的主题级别的粒度,层次更高,而词向量关注的是更低层次的语法语义级别的含义。
在LDA方法中很可能会被聚类在一个主题中,但是在词向量的角度来看,“苹果”和“小米”可能会具有更高的相似度,就像“乔布斯”和“雷军”在词向量下的关系一样,所以在词向量中可能会有:“vector(小米)- vector(苹果)+vector(乔布斯)= vector(雷军)”这样的结果。
除此以外,由于word2vec有着“根据上下文预测当前内容”的能力,将其做适当修改之后,还可以用来对用户行为喜好做出预测。
首先我们将用户的行为日志进行收集,进行session划分,得到类似文本语料的训练数据,在这个数据上训练word2vec模型,可以得到一个“根据上下文行为预测当前行为”的模型。但是原始的行为数据中行为的对象常常是id级的,例如商品、视频的id等等,如果直接放到模型中训练,会造成训练速度慢、泛化能力差等问题,因此需要对原始行为做降维,具体来说可以将行为映射到搜索词、LDA Topic、类别等等低维度特征上,然后再进行训练。
例如,我们可以对用户的搜索词训练一个word2vec模型,然后就可以根据用户的历史搜索行为预测他的下一步搜索行为,并在此基础上进行推荐。
这种方法考虑到了上下文,但是对前后关系并没有做最恰当的处理,因为word2vec的思想是“根据上下文预测当前内容”,但我们希望得到的模型是“根据历史行为预测下一步行为”,这两者之间有着微妙的差别。
例如用户的行为序列为“ABCDE”,每个字母代表对一个物品(或关键词)的行为,标准的word2vec算法可能会构造出下面这些样本:AC→B, BD→C, CE→D… 但是我们希望的形式其实是这样的:AB→C, BC→D,CD→E…因此,需要对word2vec生成样本的逻辑进行修改,使其只包含我们需要的单方向的样本,方可在最终模型中得到我们真正期望的结果。
下面是按照该方法生成的一些预测例子:
可以看出,预测搜索词都与历史搜索词有着紧密的关系,是对历史搜索词的延伸(例如学生书桌和烤肠机的例子)或者细化(例如小龟王和西铁城手表的例子),具有比较好的预测属性,是非常好的推荐策略来源。沿着这样的思路,我们还可以对word2vec作进一步修改,得到对时序关系更为敏感的模型,以及尝试使用RNN、LSTM等纯时序模型来得到更好的预测结果,但由于篇幅所限,在此不做展开。
行业应用现状
文本主题模型在被提出之后,由于其良好的概率性质,以及对文本数据有意义的聚类抽象能力,在互联网的各个行业中都取得了广泛的应用。搜索巨头Google在其系统的各个方面都在广泛使用文本主题模型,并为此开发了大规模文本主题系统Rephil。例如在为用户搜索产生广告的过程中,就使用了文本主题来计算网页内容和广告之间的匹配度,是其广告产品成功的重要因素之一。此外,在匹配用户搜索词和网页间关系的时候,文本主题也可用来提高匹配召回率和准确性。Yahoo!也在其搜索排序模型中大量使用了LDA主题特征,还为此开源了著名的Yahoo!LDA工具。
在国内,文本主题最著名的系统当属腾讯开发的Peacock系统,该系统可以捕捉百万级别的文本主题,在腾讯的广告分类、网页分类、精准广告定向、QQ群分类等重要业务上均起着重要的作用。该系统使用的HDP(Hierarchical Dirichlet Process)模型是LDA模型的一个扩展,可智能选择数据中主题的数量,还具有捕捉长尾主题的能力。除了腾讯以外,文本主题模型在各公司的推荐、搜索等业务中也已经在广泛使用,使用方法根据各自业务有所不同。
以word2vec为代表的神经网络模型近年来的使用也比较广泛,典型的应用如词的聚类、近义词的发现、quer y的扩展、推荐兴趣的扩展等。Facebook开发了一种word2vec的替代方案FastText,该方案在传统词向量的基础上,考虑子词(subword)的概念,取得了比word2vec更好的效果 。
总结和展望
我们从简单的文本关键词出发,沿着结构化、降维、聚类、概率、时序的思路,结合推荐系统中候选集召回、相关性计算、排序模型特征等具体应用,介绍了推荐系统中一些常用的自然语言处理技术和具体应用方法。自然语言处理技术借着深度学习的东风,近年来取得了长足的进步,而其与推荐系统的紧密关系,也意味着推荐系统在这方面仍然有着巨大的提升空间,让我们拭目以待。
分享:NLP
NLP的创立归功于两位美国人:理查德·班德勒(Richard Bandler) 和约翰·格林德(John Grinder)。
美国加州圣他,告鲁仕市的加州大学校园是NLP的发源地。班德勒在那里读大学,在一次偶然的机会里认识了家庭治疗 (Family Therapy) 大师维珍尼亚·萨提亚 (Virginia Satir)。稍后,班德勒受雇帮忙把维珍尼亚在加拿大之为期一个月的工作坊的内容制成录音带和文字记录。这份工作花了班德勒数个月的时间才能完成,过程中他学会了维珍尼亚在辅导过程中所运用的声调和行为模式。班德勒也参与完形疗法 (Gerstalt Therapy) 始创人费兹士·波尔士 (Fritz Perls) 的最后一批手稿的编辑工作,这批手稿成为了The Gerstalt Approach一书的内容。
另外一本关于费兹士教授他的技巧的书《Eye Witness to Therapy》,其实就是从费兹士教授时录下的录像带编辑而成。班德勒用了多个星期戴上耳筒去看这些录像带,因为他的工作是确保书中的文字记录正确无误。完事后,他也掌握了费兹士的说话和行为特色了。
掌握了这些能力,班德勒在加州大学的校舍内组织了多个完形疗法研究小组。格林德·格灵达,另一位NLP的始祖,当时在加州大学教授语言学,已经出版了几本关于语言学的书。
班德勒告诉格林德他注意到潜意识的意念和构词过程,想与格林德合作发展出一套沟通上的「文法」。他们首先用维珍尼亚的录像带做研究他俩很快就发现维珍尼亚的一些惯用的语言技巧,编成一些模式,这就是「检定语言模式」的前身。他俩也发现维珍尼亚对一些受导者用视觉型文字,一些受导者用听觉型文字,另外一些多用感觉型文字。维珍尼亚自己听到他俩这样说才知道自己工作的模式如此。
这些资料,在1976班德勒和格林德决定NLP这个名字,NLP于是诞生。两人成为了一群学生的中心,这群学生现今都是NLP世界中的顶级大师了,包括David Gordon,Judith DeLozier,Robert Dilts, Steve Gilligan等。NLP的学问开始发展和传播开去。
经过加利格力·卑臣(Greogory Bateson) 的介绍,班德勒和格林德去亚力桑拿洲凤凰城研究米尔顿·艾力逊Milton Erickson)的催眠疗法。班德勒和格林德运用他们已经掌握的学习方法,很快就成为催眠高手。米尔顿对NLP有很大的影响,在催眠治疗界是很有地位的学术书籍。
在1981年班德勒与格林德分手,成立了自己的NLP组织,推广他的DHE概念 (Designed Human Engineering)。他经常引发一些备具争议的事情,虽然他近似天才的才华和能力为人所公认
格林德与茱迪·弟罗斯亚 (Judith DeLozier) 成立了“Grinder,DeLozier and Associates”公司,继续教授NLP。他们在1987年出版了Turtles All The Way一书,是另一本NLP世界内的经典之作。在1989年格林德决定改变方向,转为专注于企业方面的顾问工作,中断了与茱迪的合作。茱迪继续她本来的方向,在1990年与罗伯特·迪尔茨(RobertDilts)及Todd Epstein (已逝)成立NLP University。每年夏天,他们都在加州大学圣他·告鲁仕市的校舍内举办各种的NLP课程,在一年的其它时间,她受邀请去世界各国主持各种NLP活动和教学。