Fork me on GitHub

特征工程|文本特征处理的四大类主流方法

以下文章来源于搜索与推荐Wiki ,作者Thinkgamer

文本特征在内容平台内使用的场景和方式更多,但并不等于说其在其他形式的平台中无用户之地,比如:电商平台中的商品标题、商品介绍、评论等,商品平台中视频标题、视频介绍、评论等。

利用文本数据可以做的事情很多,包括但不局限于:关键词提取、文本分类、文本聚类、文本情感分析、文本离散表示、文本生成等。在推荐领域,通常是基于文本内容进行挖掘,从而提取出有效特征来表示物品,可以在CTR模型中使用。

当然上边提到的主要是如何在CTR模型中利用文本内容,在召回或者物品画像也可以对文本内容进行挖掘,这里不再赘述,在后续的召回系列内容中会涉及,本篇文章主要介绍如何基于文本内容提取特征。

提取文本特征主流的方法有以下几种:

  • 词袋模型+OneHot编码
  • 词袋模型+关键词权重(TF-IDF、TextRank等)
  • 词袋模型+主题模型(LSA、LDA、LDA2Vec等)
  • Embedding模型

词袋模型+OneHot编码

1、词袋模型介绍

词袋模型(Bag-of-words)即将文档库中所有词语装进一个袋子里,不考虑词法和语序的问题,即每个词语都是独立的。对于每篇文档中出现的词语映射到词库中,如果出现,则在对应位置加1,否则为0,最终某位置的数字表示的是在该文档中该词语出现的次数。

假设文档库中只有两篇文档,第一篇文档的内容为:我来自北京,我爱中国,第二篇文档的内容为:我爱天安门。按照某种分词规则得到的词库为:[我,来自,北京,爱,中国,天安门],则第一篇文档的内容可以表示为:[2,1,1,1,1,0],第二篇文档的内容可以表示为:[1,0,0,1,0,1]。可以看出“我”字在第一篇文档中出现了两次,所以其对应的向量表示中对应位置为2。

使用词袋模型+OneHot编码的形式表达文本,简单直观可解释 ,但其忽略了词语之间的顺序关系、词语之间的相互影响关系,且得到的特征比较离散,特征维度较高。

2、词集模型+OneHot编码

和词袋模型比较接近的是词集模型,同样需要先得到一个词库,然后不同文档中的词语对应到词库中,但其与词袋模型不同的是不进行次数的累加,即如果该词在词库中出现,则对应位置为1,否则为0,在词集模型中不考虑词频。

同样对于上文中的例子,文档1的内容可以表示为:[1,1,1,1,1,0],文档2可以表示为:[1,0,0,1,0,1]。在日常的工作中,很少使用词集模型,这里可以作为知识了解!

3、使用sklearn中的CountVectorizer构建文本的词集模型表示

代码部分暂不公示!

词袋模型+关键词权重

上面的内容中介绍到了什么是词袋模型,这部分内容主要介绍一下关键词提取和基于词袋模型+关键词表示文本。

1、关键词提取

关键词提取即从文本中提取出关键词来表示文本,避免词袋模型中的无用词或者权重较小词在进行特征表示时带来的影响。但其实无论是在工业界还是学术界对关键词都没有一个明确的定义,不同技术提取出的关键词会有差别,不同人对关键词的认定也不相同。关键词提取的技术主要包括三大类:

  • 有监督的关键词提取算法

将关键词的提取看作是二分类问题,即判断一个词是否是关键词。既然是分类问题,就需要提供已经标注好的训练语料,利用训练语料训练关键词提取模型,根据模型对需要抽取关键词的文档进行关键词抽取。

  • 半监督的关键词提取算法

只需要少量的训练数据,利用这些训练数据构建关键词抽取模型,然后使用模型对新的文本进行关键词提取,对于这些关键词进行人工过滤,将过滤得到的关键词加入训练集,重新训练模型。

  • 无监督的关键词提取算法

不需要人工标注的语料,利用某些方法发现文本中比较重要的词作为关键词,进行关键词抽取。

在实际的场景中,如果仅仅考虑只是提取文本特征,使用无监督的关键词提取算法较多(其中使用较多的是TF-IDF、TextRank等)。当然如果考虑提取文本中的实体词、名词、品牌词等,则会使用有监督的关键词提取算法,结合人工标注和深度神经网络技术构建模型。

2、TF-IDF

TF-IDF(Term Frequency–Inverse Document Frequency)经常作为baseline模型,具有很强的泛化性,虽然是作为baseline模型,但其效果也并不差。TF-IDF是一种用于资讯检索与文本挖掘的常用加权技术。其主要思想是:如果某个词或短语在一篇文章中出现的频率 TF 高,并且在其他文章中很少出现,则认为此词或短语具有很好的类别区分能力,适合用来分类。TF-IDF 实际是 TF*IDF。

TF的计算公式

TF(Term Frequency)表示词条 t在文档D_i 中的出现的频率。TF 的计算公式如下:

TF_{t,D_i} = \frac{count(t)}{|D_i|}

式中,count(t)表示词条t 出现的次数,|D_i|表示文档 D_i中所有词条的个数。

IDF的计算公式

IDF(Inverse Document Frequency)表示词条 在整个语料库中的区分能力。IDF 的计算公式如下:

IDF_t = lg \frac{N}{\sum_{i=1}^{N}I(t,D_I)}

式中, N为所有的文档总数,I(t,Di)表示文档D_i 是否包含词条 t,若包含则为1,不包含则为 0。

但此处存在一个问题:如果词条 t 在所有文档中都没有出现,则式(6.2)的分母为 0,此时就需要对 IDF 做平滑处理。改善后的 IDF 计算公式如下:

IDF_t = lg \frac{N}{1 + \sum_{i=1}^{N}I(t,D_I)}

TF-IDF

最终词条 t 在文档D_i 中的 TF-IDF 值为:

TF-IDF_{t, D_i} = TF_{t,D_i} * IDF_t

从 TF-IDF 值的计算过程中看出:一个词条在文档中出现的频率越高,且新鲜度越低(即普遍度低),则其对应的 TF-IDF 值越高。

比如,现在有一个资料库,包含了 100 篇(N)论文,其中涉及包含推荐系统(t)这个词条的有 20 篇,在第一篇论文(D1)中总共有 200 个技术词汇,其中推荐系统出现了 15 次。则,词条推荐系统在第一篇论文(D1)中的 TF-IDF 值为:

TF-IDF_{推荐系统} = \frac{15}{200} * lg \frac{100}{20+1} = 0.051

3、TextRank

TextRank的思想来自于PageRank,通过词之间的相邻关系构建网络,然后用PageRank迭代计算每个节点的rank值,排序rank值即可得到关键词。

PageRank算法介绍

PageRank又称为网页排名、谷歌左侧排名、PR,是Google公司所使用的对其搜索引擎搜索结果中的网页进行排名的一种算法。

原版的PR算法迭代公式为:

PR(u) = \sum_{v \in B_u} \frac{PR(v)}{L(v)}

但其存在两个问题:

  • 等级泄漏(Rank Leak):如果一个网页没有出链,会像一个黑洞一样,吸收了其他网页的影响力而不释放,最终会导致其他网页的PR 值为0
  • 等级沉没(Rank Sink):如果一个网页只有出链,没有入链,在计算的迭代过程中,会导致这个网页的 PR值为0。

为了解决PR算法的这两个问题,拉里·佩奇提出了PR算法的随机浏览模型,其迭代公式为:

PR(u) = \frac{1-d}{N} + d \sum_{v \in B_u} \frac{PR(v)}{L(v)}

其中:

  • d:表示阻尼因子变量,表示用户按照跳转链接来上网的概率(通常可以取一个固定值0.85)
  • $1-d$:代表用户不是通过跳转链接来上网的概率,比如直接输网址
  • N:表示网页总数
  • u:表示待计算的那网页,PR(u)表示网页u的PR值
  • B(u):表示网页u的链入集合
  • v:表示网页u链入集合中的一个网页,PR(v)表示网页v的PR值,L(v)表示网页v的出链网页数量

TextRank算法介绍

TextRank算法是Mihalcea和Tarau于2004年在研究自动摘要提取过程中所提出来的,在PageRank算法的思路上做了改进,其和PageRank算法形式一致,只不过是将网页之间的链接关系转移到词语之间,同样如果将网页之间的链接关系转移到人与人之间,则是PeopleRank。

TextRank在构建图的时候将节点由网页改成了词语,并为节点之间的边引入了权值,其中权值表示两个词语的共现次数,本质上构建的是一个带权无向图。

基于TextRank的文本关键词抽取是利用局部词汇关系,即共现窗口,对候选关键词进行排序,该方法的步骤如下:

(1) 对于给定的文本D进行分词和去除停用词等数据预处理操作,最终得到n个候选关键词,即D=[t_1,t_2,…,t_n]

(2) 构建候选关键词图 G=(V,E) ,其中 V 为节点集,由候选关键词组成,并采用共现关系构造任两点之间的边,两个节点之间仅当它们对应的词汇在长度为K的窗口中共现则存在边,K表示窗口大小即最多共现K个词汇

(3) 根据公式迭代计算各节点的权重,直至收敛

(4) 对节点权重进行倒序排列,得到排名前Top N个词汇作为文本关键词

下面会介绍使用python的jieba库进行文本的关键词提取和文本向量构建。

4、使用sklearn中的TfidfVectorizer构建文本的TF-IDF向量表示

代码部分暂不公示!

5、基于TextRank算法实现文本关键词提取和文本的向量表示生成

代码部分暂不公示!

词袋模型+主题模型

在上一部分介绍词袋模型+关键词提取类模型来生成文本的向量表示,这一部分主要介绍一个基于词袋模型+主题模型来生成文本的向量表示。

1、主题模型

主题模型(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)。

2、经常使用的主题模型

LSA

潜在语义分词(LSA)是主题模型中基础之一,其核心思想是利用矩阵分解的知识将所构造的文档-词语矩阵分解成两个相互独立的文档-主题和主题-词语矩阵。它的基本假设是:一个词语的属性由它所处的环境决定,如果两个词出现在相似的两篇文档中,则这两个词具有相似的含义,即它们具有相似的上下文信息。

LSA的第一步是构建文档与词语的矩阵 D ,假设现在有m 篇文档,其中包 n 个有效词语,则构建出的文档词语矩阵为m*n ,其中每一行表示一篇文档,共 m 行,每一列表示一个词语 n ,共 n列。在基础的LSA模型中第i 行、 j 列表示的是第 j个词语在第 i 篇文档中的出现次数,然而在实际的操作中,效果并不好,因此也经常使用词语的TF-IDF值来进行替换(考虑了权重信息),即:

w_{ij} = TF_{ij} * IDF_{ij}

在构建好文档与词语的矩阵 D之后,因为矩阵 D 十分稀疏、噪音很大、并且在很多维度上冗余,因此为了捕获文档和词语之间的少数潜在主题,希望能够降低 D 的维度,这时候就可以利用SVD(奇异值分解)来执行。

利用SVD可以将矩阵 D 分解为:

D = U \Sigma V^T

其中 UV均为单位正交矩阵,即U*U^T=IV*V^T=IU称为左奇异矩阵, V称为右奇异矩阵, \Sigma仅在主对角线上有值,我们称它为奇异值,其他元素均为0,上边矩阵的维度为:U \in R^{m*m}\Sigma \in R^{m*n}V \in R^{n*n}


SVD可以将矩阵 D 分解

特别的,奇异值矩阵的值是从小到达排列的,而且减小的特别快,在很多情况下,前10%甚至1%的奇异值的和就占了全部奇异值之和的99%以上的比例。也就是说我们可以用最大的 k 个奇异值和对应的左右奇异值向量来近似描述矩阵。这里的 k就表示我们要找寻的 k 个主题词。

由于这个重要的性质,SVD也可以用于PCA降维(关于特征降维会在「特征选择」部分进行介绍),也可以用于推荐算法,将用户和喜好对应的矩阵做特征分解,进而得到隐含的用户需求来做推荐(会在「召回排序」系列文章进行介绍)。

LSA的优缺点有哪些?

pLSA

概率潜在语义分析模型(pLSA)是为了克服LSA模型的一些缺点被提出来的。LSA的根本问题在 UV 对应的列向量无法进行解释,也无法从概率的角度来理解这个模型,而寻求概率意义上的解释则是贝叶斯推断的核心思想之 一。

pLSA模型则通过一个生成模型为LSA赋予了概率意义上的解释,该模型假设:每篇文档都包含一系列可能潜在的话题,文档中每一个单词都不是凭空产生的,而是在这些潜在的话题指引下通过一定的概率生成的。

在pLSA模型中,主题被看作是一种单词上的概率分布,每一个话题都代表着一个不同的单词上的概率分布,而每篇文档又可以看成是主题上的概率分布。每篇文档就是通过这样一个两层的概率分布生成的,这也是pLSA提出生成模型的核心思想。

假设现在我们要生成一篇文档d ,就是以一定的概率p(w_i|d) 生成 d文档中当下的词w_i ,然后再以一定的概率p(w_j|d) 生成单词w_j ,如此下去,不断的生成单词,从而得到整个文档。在这里,引入主题z ,则生成文档 d的流程为:先以一定的概率p(z_i | d) 选择主题 z_i,再以一定的概率 p(w_j|z_i)生成单词w_j ,从而生成主题文档d

pLSA假设是文档以一定的概率服从某种主题的分布。

通过隐变量 z 使得原来我们要学习的参数p(w|d) 变成了要学习的参数p(z|d)p(w|z) ,假设现在有 m 个文档, d维单词, k个主题,那么我们要学习的参数个数从原来的m*n,变为 (m+n)*k,而通常我们所定义的主题个数 k 都远小于 mn ,从而减少了我们模型所要学习的参数。

在论文中作者提到了两种生成模式,如下图所示:

image.png

pLSA的两种生成模式上图(a)是pLSA的生成模式,其对应的联合概率公式为:

P(d,w) = P(d) P(w|d)=P(d)\sum_{z \in Z} P(w|z) P(z|d)

图(b)是pLSA的共现模式,和生成模式的区别是:首先得到选择一个主题的概率,然后计算 p(d,w) 的概率。其对应的联合概率公式为:

P(d,w) = \sum_{z \in Z} P(z)P(d|z)P(w|z)

这两种方式是等价的,但在实际场景中使用更多的是pLSA的生成模式。

图(b)对应的公式和LSA算法的公式有一个直接的对应关系:

P(z) \Leftrightarrow \Sigma \\ P(d|z) \Leftrightarrow U \\ P(w|z) \Leftrightarrow V^T

这说明了虽然 pLSA 看起来与 LSA 差异很大、且处理问题的方法完全不同,但实际上 pLSA 只是在 LSA 的基础上添加了对主题和词汇的概率处理。pLSA 是一个更加灵活的模型,但仍然存在一些问题,尤其表现为:

  • 因为我们没有参数来给 P(d) 建模,所以不知道如何为新文档分配概率
  • 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 本质上就是一个神经网络,通过利用输入单词预测周围上下文词语的方法来学习词嵌入。

image.png
通过使用 lda2vec,我们不直接用单词向量来预测上下文单词,而是使用上下文向量来进行预测。该上下文向量被创建为两个其它向量的总和:单词向量和文档向量。

单词向量由前面讨论过的 skip-gram word2vec 模型生成。而文档向量更有趣,它实际上是下列两个组件的加权组合:

文档权重向量,表示文档中每个主题的「权重」(稍后将转换为百分比) 主题矩阵,表示每个主题及其相应向量嵌入 文档向量和单词向量协同起来,为文档中的每个单词生成「上下文」向量。lda2vec 的强大之处在于,它不仅能学习单词的词嵌入(和上下文向量嵌入),还同时学习主题表征和文档表征。

image.png


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