一、序言
文本处理方式是深度学习领域中自然语言处理的基础,即把文本转变成计算机识别的语言过程。转变之后才能用算法做后续的文本分析和理解。所以有必要了解文本处理的几种方式,做到对不同的场景采用不同的处理方式。
常见的文本处理方式有独热编码(one-hot),词袋法(Bag of words),TF-IDF和词向量(Word2Vec)这4种,我们分别为大家解释。
二、文本处理方式之独热编码(one-hot)
首先给大家解释的是独热编码,也称为one-hot编码,是最基础,同时也是用的较多的一种处理方式。
我们举个例子解释下one-hot过程。假设文本有三句话:分别为
我爱北京。
爷爷奶奶爱北京。
我爱爷爷奶奶。
按照one-hot处理步骤,首先需要将语料库的每句话分成单词,即为[我,爱,北京,爷爷,奶奶],总共5个单词,构成一个词典,如图所示:
5个单词构成的词典示例
这相当于字典中只有这5个单词,每个单词对应一个编号。然后分别对每句话中的单词判断,在字典中出现表示为1,不在字典中出现表示为0。
我们先看下第一句话的表示形式,如图:
句子1的one-hot编码示例
可以发现对于"我爱北京" 来说,"我"在词典中出现,所以表示为1。"爱"在词典中出现,表示为1。北京也同样在词典中出现,所以也表示为1。而"爷爷","奶奶" 在这句话里面没有涉及,所以表示为0。最终第一句话表示为[1,1,1,0,0]。这就是第一句话对应的独热编码。
我们再看下第二句话"爷爷奶奶爱北京"的one-hot表示。如图所示:
句子2的one-hot编码示例
可以发现同样对于"爷爷","奶奶","奶","北京",这几个单词来说都分别在词典中出现,所以表示为1。而"我"没有出现,表示为0。最终第二句话的one-hot表示为[0,1,1,1,1]。
同理,第三句话one-hot表示,如图所示:
句子3的one-hot编码示例
这里同样也是将句子中出现的单词在文本中表示为1,没有表示的为0。最终第二句话的one-hot表示为[0,1,1,1,1]。
通过以上案例可以发现,独热编码的处理方式的优点是比较简单,容易理解,并且方便操作。
三、文本处理方式之词袋法(Bag of words)
因为one-hot只是表示单词出现还是不出现,所以这种方法有一个比较明显的问题,就是不能体现单词的重要程度。
对于一个文本来说,如果频繁出现某个词,可能意思更倾向于这个单词所表示的主题思想,如下举例:
我爱北京天安门,天安门上红旗飘。
我爱北京。
我爱中国北京。
首先同样还是按照文章中所有出现的单词构造字典。如下:
8个单词组成的词典示例
如果按照one-hot编码的话,结果如下:
三个句子对应的one-hot编码结果
对于第一句话来说,"天安门"出现了两次,所以第一句话的中心思想应侧重强调于对"天安门"这个词的表达。而在上图中one-hot编码这种方式表示仅仅表示了单词"天安门"出现或者不出现,不能很好的突出这个单词在文本中的重要性。
因此我们用词袋法来表示,词袋法主要是统计了每个单词出现的频数,作为当前单词的表达形式。结果如下:
三个句子对应的词袋法表示结果
可以发现对于第一句话,词袋法将"天安门"这个单词表示为2,这样文本在考虑中心词的时候会更倾向于"天安门"这个词的表达,从而更好的体现文章思想。
通过以上案例可以发现,词袋法的处理方式优点是能够体现单词的重要程度。
四、文本处理方式之TF-IDF
从one-hot到词袋法,虽然考虑了单词出现的频数,以单词的频数来表示单词所表达的思想的重要性。
但是这里会有一个问题,单词次数越多,会越重要吗?
比如一篇文章出现好多个"我","我"这个词就一定重要吗? 答案是不一定的,真正重要的不是单词本身,而是这句话所要表达的主题才是最重要的。
所以才有了TF-IDF的发展,其中TF表示的含义是 term frequency就是词频,DF是Document Frequency即文档的频率。I是Inverse,求逆,也就是TF值除以DF值的含义。
我们举个例子来进行讲解,比如以下文本:
1、我爱中国
2、我爱北京
对于以上两个句子中每个句子对应的词频如下:
句子对应的词频示例
这也正是我们的TF。我们再看下对应的DF,DF实际上为每个单词在所有文本中出现的个数。所以DF表示如下:
文档频率示例
对应单词的TF除以DF如图所示:
每个单词的TF-IDF结果示例
可以发现对于句子1,"中国"的TF-IDF值最大,所以第一个句子的主题倾向于"中国"。对于句子2,"北京"的TF-IDF值最大,所以第二个句子的主题思想倾向于"北京"。而文本中的"我"和"爱"因为在各个文本中都有涉及,所以在表达主题上面,其实没有太大的参考意义,因此对应的DF值比较高,最后再通过TF相除之后,TF-IDF值就比较低了。
通过以上案例可以发现TF-IDF处理方式,它除了考虑词频,还考虑了单词在整个语料库里面的频率,这会让一些大部分文本中都有的词对应的权重降低,从而更好的突出文章主题。
五、文本处理方式之词向量(Word2Vec)
以上三种方法,一般来说是比较基础和简单的了,但是它们都忽略了句子单词之间的语境,或者理解为忽略了单词之间的顺序。
举个例子,比如:"我爱苹果" 这里面的"苹果"代表什么意思呢?它是我们所说的苹果手机还是吃的苹果呢?
日常生活的苹果和苹果手机的理解示例
如果按one-hot,词袋法或者TF-IDF中的任何一个算法来计算的话,都是有歧义的。因为这些算法没有考虑单词之间上下文的关系。
举个例子理解下单词之间上下文的关系:比如对文本"我想吃苹果",对于人来说,它吃的一定是水果,不是手机,那怎么能让计算机知道呢?就得靠"苹果"前面的"吃"这个字,来体会到后面是水果。再比如对文本"我想玩苹果",一般情况下它是手机,它就根据前面的"玩"来定义它是苹果。
所以句子的上下文对于词语表达的方式是很重要的一个信息。因此词向量算法应运而生,字面理解,词向量就是把一个词变成向量。只不过在词向量算法里面相近的词位置比较近。
那什么是向量?向量就是高维空间里面的一个点,如果把一个词变成了向量,词就在高维空间里面有个位置。假设文本中"苹果"和"梨"单词的位置表示如图:
单词的词向量表示示例
那此时"苹果"的含义可能是水果,因为离梨比较近。
如果此时最终训练的词向量表示如图所示:
单词的词向量表示示例
那此时"苹果"的含义可能是苹果手机,因为离"华为"单词比较近。
词向量训练本身是一种浅层的神经网络算法,需要我们算法模型不断学习的,最终可以将单词表示成一定维度的向量,它考虑了上下文之间语义的联系,能够很好的表达词真正的含义。
六、总结
文本处理方式比较普遍的就是以上4种,我们要结合不同的情形分别应用。
举个例子,一般来说,对于离散型的特征和标签,我们需要表示为one-hot编码。而对于深度学习算法中的场景,我们的文本需要转成词向量,嵌入到神经网络最开始的层次里面,作为预训练的基础。所以大家需要结合实际工作业务,选择对应的文本处理方式即可。