文本特征在内容平台内使用的场景和方式更多,但并不等于说其在其他形式的平台中无用户之地,比如:电商平台中的商品标题、商品介绍、评论等,商品平台中视频标题、视频介绍、评论等。
利用文本数据可以做的事情很多,包括但不局限于:关键词提取、文本分类、文本聚类、文本情感分析、文本离散表示、文本生成等。在推荐领域,通常是基于文本内容进行挖掘,从而提取出有效特征来表示物品,可以在CTR模型中使用。
当然上边提到的主要是如何在CTR模型中利用文本内容,在召回或者物品画像也可以对文本内容进行挖掘,这里不再赘述,在后续的召回系列内容中会涉及,本篇文章主要介绍如何基于文本内容提取特征。
提取文本特征主流的方法有以下几种:
-
词袋模型+OneHot编码
-
词袋模型+关键词权重(TF-IDF、TextRank等)
-
词袋模型+主题模型(LSA、LDA、LDA2Vec等)
-
Embedding模型
词袋模型(Bag-of-words)即将文档库中所有词语装进一个袋子里,不考虑词法和语序的问题,即每个词语都是独立的。对于每篇文档中出现的词语映射到词库中,如果出现,则在对应位置加1,否则为0,最终某位置的数字表示的是在该文档中该词语出现的次数。
假设文档库中只有两篇文档,第一篇文档的内容为:我来自北京,我爱中国,第二篇文档的内容为:我爱天安门。按照某种分词规则得到的词库为:[我,来自,北京,爱,中国,天安门],则第一篇文档的内容可以表示为:[2,1,1,1,1,0],第二篇文档的内容可以表示为:[1,0,0,1,0,1]。可以看出“我”字在第一篇文档中出现了两次,所以其对应的向量表示中对应位置为2。
使用词袋模型+OneHot编码的形式表达文本,简单直观可解释 ,但其忽略了词语之间的顺序关系、词语之间的相互影响关系,且得到的特征比较离散,特征维度较高。
和词袋模型比较接近的是词集模型,同样需要先得到一个词库,然后不同文档中的词语对应到词库中,但其与词袋模型不同的是不进行次数的累加,即如果该词在词库中出现,则对应位置为1,否则为0,在词集模型中不考虑词频。
同样对于上文中的例子,文档1的内容可以表示为:[1,1,1,1,1,0],文档2可以表示为:[1,0,0,1,0,1]。在日常的工作中,很少使用词集模型,这里可以作为知识了解!
代码部分暂不公示!
上面的内容中介绍到了什么是词袋模型,这部分内容主要介绍一下关键词提取和基于词袋模型+关键词表示文本。
关键词提取即从文本中提取出关键词来表示文本,避免词袋模型中的无用词或者权重较小词在进行特征表示时带来的影响。但其实无论是在工业界还是学术界对关键词都没有一个明确的定义,不同技术提取出的关键词会有差别,不同人对关键词的认定也不相同。关键词提取的技术主要包括三大类:
-
有监督的关键词提取算法
将关键词的提取看作是二分类问题,即判断一个词是否是关键词。既然是分类问题,就需要提供已经标注好的训练语料,利用训练语料训练关键词提取模型,根据模型对需要抽取关键词的文档进行关键词抽取。
-
半监督的关键词提取算法
只需要少量的训练数据,利用这些训练数据构建关键词抽取模型,然后使用模型对新的文本进行关键词提取,对于这些关键词进行人工过滤,将过滤得到的关键词加入训练集,重新训练模型。
-
无监督的关键词提取算法
不需要人工标注的语料,利用某些方法发现文本中比较重要的词作为关键词,进行关键词抽取。
在实际的场景中,如果仅仅考虑只是提取文本特征,使用无监督的关键词提取算法较多(其中使用较多的是TF-IDF、TextRank等)。当然如果考虑提取文本中的实体词、名词、品牌词等,则会使用有监督的关键词提取算法,结合人工标注和深度神经网络技术构建模型。
TF-IDF(Term Frequency–Inverse Document Frequency)经常作为baseline模型,具有很强的泛化性,虽然是作为baseline模型,但其效果也并不差。TF-IDF是一种用于资讯检索与文本挖掘的常用加权技术。其主要思想是:如果某个词或短语在一篇文章中出现的频率 TF 高,并且在其他文章中很少出现,则认为此词或短语具有很好的类别区分能力,适合用来分类。TF-IDF 实际是 TF*IDF。
TextRank算法介绍
TextRank算法是Mihalcea和Tarau于2004年在研究自动摘要提取过程中所提出来的,在PageRank算法的思路上做了改进,其和PageRank算法形式一致,只不过是将网页之间的链接关系转移到词语之间,同样如果将网页之间的链接关系转移到人与人之间,则是PeopleRank。
TextRank在构建图的时候将节点由网页改成了词语,并为节点之间的边引入了权值,其中权值表示两个词语的共现次数,本质上构建的是一个带权无向图。
基于TextRank的文本关键词抽取是利用局部词汇关系,即共现窗口,对候选关键词进行排序,该方法的步骤如下:
(1) 对于给定的文本进行分词和去除停用词等数据预处理操作,最终得到n个候选关键词,即
(2) 构建候选关键词图 ,其中 为节点集,由候选关键词组成,并采用共现关系构造任两点之间的边,两个节点之间仅当它们对应的词汇在长度为的窗口中共现则存在边,表示窗口大小即最多共现个词汇
(3) 根据公式迭代计算各节点的权重,直至收敛
(4) 对节点权重进行倒序排列,得到排名前Top N个词汇作为文本关键词
下面会介绍使用python的jieba库进行文本的关键词提取和文本向量构建。
4、使用sklearn中的TfidfVectorizer构建文本的TF-IDF向量表示
代码部分暂不公示!
5、基于TextRank算法实现文本关键词提取和文本的向量表示生成
代码部分暂不公示!
在上一部分介绍词袋模型+关键词提取类模型来生成文本的向量表示,这一部分主要介绍一个基于词袋模型+主题模型来生成文本的向量表示。
主题模型(Topic Model)是针对文本中提取出隐含主题的一种建模方法。那么主题模型中的“主题”指的是什么?主题是一个概念、一个方面,表现为一系列相关的词语,这些词语和文档要表达的核心内容相关性很大。
比如针对文档“为了解决MOOC平台课程推荐系统数据稀疏性的问题,该文提出一种基于稀疏偏好的矩阵分解和深度学习图像特征提取的混合推荐算法,用于提升推荐系统的质量”,我们可以提取出的主题可能是:稀疏性、矩阵分解、深度学习、图像特征、质量。可以看出这些主题表达了文档的内容,相当于是对文档内容的一个精简版的概括。
另外主题模型是一种生成模型(这里注意生成模型和判别模型的区别),所谓的生成模型,就是我们认为一篇文档的每个词都是通过“以一定的概率选择了某个主题,并通过这个主题中以一定概率选择某个词语”这样的一个过程生成的。所以我们可以反向推导出一篇文档的主题。
监督学习方法可分为两大类,即生成方法与判别方法,它们所学到的模型称为生成模型与判别模型。主题模型则是一种生成模型。那么生成模型和判别模型有哪些区别呢?
经常使用的主题模型包括:潜在语义分析(Latent Sematic Analysis,LSA)、概率潜在语义分析(Probabilistic Latent Sematic Analysis,pLSA)、隐含狄利克雷分布(Latent Dirichlet Allocation、LDA)、层次狄利克雷过程(Hierarchical Dirichlet Process ,HDP)、主题模型向量化(Latent Dirichlet Allocation Vector,LDA2Vec)。
LSA
潜在语义分词(LSA)是主题模型中基础之一,其核心思想是利用矩阵分解的知识将所构造的文档-词语矩阵分解成两个相互独立的文档-主题和主题-词语矩阵。它的基本假设是:一个词语的属性由它所处的环境决定,如果两个词出现在相似的两篇文档中,则这两个词具有相似的含义,即它们具有相似的上下文信息。
LSA的第一步是构建文档与词语的矩阵 ,假设现在有 篇文档,其中包 个有效词语,则构建出的文档词语矩阵为 ,其中每一行表示一篇文档,共 行,每一列表示一个词语 ,共 列。在基础的LSA模型中第 行、 列表示的是第 个词语在第 篇文档中的出现次数,然而在实际的操作中,效果并不好,因此也经常使用词语的TF-IDF值来进行替换(考虑了权重信息),即:
在构建好文档与词语的矩阵 之后,因为矩阵 十分稀疏、噪音很大、并且在很多维度上冗余,因此为了捕获文档和词语之间的少数潜在主题,希望能够降低 的维度,这时候就可以利用SVD(奇异值分解)来执行。
利用SVD可以将矩阵 分解为:
其中 、 均为单位正交矩阵,即 、。 称为左奇异矩阵, 称为右奇异矩阵, 仅在主对角线上有值,我们称它为奇异值,其他元素均为0,上边矩阵的维度为:、、。
SVD可以将矩阵 分解
特别的,奇异值矩阵的值是从小到达排列的,而且减小的特别快,在很多情况下,前10%甚至1%的奇异值的和就占了全部奇异值之和的99%以上的比例。也就是说我们可以用最大的 个奇异值和对应的左右奇异值向量来近似描述矩阵。这里的 就表示我们要找寻的 个主题词。
由于这个重要的性质,SVD也可以用于PCA降维(关于特征降维会在「特征选择」部分进行介绍),也可以用于推荐算法,将用户和喜好对应的矩阵做特征分解,进而得到隐含的用户需求来做推荐(会在「召回排序」系列文章进行介绍)。
LSA的优缺点有哪些?
pLSA
概率潜在语义分析模型(pLSA)是为了克服LSA模型的一些缺点被提出来的。LSA的根本问题在 、 对应的列向量无法进行解释,也无法从概率的角度来理解这个模型,而寻求概率意义上的解释则是贝叶斯推断的核心思想之 一。
pLSA模型则通过一个生成模型为LSA赋予了概率意义上的解释,该模型假设:每篇文档都包含一系列可能潜在的话题,文档中每一个单词都不是凭空产生的,而是在这些潜在的话题指引下通过一定的概率生成的。
在pLSA模型中,主题被看作是一种单词上的概率分布,每一个话题都代表着一个不同的单词上的概率分布,而每篇文档又可以看成是主题上的概率分布。每篇文档就是通过这样一个两层的概率分布生成的,这也是pLSA提出生成模型的核心思想。
假设现在我们要生成一篇文档 ,就是以一定的概率 生成 文档中当下的词 ,然后再以一定的概率 生成单词 ,如此下去,不断的生成单词,从而得到整个文档。在这里,引入主题 ,则生成文档 的流程为:先以一定的概率 选择主题 ,再以一定的概率 生成单词 ,从而生成主题文档 。
pLSA假设是文档以一定的概率服从某种主题的分布。
通过隐变量 使得原来我们要学习的参数 变成了要学习的参数 和 ,假设现在有 个文档, 维单词, 个主题,那么我们要学习的参数个数从原来的,变为 ,而通常我们所定义的主题个数 都远小于 和 ,从而减少了我们模型所要学习的参数。
在论文中作者提到了两种生成模式,如下图所示:
pLSA的两种生成模式
上图(a)是pLSA的生成模式,其对应的联合概率公式为:
图(b)是pLSA的共现模式,和生成模式的区别是:首先得到选择一个主题的概率,然后计算 的概率。其对应的联合概率公式为:
这两种方式是等价的,但在实际场景中使用更多的是pLSA的生成模式。
图(b)对应的公式和LSA算法的公式有一个直接的对应关系:
这说明了虽然 pLSA 看起来与 LSA 差异很大、且处理问题的方法完全不同,但实际上 pLSA 只是在 LSA 的基础上添加了对主题和词汇的概率处理。pLSA 是一个更加灵活的模型,但仍然存在一些问题,尤其表现为:
-
因为我们没有参数来给 建模,所以不知道如何为新文档分配概率
-
pLSA 的参数数量随着我们拥有的文档数线性增长,因此容易出现过度拟合问题
在实际的场景中,使用者往往是拿LDA作为LSA的性能对比模型,很少使用pLSA,因为LDA基于pLSA进行了扩展,从而解决了pLSA存在的一些问题。
LDA
潜在狄利克雷分布(LDA )是 pLSA 的贝叶斯版本,它使用狄利克雷先验来处理文档-主题和单词-主题分布,从而有助于更好地泛化。
具体来说,在 LDA 中,首先每一个文档都被看成跟有限个给定话题中的每一个存在着或多或少的关联性,而这种关联性则是用话题上的概率分布来刻画的, 这一点与 PLSA 其实是一致的。
在LDA模型中,不仅每个文档关于主题的概率分布被赋予了狄利克雷先验分布表示(这种稀疏形式的表示可以看成是人类的一种先验知识,即一般而言,一篇文章的主题有可能是集中在少数几个话题上,而很少说是单独一篇文章内同时涉及了很多的主题但没有重点),还对一个主题在所有单词上的概率分布也赋予了一个稀疏形式的狄利克雷先验,其直观解释为:在一个单独的主题中,跟主题高度相关的词出现的频率会很高,而其他的词出现的频率会很低,这样的两种先验使得LDA模型比pLSA更好的刻画文档-主题-单词这三者之间的关系。
在论文On an Equivalence between PLSI and LDA中通过分析论证了LDA和pLSA的关系,即pLSA相当于把LDA模型中的先验分布转变为均匀分布,然后对要求解的参数求最大后验估计(在先验是均匀分布的前提下,这也等价于求参数的最大似然估计),而这也正反映出了一个较为合理的先验对于建模是非常重要的。
LDA中涉及了大量的数学概念,比如:二项分布、Gamma函数、Beta分布、多项分布、狄利克雷分布、MCMC、EM算法等,具体更加详细的可以参考:《LDA数学八卦》。
HDP
层次狄利克雷过程(HDP)则是在LDA模型上的改进,可以自动确定主题的个数,这里不再具体描述,具体的可以阅读HDP的同名论文:Hierarchical Dirichlet Processes。
LDA2Vec
论文:AHybrid Document Feature Extraction Method Using Latent Dirichlet Allocation and Word2Vec
在文档层面,我们现在知道如何将文本表示为主题的混合。在单词级别上,我们通常使用诸如 word2vec 之类的东西来获取其向量表征。lda2vec 是 word2vec 和 LDA 的扩展,它共同学习单词、文档和主题向量。
lda2vec 专门在 word2vec 的 skip-gram 模型基础上建模,以生成单词向量。skip-gram 和 word2vec 本质上就是一个神经网络,通过利用输入单词预测周围上下文词语的方法来学习词嵌入。
通过使用 lda2vec,我们不直接用单词向量来预测上下文单词,而是使用上下文向量来进行预测。该上下文向量被创建为两个其它向量的总和:单词向量和文档向量。
单词向量由前面讨论过的 skip-gram word2vec 模型生成。而文档向量更有趣,它实际上是下列两个组件的加权组合:
文档权重向量,表示文档中每个主题的「权重」(稍后将转换为百分比) 主题矩阵,表示每个主题及其相应向量嵌入 文档向量和单词向量协同起来,为文档中的每个单词生成「上下文」向量。lda2vec 的强大之处在于,它不仅能学习单词的词嵌入(和上下文向量嵌入),还同时学习主题表征和文档表征。