文本深度特征提取
注:本文内容摘自《深度学习算法实践》
为何要研究文本深度特征?
——因为文本深度特征无论对于文本分类还是文本预测,都是非常重要的。
文本特征的提取说白了就是将自然语言理解的问题转化成机器学习的问题。第一步肯定是找一种合适的方法,把语言表达数学化,即用可量化的方式来表示文本的特征。
下面将简单介绍一下文本的深度特征是如何量化的。
- 词特征表示
文本的深度特征有四种表示方法:
- 词表法
顾名思义,就是把词进行剔重、排序,和相对应的序号一一对应,形成字典。
举个例子:
"今天天气甚好"
(今天,1)
(天气,2)
(甚好,3)
那么,今天天气甚好,用向量表达就是[1,2,3],这样就方便扔到模型中进行计算了。
一般来说,对于Embedding层的输入基本上都使用词表示法处理后的向量表达。
Embedding层是什么?
是将词表中的单词在字典中的位置(索引)映射为固定维度的稠密的向量。
在Embedding这种结构出现之前,一般先用word2vec计算词向量,然后将词向量作为模型的输入层,计算词向量部分和模型是两个部分,而embedding出现后,就将这两个部分合并在一个模型中,输入层数据不是词向量,而是词在字典中的位置。Embedding主要不是作为降维使用,而是作为一种特征表示使用。
- One-Hot表示
原理很简单,就是将每个词表示为一个向量,向量的长度就是句子的长度。在向量中,该词出现的位置填1,其他位置填0,那么这个向量就代表了当前的词。
缺点:存储空间浪费巨大,矩阵稀疏问题明显。不利于存储和处理,也就是我们常说的维度灾难。
- n-gram模型
n-gram模型也叫N元模型,是自然语言处理中一个重要的概念。它突出的是一个组的思想。1gram可以是一个单词或者是一个中文汉字。对于字符串s,n-gram就是按长度N切分原词得到的词段。通常在NLP中,可以基于一定的语料库,利用n-gram来预计或者表示一个句子,另一方面,可以用n-gram来评估两个字符串之间的差异程度。
Unigram指的是单字;Bigram指的是双字;Trigram指的是三个字。
举个例子:
首先分词:
分词结果:
鲁迅/老师/生前/是/一位/革命家,死后/仍然/是。
调用ngram函数,定义n=3时的输出结果为:
鲁迅/老师/生前
老师/生前/是/
生前/是/一位/
/是/一位/革命家
。。。
skip-gram,"skip"就是指需要跳过多少个字符,其参数也多了一个K来决定输入值需要跳过几个词。
模糊匹配算法的关键在于如何衡量两个相似单词之间的差异,这个差异用书面语言称为"距离"。这种基于距离的衡量有很多种方法,而n-gram就是其中的一种。
有学者提出下面的公式来表示这种距离。
假设我们要比较字符串s和字符串t,要算出这两句话的距离,可以应用下面的公式:
|s中的n-gram数| + |t中的n-gram数| - N*|s和t共有的n-gram数|
字符串s=" 鲁迅/老师/生前/是/一位/革命家,死后/仍然/是。"
字符串t="鲁迅/老师/生前/是/一位/革命家/和/作家/,有/很多/伟大/的/作品"
s 的3-gram数为9,t的3-gram数为11。共有4,根据公式(9+11)-3*4 = 8。
则这两句话的距离为8。
利用n-gram可以衡量词和词之间的距离,进而能衡量词与词之间的关系???
--------------------------这里不应该是衡量的是句子和句子之间的距离吗?
除了用n-gram直接提取特征外,还有什么方法能更进一步,用一组固定向量来表示一个词呢?词嵌入(Word Embedding)给了我们答案。
- 分布表示和词嵌入特征表示
Distributed Representation(分布表示)最早由Hinton在1986年提出。它是一种低维实数向量,这种向量一般长成下面的样子。
[1.2,3,23,3434,-5435,3242,…]
维度以50维和100维比较常见,当然了,这种向量的表示不是唯一的。
一段文本的语义分散在一个低维空间的不同维度上,相当于将不同的文本分散到空间中不同的区域。分布表示是文本的一种表现形式,具体维稠密、低维、连续的向量。向量的每一维都表示文本的某种潜在的语法或语义特征。
2003年Bengio提出NPLM的时候,在模型中去学习每个词的一个连续向量表示,并经过Tmoas Mikolov等人的发展,发展出Word Embedding(词嵌入)。
词嵌入就是将每个词映射为一个向量。
Word Embedding 使寻找相关或者相似的词成为可能。向量的距离可以用最传统的欧式距离来衡量,也可以用cos夹角来衡量。用这种方式表示的向量,"明天"和"今天"的距离会远远小于"明天"和"你"的距离,甚至在可能的理想情况下,"明天"和"今天"的表示应该是基本一致的。
这样两个词之间就可以进行比较了。当然,在这个方法下相似度高的两个词,并不具有相同的语义,它只能反映出两者经常在相近的上下文环境中出现。
前文提到在Embedding这种结构出现之前,一般先用word2vec计算词向量,word2vec也是词嵌入的一种实现方式。它目前使用的神经网络模型有两种:CBOW和skip-gram。
这两种模型都很简单粗暴。
在CBOW方法里,训练目标是给定一个word的context,预测word的概率;
在skip-gram方法里,训练目标则是给定一个word,预测word的context的概率。
skip-gram的输入是当前词的词向量,而输出是周围词的词向量。也就是说,通过当前词来预测周围的词,而cbow模型正好是将输入输出调转。
来源:https://www.cnblogs.com/xmd-home/p/9568138.html