自然语言处理语序问题及解决思路(部分附源码实现)

在自然语言领域,语序问题对于文本特征表述,生成序列等场景都有很强的影响份量。本文将专门针对此场景进行理论汇总。同时将给出解决方案。

一.语序对于文本特征提取的影响与优化
在自然语言领域,对于文本特征提取方式,从当初基于词频构建的矩阵,由于缺乏对于同义词辨析与文本上下文信息的解读,使得模型训练依然存在较大误差。到后来基于词相似度所构成的Word2vec词向量方案及后续变种出现后,解决了部分文本上下文信息问题,但依然存在词义辨析问题。鉴于此,为了更好的从文本中提取信息,这里就引出了下面要描述的一种词位置矩阵——Position Embedding方案。

将Position Embeding机制发扬光大的,正是谷歌《All you need is attention》这篇论文。其原理在于通过word embedding嵌入层进行词组look up操作后,将所生产的张量E进行进一步特征提取。张量E的宽度为d维,则在张量E的第I维则通过以下式子进行转换计算。同时,式中pos表示张量E的每一个列元素。

图1 POSemb图

Position Embeding一般放置于词嵌入层后使用,在Transformer模型中,position embedding替代了传统RNN与cnn,直接通过记录词位置,作为文本上下文信息表征结构。而2018年谷歌Bert模型利用此机制对文本特征提取这一块进行改善,其将word embedding,句子层面嵌入向量和POS EMB三者相加进行结合训练。由此可见,POS EMB机制的有效性。

图2 BERT图

我在此基于keras复现此机制,详情请点击查看。

二.语序对于序列生成的影响与优化

首先先提一下语言模型的概念吧。设一段文本序列长为n,其表征为x={x1,x2,x3,x4,……,xn}.则最终生成的该序列x概率可用条件概率表示: P=P(x1)P(x2|x1)P(x3|x2x1)P(x4|x3x2x1)……P(Xn|x1,x2,x3,x4,…,xn-1).因此在序列生成情况过程中,其条件概率分布及蕴含了文本上下文信息,从而可以看出语序对于文本而言重要性不言而喻。

在文本序列生成场景中,最常见的莫过于文本摘要,机器翻译,生成式对话,自动对联等应用场景。其原理基于seq2seq结构模型进行训练,通过Encoder将原始文本序列进行特征提取,转换为数字编码,生成隐藏状态向量state。之后与decoder端T0时刻目标文本序列构成的张量进行合并,从而输出T0+1时刻的目标文本序列。而在预测阶段的文本序列生成时,由于生成的文本是根据概率来分布,组合情况有多种,因此确认最优效的序列并进行输出便有了重要意义。在此阶段,我们可以使用集束搜索进行优化(Beem Search)。

BeemSearch原理大致如下:1.我们假设在Decoder端要生成序列A,B,C,D.若我们设置Beem search的词表大小为2,则预测阶段先生成词A作为序列开头位置。2.当后续要输入第二个词时,此时将会计算P(AB),P(AC),P(AD),P(AA)四种序列语言模型的概率大小。3.从中选出最大的概率P(AB)=P(A)P(B|A)。从而选择AB序列输出。4.后续又从词B开始,按照上述流程依次输出,直到输出整个序列ABCD为止。

BeemSearch实现很简单了,在decoder输出概率后,对其进行相应生成序列概率计算,即可完成整个序列生成步骤,此处不再举代码例子。

就到此为止吧!