一文掌握:NLP中如何实现对文本数据的编码?
在自然语言处理中,找到一种能在系统中将数据表示出来的方法(如将一系列文本在文本分类器中表示出来)是至关重要的。如何对这些分类数据进行编码以使其符合统计分类器的要求?答案是输入词汇向量。本文介绍了两种文本数据的编码途径:稀疏向量(又称“one-hot 编码”)和密集向量。
自然语言处理中,自然语言处理的数据表示是一个非常重要的方面。和其他的机器学习任务一样,自然语言处理也需要找到能将我们的数据(一系列文本)在系统中(例如文本分类器)表示出来的方法。正如Yoav Goldberg 所问,“我们怎样对这些分类数据进行编码以使其符合统计分类器的要求?”答案是输入词汇向量。
来源: Yandex Data School Natural Language Processing Course
首先,在探讨“怎样将词语转换成数字表示”这一问题之前,先想一想,在对数据进行编码中,我们感兴趣的是什么?更准确来说,我们编码的是什么?
从一系列原始文本或预处理文本中的词汇特征,诸如单词、字母、词性标注、字排列、词序等等,到一系列向量,这些都是要编码的内容。对文本数据的编码有两种实现途径:稀疏向量(又称“one-hot 编码”)和密集向量。
one-hot编码
在神经网络广泛应用在自然语言处理NLP前,即在传统的自然语言处理中,对文本的向量化是通过one-hot编码来是实现的。需要注意的是,在一些实践中,one-hot编码仍然是一种有效的编码法,再加上其融合了神经网络技术,所以其目前还未过时。在one-hot编码中,每一个单词或形符都对应着一个向量。
来源: Adrian Colyer
例如,可以将上图编码作为代表“The queen entered the room.”这一个句子向量表示的一小段。注意,在这里,只有元素(element)“queen”被激活了(activated),其他的元素如“king”“man”等都没有实现激活。若以上图向量元素部分表示“The king was once a man, but is now a child”,它的one-hot向量表示会有所不同。
对数据库进行one-hot编码处理的结果就是稀疏矩阵。想象一下,如果你拥有一个由两万个单词组成的语料库,在这个语料库中,对一篇可能由40个单词组成的短文档进行one-hot编码后得到的是一个有两万行的矩阵,其中每一行代表一个单词。该矩阵非零元素最多40个,如果在这40个单词中存在大量的非唯一的单词,非零元素可能会更少。这样一来,矩阵中就会存在很多零元素,这最终会需要占据大量的内存以存储这些稀疏表示(spare representations)。
除了潜在的内存容量问题外,one-hot编码的一个很大的缺陷在于缺乏意义表达。虽然我们可以用这种方法获得特定文本中的单词是否存在的信息,但是不能简单地从这些单词中确定任何意义。这个问题的部分原因是,通过使用one-hot编码,我们就不知道词与词之间的位置关系或者词序。这个顺序在用文字表达意义上是最重要的,这在后文也会提到。
另外,在one-hot编码中单词相似度也很难看出来,因为词向量是统计正交的。以“dog”和“dogs”或者“car”和“auto”为例。这两对词组无疑分别在不同方面存在相似性。在线性系统中进行one-hot编码时,通过在预处理过程中使用传统的自然语言处理工具,如词干提取和词形还原,就可以显示第一组词语之间的相似性。然而,我们需要一种更可靠的的方法来发现第二组词语间未显示出来的相似性。下面对此进行说明。
经过one-hot编码的词向量的主要好处在于,它实现了二进制词的共现(也称“一组词”),这使得一系列广泛的自然语言处理任务得以执行,比如作为该领域最有用和最常见任务之一的文本分类。这种类型的词向量对于线性机器学习算法和神经网络很有用,尽管这两者都主要与线性系统相关联。One-hot编码的变体中对线性系统有用且能帮助克服上面所提问题的是n-gram和TF-IDF表示法。尽管它们不同于one-hot编码,但相似之处在于它们都是与嵌入完全不同的简单向量表示,下面将对此进行介绍。
密集向量
在将特定的文本数据以一定方式表示出来,尤其是在考虑二进制词共现的情况下,稀疏词向量似乎是一种完全可行的方式。我们还可以使用相关的线性方法,比如N-grams和TF-IDF,来解决one-hot编码的一些最严重和最明显的缺点。但是,如果仍然采取这种方法,而不换另一种方法的话,要理解文本的核心意义以及形符之间的语义关系仍然很困难,而词嵌入向量就是能够解决以上难题的一种方法。
在“传统”的自然语言处理中,可以使用人为操作或习得的词性标注(POS)等方法来确定文本中的不同形符来分别执行何种功能(名词、动词、副词、不定冠词等)。这是人为特征任务的一种形式,这些特征可以用于自然语言处理函数的各种方法中。例如,命名实体识别,如果我们在一段文本中寻找命名实体,那么合理的做法就是首先只看名词(或名词短语),因为命名实体几乎是名词的一个专属子集。
但是,如果我们将特征表示为密集向量,也就是说,将核心特征嵌入到为d维的嵌入空间中。我们可以将一个用来表示20000个单词的维度压缩到50或100个维度。在这种方法中,每个特性不再有自己的维度,而是分别映射到一个向量上。
如前所述,结果表明意义并不是与二进制词的共现相关,而是与词的位置关系相关。可以这样想:如果说“foo”和“bar”这两个词同时出现在一个句子中,那么判断其意思是很困难的。然而,如果说“The foo barked, which startled the young bar”,判断这些词的意思就更容易了。单词的位置及其与周围单词的关系是非常重要的。
“通过一个词所搭配的单词,它的意义就清晰了”---John Rupert Firth
来源:Adrian Colyer
那么,这些特征到底是什么呢?单词间关系的重要层面由神经网络来决定。虽然人类对这些特征的解释并不可能是完全准确的,但是上图展示了其基础过程,这与著名的“国王-男人+女人=女王”的例子有关。
这些特征是如何习得的呢? 答案是使用一个二层(浅层)神经网络,而词嵌入通常与自然语言处理的“深度学习”组合在一起,但是构建词嵌入的过程并没有用到深度学习,尽管学习权重(learned weights)通常用于深度学习任务的后续阶段。
流行的原始word2vec词嵌入法包括连续性词袋(即CBOW模型)和Skip-gram模型,这两种模型都是在给定语境的条件下预测目标词或者在给定词的条件下预测语境(注意这里的“语境”指的是文本中词的滑动窗口(a sliding window of words in the text))。
我们并不关心模型的输出层,因为输出层在训练后就会被丢弃,而嵌入层的权值将会被用于后续的自然语言处理的神经网络中。这种嵌入层类似于one-hot编码方法中构建的词向量。
编译组: 狄思云、胡婷
相关链接:
https://www.kdnuggets.com/2018/11/data-representation-natural-language-processing.html
如需转载,请后台留言,遵守转载规范