ML-文本表示

date
Jul 11, 2022
slug
ML-文本表示
status
Published
tags
ML
文本表示
summary
type
Post

文本表示

TF-IDF

TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术,常用于挖掘文章中的关键词,而且算法简单高效,常被工业用于最开始的文本数据清洗。
TF-IDF有两层意思,一层是"词频"(Term Frequency,缩写为TF),另一层是"逆文档频率"(Inverse Document Frequency,缩写 IDF)。其公式为: 其中为单词t在文档d中出现的频率,是逆文档频率,用来衡量单词t对其表达语义所起的重要性,表示为:
加1平滑,防止单词 t 未再文章中出现
如果一个单词在非常多的文章里面都出现,那么它可能是一个比较通用的词汇,对于区分某篇文章特殊语义的贡献较小,因此对权重做一定惩罚。

词袋模型

词袋模型(bag-of-words)将每篇文章看成一袋子词,并忽略每个词出现的顺序。模型将整段文本以词为单位切分开,然后每篇文章可以表示成一个长向量,向量中的每一维代表一个单词,而该维对应的权重则反映了这个词在原文章中的重要程度。
可能会出现的问题:长文本比短文本对每个单词有更高的出现次数,尽管他们可能在描述同一个主题,用单词计数会有偏差。
其改进方法:
  • 去停用词:可去掉一些无用的高频词
  • 可以使用TF-IDF来计算权重

n-gram模型

n 元词袋(bag-of-n-grams)是词袋的一种自然扩展,n-gram(n元词)是由n个标记(token)组成的序列。1-gram 就是一个单词(word),又称为一元词(unigram)。经过分词(tokenization)之后,计数机制会将单独标记转换为单词计数,或将有重叠的序列作为 n-gram 进行计数。n-gram 能够更多地保留文本的初始序列结构,因此 n 元词袋表示法可以表达更丰富的信息。
理论上,有k个不同的单词,就会有 个不同的 2-gram(二元词),实际上,没有这么多,因为并不是每个单词都可以跟在另一个单词后面。n-gram(n > 1)一般来说也会比单词多得多,这意味着 n 元词袋是一个更大也更稀疏的特征空间,也意味着 n 元词袋需要更强的计算、存储、建模能力。n 越大,能表示的信息越丰富,相应的成本也会越高。
另外,同一个词可能有多种词性变化,却具有相似的含义。在实际应用中,一般会对单词进行词干抽取(Word Stemming)处理,即将不同词性的单词统一成为同一词干的形式。

主题模型(topic model)

基于词袋模型或N-gram模型的文本表示模型有一个明显的缺陷,就是无法识别出两个不同的词或词组具有相同的主题。因此,需要一种技术能够将具有相同主题的词或词组映射到同一维度上去,于是产生了主题模型。主题模型通过将高维单词空间映射到低维的目标主题空间,有效地发现文档潜在的结构和隐藏的语义信息,最终实现对目标文档的降维处理、信息总结和摘要。
主题模型是一种特殊的概率图模型。主题模型自动分析每个文档,统计文档内的词语,根据统计的信息来断定当前文档含有哪些主题,以及每个主题所占的比例各为多少。

pLAS(Probabilistic Latent Semantic Analysis)

Hofmann 等 人提出概率潜在语义分析(Probabilistic Latent Semantic Analysis, PLSA)模型,在该模型中不考虑词序,文本语料可以由单词和文档地共现矩阵表示。
从观测的单词中推断两个参数:一个是将语料库中文档联系起来的全局参数,代表了给定主题后,单词出现的概率;另一个是每篇文档的参数, 代表了文档的主题概率分布。PLSA 模型通过引入 概率统计思想,大大降低了模型的计算成本。
pLSA是用一个生成模型来建模文章的生成过程。假设有K个主题,M篇文章;对语料库中的任意文章d,假设该文章有N个词,则对于其中的每一个词,我们首先选择一个主题z,然后在当前主题的基础上生成一个词w。如下图模型:
notion image
生成主题 和词 的过程遵照一个确定的概率分布。
设在文章 中生成主题 的概率为 ,在选定主题的条件下生成词 的概率为 ,则给定文章 ,生成词 的概率可以写成:
在这里我们做一个简化,假设给定主题 的条件下,生成词 的概率是与特定的文章无关的,则公式可以简化为: 。整个语料库中的文本生成概率可以用似然函数表示为: 其中 $p(d_m,w_n)$ 是在第 $m$ 篇文章 $d_m$ 中,出现单词 $w_n$ 的概率,$c(d_m,w_n)$ 是在第 $m$ 篇文章 $d_m$ 中,单词 $w_n$出现的次数。
于是, 似然函数可以写成: 其中,定义在文章上的主题分布 $p(z_k|d_m)$ 和定义在主题上的词分布 $p(w_n|z_k)$ 是待估计的参数。由于参数中包含的zk是隐含变量,可以利用最大期望算法来解决。
在 PLSA 模型中,对特定文档中的主题的混合比例权重没有做任何假设,因此,在实际训练时常出现 过拟合的情况。

LDA(Latent Dirichlet Allocation)

LDA可以看作是pLSA的贝叶斯版本,其文本生成过程与pLSA基本相同,不同的是为主题分布和词分布分别加了两个狄利克雷(Dirichlet)先验。模型结构如下:
notion image
  1. 其中,方框表示对其中内容的重复次数,方框右下角数字是方框内包含变量的重复次数;棕色实心圆表示观测值,空心圆表示隐含随机变量;箭头表示变量的依赖关系;变量之间的指代关系如下表所示:
符号
解释
符号
解释
K
主题个数
M
文档个数
N
表示文档包含的单词个数
W()
表示第 d 篇文档的第 n 个单词
Z ()
表示第 d 篇文档的第 n 个主题
超参数不同的狄利克雷概率分布
语料库的生成过程为:
假设一个语料库是 D 篇文档集合;其中,每篇文档 d 是 N 个单词的序列,表示为 ,对语料库 D 中的每一篇文档 ,采用以下操作:
  • 从超参数为 的狄利克雷分布中抽样生成文档 的主题分布
  • 对文档 中的每一个词进行以下3个操作:
      1. 从代表主题的多项式分布 中抽样生成它所对应的主题
      1. 从超参数为 的狄利克雷分布中抽样生成主题 对应的词分布
      1. 从代表词的多项式分布 中抽样生成词
首先随机给定每个单词的主题,然后在其他变量固定的情况下,根据转移概率抽样生成每个单词的新主题。
对于每个单词来说,转移概率可以理解为:给定文章中的所有单词以及除自身以外其他所有单词的主题,在此条件下该单词对应为各个新主题的概率。
最后,经过反复迭代,我们可以根据收敛后的采样结果计算主题分布和词分布的期望 在LDA中,主题的个数 K 是一个预先指定的超参数。对于模型超参数的选择,实践中的做法一般是将全部数据集分成训练集、验证集、和测试集3部分,然后利用验证集对超参数进行选择。 在训练时,尝试多组超参数的取值,并在验证集上检验哪一组超参数所对应的模型取得了最好的效果。最终,在验证集上效果最好的一组超参数和其对应的模型将被选定,并在测试集上进行测试。
为了衡量LDA模型在验证集和测试集上的效果,需要寻找一个合适的评估指标。一个常用的评估指标是困惑度(perplexity)。在文档集合 D 上,模型的困惑度被定义为: 其中 M 为文档的总数,$w_d$为文档 d 中单词所组成的词袋向量,$p(w_d)$ 为模型所预测的文档 d 的生成概率,$N_d$ 为文档 d 中单词的总数。

词嵌入模型(word embeding)

词嵌入是一类将词向量化的模型的统称,核心思想是将每个词都映射成低维空间(通常K=50~300维)上的一个稠密向量(Dense Vector)。K维空间的每一维也可以看作一个隐含的主题,只不过不像主题模型中的主题那样直观。

Word2Vec

谷歌2013年提出的Word2Vec是目前最常用的词嵌入模型之一。Word2Vec实际是一种浅层的神经网络模型,它有两种网络结构,分别是CBOW(Continues Bag of Words)和Skip-gram。
CBOW的目标是根据上下文出现的词语来预测当前词的生成概率,如下图(a)所示;而Skip-gram是根据当前词来预测上下文中各词的生成概率,如下图(b)所示。
notion image
其中 是当前所关注的词, 是上下文中出现的词。假设有一个句子“There is an apple on the table”作为训练样本,所以图中设定的前后滑动窗口大小均设为2。CBOW的输入为(is, an, on, the),输出为apple。而Skip-gram的输入为apple,输出为(is, an, on, the)。
CBOW和Skip-gram都可以表示成由输入层(Input)、映射层(Projection)和输出层(Output)组成的神经网络。
notion image
输入层中的每个词由独热编码方式表示,即所有词均表示成一个N维向量,其中N为词汇表中单词的总数。在向量中,每个词都将与之对应的维度置为1,其余维度的值均设为0。
在映射层(又称隐含层)中, 个隐含单元(Hidden Units)的取值可以由 维输入向量以及连接输入和隐含单元之间的 维权重矩阵计算得到。在CBOW中,还需要将各个输入词所计算出的隐含单元求和。
同理,输出层向量的值可以通过隐含层向量( 维),以及以及连接隐含层和输出层之间的 维权重矩阵计算得到。输出层也是一个 维向量,每维与词汇表中的一个单词相对应。最后,对输出层向量应用 Softmax 激活函数,可以计算出每个单词的生成概率。Softmax 激活函数的定义为:
其中 代表N维的原始输出向量, 为在原始输出向量中,与单词 所对应维度的取值。
接下来的任务就是训练神经网络的权重,使得语料库中所有单词的整体生成概率最大化。从输入层到隐含层需要一个维度为 的权重矩阵,从隐含层到输出层又需要一个维度为 的权重矩阵,学习权重可以用反向传播算法实现,每次迭代时将权重沿梯度更优的方向进行一小步更新。但是由于Softmax激活函数中存在归一化项的缘故,推导出来的迭代公式需要对词汇表中的所有单词进行遍历,使得每次迭代过程非常缓慢,由此产生了Hierarchical Softmax和Negative Sampling两种改进方法。

CBOW

notion image
  1. 输入层:上下文单词的One-Hot编码词向量, 为词汇表单词个数, 为上下文单词个数。还使用上面 ,所以模型的输入是(is,an,on,the)4个单词的One-Hot编码词向量。
  1. 初始化一个权重矩阵 ,然后用所有输入的One-Hot编码词向量左乘该矩阵,得到维数为N的向量 ,这里的 由自己根据任务需要设置。
  1. 将所得的向量 相加求平均作为隐藏层向量
  1. 初始化另一个权重矩阵 ,用隐藏层向量 左乘 ,再经激活函数处理得到 维的向量 的每一个元素代表相对应的每个单词的概率分布。
  1. 中概率最大的元素所指示的单词为预测出的中间词(target word)与true label的One-Hot编码词向量做比较,误差越小越好(根据误差更新两个权重矩阵)。
在训练前需要定义好损失函数(一般为交叉熵代价函数),采用梯度下降算法更新 。训练完毕后,输入层的每个单词与矩阵 相乘得到的向量的就是分布式表示的词向量(Word embedding)。

Skip-Gram

notion image
  1. 首先我们选定句子中间的一个词作为我们的输入词,例如我们选取“apple”作为 input word;
  1. 有了input word以后,我们再定义一个叫做 skip_window 的参数,它代表着我们从当前 input word 的一侧(左边或右边)选取词的数量。如果我们设置 skip_window=2 ,那么我们最终获得窗口中的词(包括input word在内)就是 [‘is’, ’an’, ’apple’, ’on’, ’the’ ]skip_window=2代表着选取 input word 左侧2个词和右侧2个词进入我们的窗口,所以整个窗口大小
    1. 另一个参数叫 num_skips,它代表着我们从整个窗口中选取多少个不同的词作为我们的 output word,当 skip_window=2num_skips=2时,我们将会得到两组 (input word, output word) 形式的训练数据,即 ('apple', 'an'),('apple', 'one')。
  1. 神经网络基于这些训练数据中每对单词出现的次数习得统计结果,并输出一个概率分布,这个概率分布代表着到我们词典中每个词有多大可能性跟 input word 同时出现;
  1. 通过梯度下降和反向传播更新矩阵
  1. 中的行向量即为每个单词的 Word embedding 表示

参考资料

 

© Baiye 2022 - 2025