博舍

自然语言处理技术(NLP)在推荐系统中的应用 自然语言处理的书推荐

自然语言处理技术(NLP)在推荐系统中的应用

作者: 张相於,58集团算法架构师,转转搜索推荐部负责人,负责搜索、推荐以及算法相关工作。多年来主要从事推荐系统以及机器学习,也做过计算广告、反作弊等相关工作,并热衷于探索大数据和机器学习技术在其他领域的应用实践。 责编:何永灿(heyc@csdn.net) 本文为《程序员》原创文章,更多精彩文章请订阅《程序员》

概述

个性化推荐是大数据时代不可或缺的技术,在电商、信息分发、计算广告、互联网金融等领域都起着重要的作用。具体来讲,个性化推荐在流量高效利用、信息高效分发、提升用户体验、长尾物品挖掘等方面均起着核心作用。在推荐系统中经常需要处理各种文本类数据,例如商品描述、新闻资讯、用户留言等等。具体来讲,我们需要使用文本数据完成以下任务:

候选商品召回。候选商品召回是推荐流程的第一步,用来生成待推荐的物品集合。这部分的核心操作是根据各种不同的推荐算法来获取到对应的物品集合。而文本类数据就是很重要的一类召回算法,具有不依赖用户行为、多样性丰富等优势,在文本信息丰富或者用户信息缺乏的场合中具有非常重要的作用。相关性计算。相关性计算充斥着推荐系统流程的各个步骤,例如召回算法中的各种文本相似度算法以及用户画像计算时用到的一些相关性计算等。作为特征参与模型排序(CTR/CVR)。在候选集召回之后的排序层,文本类特征常常可以提供很多的信息,从而成为重要的排序特征。

但是相比结构化信息(例如商品的属性等),文本信息在具体使用时具有一些先天缺点。

首先,文本数据中的结构信息量少。严格来说,文本数据通常是没有什么结构的,一般能够有的结构可能只是“标题”、“正文”、“评论”这样区分文本来源的结构,除此以外一般就没有更多的结构信息了。为什么我们要在意结构信息呢?因为结构代表着信息量,无论是使用算法还是业务规则,都可以根据结构化信息来制定推荐策略,例如“召回所有颜色为蓝色的长款羽绒服”这样一个策略里就用到了“颜色”和“款式”这两个结构化信息。但是如果商品的描述数据库中没有这样的结构化信息,只有一句“该羽绒服为蓝色长款羽绒服”的自由文本,那么就无法利用结构信息制定策略了。

其次,文本内容的信息量不确定。与无结构化相伴随的,是文本数据在内容的不确定性,这种不确定性体现在内容和数量上,例如不同用户对同一件二手商品的描述可能差异非常大,具体可能在用词、描述、文本长短等方面都具有较大差异。同样的两个物品,在一个物品的描述中出现的内容在另外一个物品中并不一定会出现。这种差异性的存在使得文本数据往往难以作为一种稳定可靠的数据源来使用,尤其是在UGC化明显的场景下更是如此。

再次,自由文本中的歧义问题较多。歧义理解是自然语言处理中的重要研究课题,同时歧义也影响着我们在推荐系统中对文本数据的使用。例如用户在描述自己的二手手机时可能会写“出售iPhone6一部,打算凑钱买iPhone7”这样的话,这样一句对人来说意思很明确的话,却对机器造成了很大困扰:这个手机究竟是iPhone6还是iPhone7?在这样的背景下如何保证推荐系统的准确率便成为了一个挑战。

但是文本数据也不是一无是处,有缺点的同时也具有一些结构化数据所不具有的优点:

数据量大。无结构化的文本数据一般来说是非常容易获得的,例如各种UGC渠道,以及网络爬取等方法,都可穿获得大量文本数据。多样性丰富。无结构化是一把双刃剑,不好的一面已经分析过,好的一面就是由于其开放性,导致具有丰富的多样性,会包含一些结构规定以外的数据。信息及时。在一些新名词,新事物出现之后,微博、朋友圈常常是最先能够反应出变化的地方,而这些都是纯文本的数据,对这些数据的合理分析,能够最快得到结构化、预定义数据所无法得到的信息,这也是文本数据的优势。

综上所述,文本数据是一类量大、复杂、丰富的数据,对推荐系统起着重要的作用,本文将针对上面提到的几个方面,对推荐系统中常见的文本处理方法进行介绍。

从这里出发:词袋模型

词袋模型(BagofWords,简称BOW模型)是最简单的文本处理方法,其核心假设非常简单,就是认为一篇文档是由文档中的词组成的多重集合(多重集合与普通集合的不同在于考虑了集合中元素的出现次数)构成的。这是一种最简单的假设,没有考虑文档中诸如语法、词序等其他重要因素,只考虑了词的出现次数。这样简单的假设显然丢掉了很多信息,但是带来的好处是使用和计算都比较简单,同时也具有较大的灵活性。

在推荐系统中,如果将一个物品看作一个词袋,我们可以根据袋中的词来召回相关物品,例如用户浏览了一个包含“羽绒服”关键词的商品,我们可以召回包含“羽绒服”的其他商品作为该次推荐的候选商品,并且可以根据这个词在词袋中出现的次数(词频)对召回商品进行排序。

这种简单的做法显然存在着很多问题:

首先,将文本进行分词后得到的词里面,并不是每个词都可以用来做召回和排序,例如“的地得你我他”这样的“停用词”就该去掉,此外,一些出现频率特别高或者特别低的词也需要做特殊处理,否则会导致召回结果相关性低或召回结果过少等问题。

其次,使用词频来度量重要性也显得合理性不足。以上面的“羽绒服”召回为例,如果在羽绒服的类别里使用“羽绒服”这个词在商品描述中的出现频率来衡量商品的相关性,会导致所有的羽绒服都具有类似的相关性,因为在描述中大家都会使用类似数量的该词汇。所以我们需要一种更为科学合理的方法来度量文本之间的相关性。

除了上面的用法,我们还可以将词袋中的每个词作为一维特征加入到排序模型中。例如,在一个以LR为模型的CTR排序模型中,如果这一维特征的权重为w,则可解释为“包含这个词的样本相比不包含这个词的样本在点击率的logodds上要高出w”。在排序模型中使用词特征的时候,为了增强特征的区分能力,我们常常会使用简单词袋模型的一种升级版——N-gram词袋模型。

N-gram指的就是把N个连续的词作为一个单位进行处理,例如:“Johnlikestowatchmovies.Marylikesmoviestoo.”这句话处理为简单词袋模型后的结果为:

["John":1,"likes":2,"to":1,"watch":1,"movies":2,"Mary":1,"too":1]

而处理为bigram(2-gram)后的结果为:

["Johnlikes":1,"likesto":1,"towatch":1,"watchmovies":1,"Marylikes":1,"likesmovies":1,"moviestoo":1]

做这样的处理有什么好处呢?如果将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变种和改进的详细介绍,可参考《IntroductiontoInformationRetrieval》的第六章。)相比简单的TF方法,核心改进在于对一个词的重要性度量,例如:

原始TF-IDF在TF的基础上加入了对IDF的考虑,从而降低了出现频率高而导致无区分能力的词的重要性,典型的如停用词。因为词在文档中的重要性和出现次数并不是完全线性相关,非线性TF缩放对TF进行log缩放,从而降低出现频率特别高的词所占的权重。词在文档中出现的频率除了和重要性相关,还可能和文档的长短相关,为了消除这种差异,可以使用最大TF对所有的TF进行归一化。

这些方法的目的都是使对词在文档中重要性的度量更加合理,在此基础之上,我们可以对基于词频的方法进行改进,例如,可以将之前使用词频来对物品进行排序的方法,改进为根据TF-IDF得分来进行排序。

但是除此以外,我们还需要一套统一的方法来度量关键词和文档,以及文档和文档之间的相关性,这套方法就是向量空间模型(VectorSpaceModel,简称VSM)。

VSM的核心思想是将一篇文档表达为一个向量,向量的每一维可以代表一个词,在此基础上,可以使用向量运算的方法对文档间相似度进行统一计算,而这其中最为核心的计算,就是向量的余弦相似度计算:

其中V(d1)和V(d2)分别为两个文档的向量表示。这样一个看似简单的计算公式其实有着非常重要的意义。首先,它给出了一种相关性计算的通用思路,那就是只要能将两个物品用向量进行表示,就可以使用该公式进行相关性计算。其次,它对向量的具体表示内容没有任何限制——基于用户行为的协同过滤使用的也是同样的计算公式,而在文本相关性计算方面,我们可以使用TFIDF填充向量,同时也可以用N-gram,以及后面会介绍的文本主题的概率分布、各种词向量等其他表示形式。只要对该公式的内涵有了深刻理解,就可以根据需求构造合理的向量表示。再次,该公式具有较强的可解释性,它将整体的相关性拆解为多个分量的相关性的叠加,并且这个叠加方式可以通过公式进行调节,这样一套方法很容易解释,即使对非技术人员,也是比较容易理解的,这对于和产品、运营等非技术人员解释算法思路有很重要的意义。最后,这个公式在实际计算中可以进行一些很高效的工程优化,使其能够从容应对大数据环境下的海量数据,这一点是其他相关性计算方法很难匹敌的。

VSM是一种“重剑无锋,大巧不工”的方法,形态简单而又变化多端,领会其精髓之后,可以发挥出极大的能量。

透过现象看本质:隐语义模型

前面介绍了文本数据的一些“显式”使用方法,所谓显式,是指我们将可读可理解的文本本身作为了相关性计算、物品召回以及模型排序的特征。这样做的好处是简单直观,能够清晰地看到起作用的是什么,但是其弊端是无法捕捉到隐藏在文本表面之下的深层次信息。例如,“羽绒服”和“棉衣”指的是类似的东西,“羽绒服”和“棉鞋”具有很强的相关性,类似这样的深层次信息,是显式的文本处理所无法捕捉的,因此我们需要一些更复杂的方法来捕捉,而隐语义模型(LatentSemanticAnalysis,简称LSA)便是这类方法的鼻祖之一。

隐语义模型中的“隐”指的是隐含的主题,这个模型的核心假设,是认为虽然一个文档由很多的词组成,但是这些词背后的主题并不是很多。换句话说,词不过是由背后的主题产生的,这背后的主题才是更为核心的信息。这种从词下沉到主题的思路,贯穿着我们后面要介绍到的其他模型,也是各种不同文本主体模型(TopicModel)的共同中心思想,因此理解这种思路非常的重要。

在对文档做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模型的问题,ThomasHofmann在1999年提出了概率隐语义模型(probabilisticLatentSemanticAnalysis,简称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)均为多项式分布。

将这个过程用联合概率进行表达得到:

图1pLSA的生成过程

可以看到,我们将隐变量z作为中间桥梁,将文档和词连接了起来,形成了一个定义良好、环环相扣的概率生成链条(如图1所示)。虽然pLSA的核心是一种概率模型,但是同样可以用类似LSI的矩阵分解形式进行表达。为此,我们将LSI中等号右边的三个矩阵进行重新定义:

在这样的定义下,原始的矩阵C仍然可以表述为C=U∑VT。这样的对应关系让我们更加清晰地看到了前面提到的pLSA在概率方面的良好定义和清晰含义,同时也揭示了隐语义概率模型和矩阵分解之间的密切关系(关于概率模型和矩阵分解的密切关系可参考这篇文档:http://www.cs.cmu.edu/~epxing/Class/10708-15/slides/LDA_SC.pdf)。在这样的定义,隐变量z所代表的主题含义更加明显,也就是说,我们可以明确的把一个z看作一个主题,主题里的词和文档中的主题都有着明确的概率含义。也正是由于这样良好的性质,再加上优化方法的便捷性,使得从pLSA开始,文本主题开始在各种大数据应用中占据重要地位。

从矩阵的角度来看,LSA和pLSA看上去非常像,但是它们的内涵却有着本质的不同,这其中最为重要的一点就是两者的优化目标是完全不同的:LSA本质上是在优化SVD分解后的矩阵和原始矩阵之间的平方误差,而pLSA本质上是在优化似然函数,是一种标准的机器学习优化套路。也正是由于这一点本质的不同,导致了两者在优化结果和解释能力方面的不同。

至此我们看到,pLSA将LSA的思想从概率分布的角度进行了一大步扩展,得到了一个性质更加优良的结果,但是pLSA仍然存在一些问题,主要包括:

由于pLSA为每个文档生成一组文档级参数,模型中参数的数量随着与文档数成正比,因此在文档数较多的情况下容易过拟合。pLSA将每个文档d表示为一组主题的混合,然而具体的混合比例却没有对应的生成概率模型,换句话说,对于不在训练集中的新文档,pLSA无法给予一个很好的主题分布。简言之,pLSA并非完全的生成式模型。

而LDA的出现,就是为了解决这些问题。

概率的概率:生成式概率模型

为了解决上面提到的pLSA存在的问题,DavidBlei等人在2003年提出了一个新模型,名为“隐狄利克雷分配”(LatentDirichletAllocation,简称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。

图2LDA的生成过程

忽略掉最开始选择文档长度的步骤,我们发现LDA的生成过程相比pLSA来讲,在文档到主题的分布和主题到词的分布上面都加了一层概率,使得这两者都加上了一层不确定性,从而能够很自然地容纳训练文档中没有出现过的文档和词,这使得LDA具有了比pLSA更好的概率性质。

LDA的应用

这部分我们介绍LDA在用作相似度计算和排序特征时需要注意的一些地方,然后介绍以LDA为代表的文本主题在推荐系统中更多不同角度的应用。

相似度计算

上面提到LSA可以直接套用到VSM中进行相似度计算,在LDA中也可以做类似的计算,具体方法是把文档的主题分布值向量化然后用余弦公式进行计算。但是把余弦相似度替换为KLdivergence或Jensen–Shannondivergence效果更好,原因是LDA给出的主题分布是含义明确的概率值,用度量概率之间相似度的方法来进行度量更为合理。

排序特征

将物品的LDA主题作为排序模型的特征是一种很自然的使用方法,但并不是所有的主题都有用。物品上的主题分布一般有两种情况:

有少数主题(三个或更少)占据了比较大的概率,剩余的主题概率加起来比较小。所有主题的概率值都差不多,都比较小。

在第一种情况下,只有前面几个概率比较大的主题是有用的,而在第二种情况下,基本上所有的主题都没有用。那么该如何识别这两种情况呢?第一种方法,可以根据主题的概率值对主题做一个简单的K-Means聚类,K选为2,如果是第一种情况,那么两个类中的主题数量会相差较大——一个类中包含少量有用主题,另一个类包含其他无用主题;而第二种情况下主题数量则相差不大,可以用这种方法来识别主题的重要性。第二种方法,可以计算主题分布的信息熵,第一种情况对应的信息熵会比较小,而第二种情况会比较大,选取合适的阈值也可以区分这两种情况。

物品打标签&用户打标签

为物品计算出其对应的主题,以及主题下面对应的词分布之后,我们可以选取概率最大的几个主题,然后从这几个主题下选取概率最大的几个词,作为这个物品的标签。在此基础上,如果用户对该物品发生了行为,则可以将这些标签传播到用户身上。

这种方法打出的标签,具有非常直观的解释,在适当场景下可以充当推荐解释的理由。例如我们在做移动端个性化推送时,可供展示文案的空间非常小,可以通过上面的方式先为物品打上标签,然后再根据用户把标签传播到用户身上,在推送时将这些标签词同时作为召回源和推荐理由,让用户明白为什么给他做出这样的推荐。

主题&词的重要性度量

LDA训练生成的主题中,虽然都有着同等的位置,但是其重要性却是各不相同的,有的主题包含了重要的信息,有的则不然。例如,一个主题可能包含“教育、读书、学校”等词,和这样主题相关的文档,一般来说是和教育相关的主题,那么这就是一个信息量高的主题;相反,有的主题可能会包含“第一册、第二册、第三册……”等词(如果在一个图书销售网站的所有图书上训练LDA,就有可能得到这样的主题,因为有很多套装图书都包含这样的信息),和这样主题相关的文档却有可能是任何主题,这样的主题就是信息量低的主题。

如何区分主题是否重要呢?从上面的例子中我们可以得到启发:重要的主题不会到处出现,只会出现在小部分与之相关的文档中,而不重要的主题则可能在各种文章中都出现。基于这样的思想,我们可以使用信息熵的方法来衡量一个主题中的信息量。通过对LDA输出信息做适当的变换,我们可以得到主题θi在不同文档中的概率分布,然后我们对这个概率分布计算其信息熵,通俗来讲信息熵衡量了一个概率分布中概率值分散程度,越分散熵越大,越集中熵越小。所以在我们的问题中,信息熵越小的主题,说明该主题所对应的文档越少,主题的重要性越高。

使用类似的方法,我们还可以计算词的重要性,在此不再赘述。

更多应用

除了上面提到的,LDA还有很多其他应用,甚至在文本领域以外的图像等领域也存在着广泛应用。LSA/pLSA/LDA这些主题模型的核心基础是词在文档中的共现,在此基础上才有了各种概率分布,把握住这个核心基础,就可以找到文本主体模型的更多应用。例如,协同过滤问题中,基础数据也是用户对物品的共同行为,这也构成了文本主题模型的基础,因此也可以使用LDA对用户对物品的行为进行建模,得到用户行为的主题,以及主题下对应的物品,然后进行物品/用户的推荐。

捕捉上下文信息:神经概率语言模型

以LDA为代表的文本主题模型通过对词的共现信息的分解处理,得到了很多有用的信息,但是pLSA/LDA有一个很重要的假设,那就是文档集合中的文档,以及一篇文档中的词在选定了主题分布的情况下都是相互独立,可交换的,换句话说,模型中没有考虑词的顺序以及词和词之间的关系,这种假设隐含了两个含义:

在生成词的过程中,之前生成的词对接下来生成的词是没有影响的。两篇文档如果包含同样的词,但是词的出现顺序不同,那么在LDA看来他们是完全相同的。

这样的假设使得LDA会丢失一些重要的信息,而近年来得到关注越来越多的以word2vec为代表的神经概率语言模型恰好在这方面和LDA形成了一定程度的互补关系,从而可以捕捉到LDA所无法捕捉到的信息。

word2vector的中心思想用一句话来讲就是:Awordischaracterizedbythecompanyitkeeps(一个词的特征由它周围的词所决定)。

这是一句颇有哲理的话,很像是成语中的“物以类聚人以群分”。具体来讲,词向量模型使用“周围的词=>当前词”或“当前词=>周围的词”这样的方式构造训练样本,然后使用神经网络来训练模型,训练完成之后,输入词的输入向量表示便成为了该词的向量表示,如图3所示。

这样的训练方式,本质上是在说,如果两个词具有类似的上下文(上下文由周围的词组成),那么这两个词就会具有类似的向量表示。有了词的向量表示之后,我们可以做很多事情,最常见的是将这一层向量表示作为更深层次模型的一个嵌入层。除了在深度学习中的使用以外,在推荐系统中还可以做很多其他的事情,其中之一就是做词的聚类,以及寻找相似词。我们知道LDA天然就可以做到词的聚类和相似词的计算,那么使用word2vec计算出来的结果和LDA有什么不同呢?它们之间的不同具体体现在两点:第一是聚类的粒度不同,LDA关注的主题级别的粒度,层次更高,而词向量关注的是更低层次的语法语义级别的含义。例如“苹果”,“小米”和“三星”这三个词,在LDA方法中很可能会被聚类在一个主题中,但是在词向量的角度来看,“苹果”和“小米”可能会具有更高的相似度,就像“乔布斯”和“雷军”在词向量下的关系一样,所以在词向量中可能会有:“vector(小米)-vector(苹果)+vector(乔布斯)=vector(雷军)”这样的结果。

除此以外,由于word2vec有着“根据上下文预测当前内容”的能力,将其做适当修改之后,还可以用来对用户行为喜好做出预测。首先我们将用户的行为日志进行收集,进行session划分,得到类似文本语料的训练数据,在这个数据上训练word2vec模型,可以得到一个“根据上下文行为预测当前行为”的模型。但是原始的行为数据中行为的对象常常是id级的,例如商品、视频的id等等,如果直接放到模型中训练,会造成训练速度慢、泛化能力差等问题,因此需要对原始行为做降维,具体来说可以将行为映射到搜索词、LDATopic、类别等等低维度特征上,然后再进行训练。例如,我们可以对用户的搜索词训练一个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(HierarchicalDirichletProcess)模型是LDA模型的一个扩展,可智能选择数据中主题的数量,还具有捕捉长尾主题的能力。除了腾讯以外,文本主题模型在各公司的推荐、搜索等业务中也已经在广泛使用,使用方法根据各自业务有所不同。

以word2vec为代表的神经网络模型近年来的使用也比较广泛,典型的应用如词的聚类、近义词的发现、query的扩展、推荐兴趣的扩展等。Facebook开发了一种word2vec的替代方案FastText,该方案在传统词向量的基础上,考虑子词(subword)的概念,取得了比word2vec更好的效果 。

总结和展望

我们从简单的文本关键词出发,沿着结构化、降维、聚类、概率、时序的思路,结合推荐系统中候选集召回、相关性计算、排序模型特征等具体应用,介绍了推荐系统中一些常用的自然语言处理技术和具体应用方法。自然语言处理技术借着深度学习的东风,近年来取得了长足的进步,而其与推荐系统的紧密关系,也意味着推荐系统在这方面仍然有着巨大的提升空间,让我们拭目以待。

书籍 – 我爱自然语言处理

这里推荐一批学习自然语言处理相关的书籍,当然,不止是自然语言处理,国内的书籍相对比较便宜,值得购买。

码农场博主,HanLP作者何晗新书《自然语言处理入门》,跟着这本书,实现NLP的基础模块,这大概是最好的入门方式之一,具体可参考:《人人都可以看懂的NLP入门书》。

《自然语言处理综论》,目前第二版翻译版本已经出版,我当年的入门书,不过看得是第一版翻译版本,英文名《SpeechandLanguageProcessing》,第三版据说很快就要出版,有条件的同学建议直接看英文版。

《统计自然语言处理基础》,另一本入门书籍,这本书的英文版貌似没有更新,但是中文版貌似也不再发售了,当然,优先推荐读英文版。

《Python自然语言处理》,NLTK配套丛书,有了上面两本书的介绍,再加上一些Python基础,通过这本书进行相关的文本挖掘实战,很不错的一个路径。

《Python深度学习》,近期读过的一本深度学习好书,隆重推荐。本书由Keras之父、现任Google人工智能研究员的弗朗索瓦•肖莱(FrançoisChollet)执笔,详尽介绍了用Python和Keras进行深度学习的探索实践,涉及计算机视觉、自然语言处理、生成式模型等应用。书中包含30多个代码示例,步骤讲解详细透彻。由于本书立足于人工智能的可达性和大众化,读者无须具备机器学习相关背景知识即可展开阅读。在学习完本书后,读者将具备搭建自己的深度学习环境、建立图像识别模型、生成图像和文字等能力。

一本新书《基于深度学习的自然语言处理》,英文版名《NeuralNetworkMethodsforNaturalLanguageProcessing》,哈工大车万翔老师带队翻译,我已收获译者签名版,阅读后感觉很不错。

宗成庆老师的《统计自然语言处理(第2版)》,当年读书的时候大致看过第一版,作为入门书籍不错。

国内青年学者刘知远老师等合著的《互联网时代的机器学习和自然语言处理技术大数据智能》,没有仔细看过,仅供参考。

南大周志华老师的西瓜书《机器学习》,最近出版的书籍,国内难得学习机器学习的高质量书籍,评价非常高,强烈推荐。

CMU机器学习系主任TomMitchell院士的《机器学习》,机器学习老牌经典书籍,历久弥新。

华章引进的英文版也不贵,不过貌似没货:《机器学习(英文版》

比较新的一本机器学习书籍,被誉为内容全面的机器学习教程MachineLearning期刊主编力作:《机器学习》

李航老师的这本《统计学习基础》挺不错的,简洁明了:《统计学习基础》

王斌老师翻译的《大数据互联网大规模数据挖掘与分布式处理(第2版)》,质量挺不错的,对应的英文书籍是《MiningofMassiveDatasets》,有相应的官方主页,提供相应的英文PDF,课程和课件资源。

=============================================================================

以下是我们在NLPJob微博上推出的一系列赠书活动中所涉及的相关书籍,活动基本保持在每周一期,大概已经做了有两年了,书籍一般都是当期比较新的数据,出版社愿意拿出来赞助做活动,至于书籍质量,大家多从书籍点评入手来参考是否值得购买。以下排名按新推出的活动同步更新:

深度学习:《TensorFlow实战》

本期@NLPJob联合@博文视点Broadview送出5本《TensorFlow实战》by@黄文坚Mark@唐源Terry截止2017.3.2213:00,关注+转发即可参与,TensorFlow研发团队内部推荐教程,两位作者均是TensorFlow开发者,本书结合大量代码实例,深入浅出介绍如何使用TensorFlow。

自然语言处理入门 (豆瓣)

4有用Olivia2020-03-2914:35:51

喵完了mantch的读书笔记。可以说是入门中的入门,且偏研究方向。至于实战方向,并不是简单代码能够解决的。可以想见HanLP的作者,肯定擅长理论+工程,但对业务场景的理解却极为有限。如何落地NLP,如何通过实践将NLP的各项技术统筹起来,均未曾提及。极客时间《NLP实战高手课》中提及了「结构化」数据挖掘。「理解」是为了获取「信息」。从「非结构化」数据中提取出「结构化」数据,并提取出信息,进而转化成...喵完了mantch的读书笔记。可以说是入门中的入门,且偏研究方向。至于实战方向,并不是简单代码能够解决的。可以想见HanLP的作者,肯定擅长理论+工程,但对业务场景的理解却极为有限。如何落地NLP,如何通过实践将NLP的各项技术统筹起来,均未曾提及。极客时间《NLP实战高手课》中提及了「结构化」数据挖掘。「理解」是为了获取「信息」。从「非结构化」数据中提取出「结构化」数据,并提取出信息,进而转化成决策,乃是一大应用场景。NLP只是一种技术和工具,如何用好兵器,打造好武器库,是需要思考的问题。(展开)

5本自然语言处理书单

 

文章发布于公号【数智物语】 (ID:decision_engine),关注公号不错过每一篇干货。

 

 

 

自然语言处理(英语:NaturalLanguageProcessing,缩写作NLP)是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然语言。自然语言处理研究的内容包括但不限于如下分支领域:文本分类、信息抽取、自动摘要、智能问答、话题推荐、机器翻译、主题词识别、知识库构建、深度文本表示、命名实体识别、文本生成、文本分析(词法、句法、语法)、语音识别与合成等。以下自然语言处理书籍由数智物语根据公开资料、豆瓣评分综合整理。

 

01书单

 

 

01SpeechandLanguageProcessing(3rded.draft)

 

 

作者:DanielJurafsky/JamesH.Martin

 

书籍简介:2018年9月23日自然语言处理领域经典综述教材《SpeechandLanguageProcessing》,中文名《自然语言处理综述》第三版发布。该书由NLP领域的大牛,斯坦福大学DanielJurafsky教授和科罗拉多大学的JamesH.Martin教授等人共同编写。DanielJurafsky是斯坦福大学计算机科学教授,主要研究方向是计算语言学和自然语言处理。JamesH.Martin是科罗拉多大学博尔德分校计算机科学系一名教授,两位教授都是NLP领域知名学者。

 

推荐理由:经典的NLP教科书,涵盖了所有NLP的基础知识,也被国外许多著名大学选为自然语言处理和计算语言学课程的主要教材。本书写作风格引人入胜,深入技术细节而又不让人感觉枯燥,不仅可以作为高等学校自然语言处理和计算语言学等课程的本科生和研究生教材,对于自然语言处理相关领域的研究人员和技术人员也是不可或缺的权威参考书。

 

阅读链接:https://web.stanford.edu/~jurafsky/slp3/

 

02FoundationsofStatisticalNaturalLanguageProcessing

 

 

作者:ChristopherManningandHinrichSchütze

 

书籍简介:本书涵盖的内容十分广泛,分为四个部分,共16章,包括了构建自然语言处理软件工具将用到的几乎所有理论和算法。全书的论述过程由浅入深,从数学基础到精确的理论算法,从简单的词法分析到复杂的语法分析,适合不同水平的读者群的需求。同时,《统计自然语言处理基础:国外计算机科学教材系列》将理论与实践紧密联系在一起,在介绍理论知识的基础上给出了自然语言处理技术的高层应用(如信息检索等)。

 

推荐理由:经典的统计自然语言处理入门教材。内容涉及统计自然语言处理用到的数学基础,词法到语法分析,以及自然语言处理的基本任务(比如文本分类、聚类,统计机器翻译,以及信息检索)。本教材成书较早(1999年),但是自然语言处理领域的基本概念和任务没有太大的变化,仍然适用于初学者快速了解自然语言处理相关的概念和任务,中文版本为《统计自然语言处理基础:国外计算机科学教材系列》(电子工业出版社出版)。

 

阅读链接:https://nlp.stanford.edu/fsnlp/

 

03NeuralNetworkMethodsinNaturalLanguageProcessing(SynthesisLecturesonHumanLanguageTechnologies)

 

 

作者:YoavGoldberg

 

书籍简介:本书着重介绍神经网络模型在自然语言数据中的应用。书的前半部分介绍了有监督的机器学习和前馈神经网络的基础知识,基于语言数据的机器学习的基础知识。它还涵盖了可以定义和训练任意神经网络的计算图形抽象方面的知识,是当代神经网络软件库设计的基础。本书的第二部分介绍了更多专门的神经网络体系结构,包括一维卷积神经网络、递归神经网络、条件生成模型和基于注意力的模型。这些体系结构和技术是机器翻译、句法分析和许多其他应用程序的最先进算法的推动力量。最后,本书还讨论了树形网络,结构化预测和多任务学习的前景。

 

推荐理由:最近几年由于深度学习的兴起,使得图像识别、语音识别等多个方面都发生了很大的变革。深度学习在自然语言处理方面也是非常普遍了,一些经典的自然语言模式也都是基于神经网络的,这本书是目前市面上唯一一本介绍神经网络在自然语言处理的应用,而且书中的大量参考文献非常有价值。本书的作者在这个领域非常知名,并且对待学术态度极其严谨。

 

阅读链接:http://library1.org/_ads/7ECBFA717EC2AAF7E2F20AA3597D1C8C

 

04NaturalLanguageProcessingwithPython

 

 

作者:StevenBird/EwanKlein/EdwardLoper

 

书籍简介:本书教你如何用 Python和NLTK库来做NLP。提供了非常易学的自然语言处理入门介绍,该领域涵盖从文本和电子邮件预测过滤,到自动总结和翻译等多种语言处理技术。你还将通过使用综合语言数据结构访问含有丰富注释的数据集,理解用于分析书面通信内容和结构的主要算法。 

 

推荐理由:这本书的实用性较强。如果你对Python与NLTK感兴趣,就看这本书,可以当做入门读物来看,整本书即涉及到了语料库的操作,也对传统的基于规则的方法有所涉及。全书包括了分词(tokenization)、词性标注(POS)、语块(Chunk)标注、句法剖析与语义剖析等方面,是NLP中不错的一本实用教程。

 

阅读链接:http://www.nltk.org/book/

 

05IntroductiontoInformationRetrieval

 

 

作者:ChristopherD.Manning/PrabhakarRaghavan/HinrichSchütze

 

书籍简介:本书从计算机科学领域的角度出发,介绍了信息检索的基础知识,并对当前信息检索的发展做了回顾,重点介绍了搜索引擎的核心技术,如文档分类和文档聚类问题,以及机器学习和数值计算方法。书中所有重要的思想都用示例进行了解释,生动形象,引人入胜。

 

推荐理由: 关于排名/搜索的优秀参考书,作者从最简单的布尔检索到一个完整的搜索引擎,逐步深入,逐步引导读者思考,对建造一个大型搜索引擎需要用到的架构和算法都有所涉猎,搜索引擎并不仅仅是检索信息,它还有一个更重要的用处是对返回的结果进行排序,而这往往是非常重要的。

 

阅读链接:https://nlp.stanford.edu/IR-book/html/htmledition/irbook.html

 

02推荐课程

 

01CS224d:DeepLearningforNaturalLanguageProcessing

 

课程导师:RichardSocher

 

课程链接:http://cs224d.stanford.edu/syllabus.html

 

主要内容:斯坦福大学自然语言小组基于深度学习的自然语言处理课程。介绍了自然语言处理领域广泛应用的网络结构(例如循环神经网络、卷积神经网络以及递归神经网络等)及其在自然语言处理的经典任务,例如分类任务(情感分类),序列标注任务(实体识别),序列到序列的生成任务(机器翻译)等实际应用。

 

推荐理由:自然语言处理是信息时代最重要的技术之一。理解复杂的语言也是人工智能的重要组成部分。自然语言处理的应用无处不在,因为人们用语言沟通了大部分内容:网络搜索、广告、电子邮件、客户服务、语言翻译、放射学报告等等。本课程比较适合对这个领域感兴趣的初学者。

 

02OxfordDeepLearningforNLPclass

 

课程导师:PhilBlunsom.ClassbyDeepMindNLPGroup.

 

适合人群:中级到高级学者

 

课程链接:https://machinelearningmastery.com/oxford-course-deep-learning-natural-language-processing/

 

主要内容:DeepMind团队成员在牛津大学教授基于深度学习的自然语言处理的课程。内容涉及到词嵌入,基于循环神经网络的语言模型,基于循环神经网络和卷积神经网络的文本分类,基于循环神经网络的条件语言模型(广泛应用于机器翻译、文本摘要等)及其中的注意力机制,以及基于深度学习模型的自动问答等主要自然语言处理的任务。

 

推荐理由:深度学习方法在自然语言处理问题上达到了一定的效果。本课程的大部分材料都可以在线免费获取,比较适合对这个领域有一定的基础,希望了解最新进展和进一步学习和研究的同学。

 

03其他在线课程

 

Coursera:自然语言处理简介(由密西根大学提供的NLP课程)

https://www.coursera.org/learn/natural-language-processing

 

DanJurafsky和ChrisManning:自然语言处理(非常棒的视频介绍系列)

https://www.youtube.com/watch?v=QIdB6M5WdkI&list=PLl3AijnqmcEhr0fQqPfaC_6PbyVNBLJTE&index=3

 

03数据集

 

数据集:见NicolasIderhoff在GitHub上发布的NlP资源汇总:https://github.com/niderhoff/nlp-datasets

 

*文中图片来自豆瓣

 

参考文献

书单 |NLP秘笈,从入门到进阶,微软研究院AI头条,2017-12-20

独家 |自然语言处理(NLP)入门学习资源清单,清华大学数据科学研究院,2017-09-29

数据挖掘、机器学习、自然语言处理这三者是什么关系?这几个怎么入门,量子位,2019-01-21

 

 

 

星标我,每天多一点智慧

 

几本自然语言处理入门书 – 我爱自然语言处理

如果你刚接触自然语言处理并对她感兴趣,最好读几本这方面的书籍,除了能让你知道自然语言处理各个领域是干什么的外,还能培养一下NLP的感觉。以下四本书是我读研期间阅读和接触过的,如果您还有好书推荐,欢迎补充。

1、《自然语言处理综论》(SpeechandLanguageProcessing:AnIntroductiontoNaturalLanguageProcessing,ComputationalLinguisticsandSpeechRecognition)这本书的权威自不用说,译者是冯志伟老师和孙乐老师,当年读这本书的时候,还不知道冯老师是谁,但是读起来感觉非常好,想想如果没有在这个领域积攒多年的实力,是不可能翻译的这么顺畅的。这本书在国内外的评价都比较好,对自然语言处理的两个学派(语言学派和统计学派)所关注的内容都有所包含,但因此也失去一些侧重点。从我的角度来说更偏向于统计部分,所以需要了解统计自然语言处理的读者下面两本书更适合做基础阅读。不过这本书的N-gram语言模型部分写得非常不错,是SRILM的推荐阅读参考。

2、《统计自然语言处理基础》(FoundationsofStatisticalNaturalLanguageProcessing)我比较喜欢这本书,这两年的学习过程中也经常拿这本书作为参考,可能与我做统计机器翻译有关吧。看chinapub上的评论说这本书的翻译比较差,自己的感觉是还行。当然,这是国内翻译图书的一个通病:除了很难有翻译的非常好的书外,另外一个原因就是滞后性。如果e文足够好的坏,就及时看英文版吧。这本书在统计基本部分的介绍很不错,另外n元语法部分讲得也比较好,也是SRILM的推荐阅读。

3、《统计自然语言处理》这是北京自动化所宗成庆老师今年5月出版的一本专著,我有幸较早的阅读了这本书的很多章节。一个很强的感觉是:如果你想了解相关领域的国内外最新进展,这本书非常值得一读。上面两本书在由于出版稍早的缘故,很多领域最新的方法都没有介绍。而这本书刚刚出版,宗老师对国内外现状把握的也比较好,因此书中充分体现了这方面的信息。另外统计机器翻译这一部分写得很详细很不错,这可能与宗老师亦是这个领域的研究者有关吧。

4、《计算机自然语言处理》这是我最早看的一部自然语言处理方面的书籍,和上面几部大部头的书籍相比,这本书很薄,可以很快的看完。书的内容我都有点忘了,但是印象中可以在每个章节看到国内这个领域的研究历史和相关单位。这时才发现母校HIT在这个领域的超强实力,只是可惜这时候已经离开冰城了。

这些书籍怎么读都行,泛览也罢,精读也行,只要有时间,多读书是没坏处的。我自己的经验是,先泛泛的浏览或阅读一篇,对于比较晦涩的部分可以先跳过去,然后对自己感兴趣的领域或者将要从事的领域的相关章节进行精读,当然,书籍一般在开始的几个章节讲些基础性的知识,这部分最好也仔细揣摩一下。真正要对自己研究的领域深刻了解,还得好好读一下本领域的相关论文。

更多书籍请参考:书籍

注:原创文章,转载请注明出处“我爱自然语言处理”:www.52nlp.cn

本文链接地址:https://www.52nlp.cn/natural-language-processing-primer-books/

相关文章:提供几本自然语言处理书自然语言处理与计算语言学书籍汇总之一:国外书籍自然语言处理中几种层次划分体系HMM相关文章索引

PySpark机器学习、自然语言处理与推荐系统 (豆瓣)

使用PySpark构建机器学习模型、自然语言处理应用程序以及推荐系统,从而应对各种业务挑战。本书首先介绍Spark的基础知识,然后讲解使用PySpark构建传统机器学习算法以及自然语言处理和推荐系统的全部知识点。

本书阐释了如何构建有监督机器学习模型,比如线性回归、逻辑回归、决策树和随机森林,还介绍了无监督机器学习模型,比如K均值和层次聚类。本书重点介绍特征工程,以便使用PySpark创建有用的特征,从而训练机器学习模型。自然语言处理的相关章节将介绍文本处理、文本挖掘以及用于分类的嵌入。

在阅读完本书之后,读者将了解如何使用PySpark的机器学习库构建和训练各种机器学习模型。此外,还将熟练掌握相关的PySpark组件,从而进行数据获取、数据处理和数据分析,开发数据驱动的智能应用。

构建一系列有监督和无监督机器学习算法

使用SparkMLlib库实现机器学习算法

使用SparkMLlib库开发推荐系统

处理与特征工程、分类平衡、偏差和方差以及交叉验证有关的问题,以便构建最优的拟合模型

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇