简介
序列标注问题:给定一个句子x1…xn,生成一个与之对应的序列y1…yn.如词性标注。
序列标注的目标是从训练数据中学习一个从句子到标注序列的映射。
两种标注问题:词性标注和命名实体识别
词性标注
词性标注的一个难点是歧义。英文中的许多单词可以有不同的词性。另外一个问题是训练语料不可能穷尽所有的单词,如何确定训练语料中没出现过单词的词性同样值得研究。
词性标注时,有两种有用的信息值得考虑。第一是单个单词的词性统计性特征。某些单词更有可能是名词而某些单词更多的是动词。如quarter既可以做动词又可以做名词,但是更多的时候做的是名词。第二种信息是第一个单词来说上下文的信息对其有影响。譬如名词后面更多的接动词而不是形容词,而名词前面更多的是形容词而不是副词。当然,有时候这两种信息表现的并不一致,甚至会出现相互冲突的现象。这在后面的模型中会具体考虑这个问题。
命名实体识别
命名实体识别的输入是一个句子,目标是将句子中的所有已定义的命名实体找出来(如人名、地点名或者公司名等)。句子中的每个单词或者是每个命名实体的开始(如SC表示公司名的开始)、继续(如CC为公司名的非其实单词)或者非命名实体单词(NA).
生成式模型以及噪音信道模型
自然语言处理中的许多问题都是监督式的学习问题。例如在标注问题中,我们要从训练样本中学习一个输入x到标记序列y的映射。在机器翻译中,输入x可以是源语言,输出y是需要得到的语言。在语音识别当中,输入是语音,输出是文字。所有这些问题都是要学习从输入x到输出y的一个映射函数,通过给定的标记数据。
一种方式是定义映射f(X)为条件概率。在这种方法种,会有一个条件概率模型对所有的x,y定义了所有的条件概率:p(y|x).模型的参数通过训练语料学习得到。对于测试集中的一个数据x,模型的输出就是:
f(X)=argmax
y∈Yp(y|x)
.也就是将最有可能的输出作为真实的输出。
另外一个在自然语言处理和机器学习中用的比较多的方法是定义一个生成式模型。而不是直接估计条件概率p(y|x).在生成式模型中会学习联合概率模型p(x,y).模型的参数仍然从训练预料中学习得到。在许多情形下会将联合概率写成:p(x,y)=p(y)*p(x|y).然后分别估计p(y)和p(x|y).这两个部分又有如下解释:
- p(y)是关于y的先验概率分布。
- p(x|y)是给定y生成x的条件概率。
通过联合概率以及贝叶斯公式,我们可以得到p(y|x)=p(y)p(x|y)/p(x).然后求argmaxp(y|x).这种将联合概率分解为p(y)和p(x|y)的模型被称为噪音信道模型。直观来讲,生成模型的过程如下:首先通过概率密度p(y)生成一个标记y,然后又根据条件概率密度p(x|y)生成x.我们目标是当我们给定x之后寻找最有可能生成x的y.其中给定输入x寻找输出f(x)的问题被成为解码问题。
生成序列模型
对于序列标注问题,如何通过生成式模型来求解。
这里面有三个基本问题:
- 如何定义生成式序列模型p(x1…xn,y1…yn)?
- 如何从训练语料中估计出模型的参数
- 对于输入x1…xn,如何有效的找到y1…yn使得p(x1…xn,y1…yn)最大
三元隐马尔可夫模型
如何定义生成式序列模型p(x1…xn,y1…yn)
隐马尔可夫模型的关键就在于定义
p(x1…xn,y1…)=
∏n+1i=1p(yi|yi−2,yi−1)
∏ni=1p(xi|yi)
其中
y0=y−1=∗
在三元隐马尔可夫模型下,句子生成的步骤如下:
- 初始化i=1并且 y0=y−1=∗
- 根据分布 q(yi|yi−2,yi−1) 生成 yi
- 如果 yi=STOP ,返回 y1...yn,x1...xn ,否则根据条件概率 e(xi|yi) 生成 xi 并且i+1返回第二步
估计模型的参数
模型参数的估计采用最简单的极大似然估计,就是统计训练语料中相关词、词性出现的次数,然后做除法。为了避免数据稀疏的问题,可以采用语言模型中的平滑处理方法,就是一元、二元、三元模型估计一块上,最后做个折中。如 q(s|u,v)=a1* qML(s|u,v) +a2*q qML(s|v) +a3* qML(s)
解码方法
对于给定的输入语句x1…xn,解码算法是找出最有可能的序列y1…yn.
最简单的方法就是枚举法,就是遍历整个解空间,寻找是概率p(x1…xn,y1…yn)最大的y1…yn.但是这种方法对于标记词典大小为n,句子长度为m的情况,总的可能序列是
|n|m
种,显然时间复杂度太大。
维特比算法
枚举法的时间复杂度太高,采用动态规划的维特比算法。
输入仍然是句子序列x1…xn.对于这个句子,对于任意的
kin1...n,
对于任何序列
y−1,y0,y1,...yk,其中y−1=y0=∗
,定义如下方法:
r(y−1,y0,y1,...,yk)=∏ki=1q(yi|yi−2,yi−1)∏ki=1e(xi|yi)
因此:
p(x1...xn,y1...yn+1=r(∗,∗,y1,...,yn)∗q(yn+1|yn−1,yn)=r(∗,∗,y1,...,yn)∗q(STOP|yn−1,yn)
定义
π(k,u,v)是对长度为k,以u,v结尾的序列的最大标记序列。
令
π(0,∗,∗)=1
有如下迭代公式
π(k,u,v)=max(π(k−1,w,u)∗q(v|w,u)∗e(xk|v))
算法逐步的计算
π(k,u,v)一直到k的长度为n为止
完整的解码算法如下:
也可以在每一步存储使得当前序列概率最大的标记。其算法如下:
总结
对于序列标记问题的相关要点如下:
首先学习一个三元的隐含马尔可夫模型,这个模型有参数:q(s|u,v)和e(x|s). 定义任何句子和标记的联合概率为(其中 yn+1=STOP ):
p(x1...xn,y1...yn+1)=∏n+1i=1q(yi|yi−2,yi−1)∏ni=1e(xi|yi)给予一个训练语料,可以使用最大似然估计获取上述的参数:
q(s|u,v)=c(u,v,s)c(u,v)
e(x|s)=c(s−>x)c(s)给定一个句子 x1...xn 以及由2估计的参数q和e(即训练好的隐马模型),通过维特比解码算法(figure 2.5)获得概率最大的标记序列。