自然语言处理(NLP)之二:文本表示(词向量)

1. 基础概念

周所众知,非数值型的文本数据是不能直接输入机器学习模型的,要先经过编码转化成数值型数据才可用于模型训练或预测。而文本表示,就是研究如何将文本数据合理编码成向量或矩阵形式的数值型数据的技术

自然语言文本中,篇章由段落构成,段落由句子组成,而句子由单词构成。而 词典中,每个单词都有多种含义,因此只看文本单独出现的单词难以确定其所想表达的含义;所以只有当单词放到句子中,结合其上下文共同出现单词的搭配关系后,才能确定单词所表达的含义,并进而 (由句中单词含义) 组合出句子的语义。目前实际开发中:

  1. 通常是构建针对单词(或字)的文本表示,即文本编码或词向量;
  2. 然后通过句中单词(或字)文本表示的算术平均值(平均池化),来获得句子的文本表示1
  3. 最后通过句子文本表示的顺序排列序列,来构建篇章的文本表示。

2. 单词(或字)的文本表示

目前,主流的单词文本表示方法主要有词袋法和词向量法大两类:

  • 词袋模法(bag-of-words)使用独热编码(onehot encoding)、频数编码(count encoding)或TF-IDF统计得到单词的向量表示,然后用句中单词向量之和表示句子。词袋模型文本表示实现简单、表示结果可解释性好,但不可否认的是它无法表示单词的含义、无法计算词句之间的语义相似度(文本相似度),且编码向量非常稀疏。词袋模法现在在实际使用中已不多见,更多内容可详见作者文章:《文本表示:词袋模型》。

  • 词向量法(word embedding)根据单词与上下文的搭配关系,由模型训练出一个人工指定长度的稠密向量来表示单词的含义,它可以用于计算单词之间的 (语义) 相似度。词向量的维度(长度)是一个超参数,它与单词语义的表示效果无绝对正相关关系,一般来讲,词向量的长度在 25 到 1000 维之间,过长的词向量反而会引起过拟合现象

3. 词向量表示

沿词向量的发展历程,词向量又可细分为静态词向量和动态词向量两个阶段。

3.1 静态词向量

静态词向量基于 Word2Vec 算法,根据单词与指定窗口(大小的)上下文间的搭配关系来训练词向量,它有根据上下文词预测中心词(CBOW)和根据中心词预测上下文词(skip-gram)两种实现方法2,它们本质上都是一种多分类问题。

其中,上下文窗口大小是一个超参数,窗口越大(可直至扩大到全文)训练出来的词向量捕捉词语间共性信息(文本全局信息)的能力越强、但捕捉词语个性信息的能力也就越弱,上下文窗口越小则反之亦然。换句话说,上下文窗口越大,同类词向量(如:篮球、足球、游泳三个同属于运动类别的词)间的相似度就越高、但(同类)不同词的词向量间的语义差异也就越小(也就是说篮球可能和游泳表示几乎相同的词语含义)。

Word2Vec 算法训练词向量的上下文窗口大小一般远小于全文长度(常在3~5之间),它具有善于捕捉局部文本特征(产出向量的词义区分度良好)且训练发生在局部、训练效率高的有点,但也不可避免的有缺失从全局的视角掌握语料的考量。Glove是一种在SkipGram基础上,加入全局语料特征考量的改进算法,它是目前最常用的静态词向量训练算法。(更多静态词向量内容,可参见作者文章《 文本表示:静态词向量模型》)

值得注意的是:静态词向量不论在何种语境下,都将单词编码成同一种向量表示(一种向量表示(隐式地)表达一类语言含义),这难以充分表达一词多义的情况。

3.2 动态词向量

动态词向量可以视语境不同,将单词编码成对应语言含义的向量表示,这与静态词向量相比,能更好的适应一词多义的真实语言表达需求。常见的动态词向量有ELMo、GPT 和 BERT 等,它们基于特定语言模型训练产生。

实际开发中,不论动态词向量还是静态词向量基本都需要在具体任务中进行微调(fineturn)使用,其具体做法是:将(下载到的)训练好的词向量,作为 embeding 层的初始化权重3,然后随下游任务训练一起优化 embeding 层模型参数


  1. 当然,也可通过Bert模型的 CLS 字符输出向量获得句子的文本表示,这在得到精确的句向量表示的同时,也消耗大量的计算成本,在实际任务中如非必要并不常用。 ↩︎

  2. 其中 skip-gram 更常用,因为一般它效果更好。 ↩︎

  3. embeding 层在模型中,负责文本的向量化编码(即:词向量编码) ↩︎

你可能感兴趣的:(#,自然语言处理,数据挖掘,自然语言处理,python)