1.基于字标注的分词方法

基于字标注的方法的实际上是构词方法,即把分词过程视为字在一串字的序列中的标注问题。由于每个字在构造成词的时候,都有一个确定的位置。也即对于词中的一个字来说,它只能是词首字、词中字、词尾字或单字词一个身份。

以常用的4-tag标注系统为例,假如规定每个字最多有四个构词位置,即:

B(词首)

M(词中)

E(词尾)

S(单独成词)

这里的$\lbrace B, M, E, S\rbrace$就是4-tag标注系统中的四个位置标注。

那么对于任意一个已经过分词的句子,我们都可以用这4个标注组成的序列,表示原来的分词结果。例如:

分词结果:我/爱/北京/天安门/。/

字标注形式:我/S 爱/S 北/B 京/E 天/B 安/M 门/E 。/S

需要指出的是,这里的”字”不只限于汉字,它可以是文本中出现的任何一个字符。因为在真实中文语料中,不可避免地会包含一些数量的非汉字字符,这里所说的”字”也包括外文字母、阿拉伯数字和标点符号等字符。所有这些字符都是构词的基本单元。

基于字标注的方法,把分词从原本的切分问题转化成一个序列标注问题。对于一个含有n个字符的句子$c_1^n=c_1 c_2 … c_n$,可以用下面的公式表示分词原理:

$$P(t_1^n|c_1^n) = \prod_{k=1}^n P(t_k|t_1^{k-1},c_1^n) \approx \prod_{k=1}^n P(t_k|t_{k-1},c_{k-2}^{k+2})$$

其中,$t_k$表示第k个字的标注,即$t_k \in \lbrace B,M,E,S \rbrace$。而$c_{k-2}^{k+2}$表示取词窗口的大小为5。

而把分词过程视为字的标注问题的一个重要优势就是,它能够平等的对待词表词(In-Vocabulary)和未登录词(Out-of-Vocabulary)。

这样,文本中的词表词和未登录词都是用统一的字标注过程来实现的。在学习架构上,既可以不必要专门强调词表词信息,也不用专门设计特定的未登录词识别模块。

机器学习的模型算法可以专注地从文本语料中学习规律,仔细想想这其实更类似于人类早期学习语言的过程。基于字标注的方法也是目前最主流的中文分词方法。

2.感知器算法

感知器算法是一个可以解决二分类问题的线性分类模型,其模型对于一个初学者来说都是很容易就可以理解的。基础的二分类感知器这里不再多做介绍,我们把目光转向分词算法所需的多类感知器算法身上。

多类感知器是感知器算法用于解决多类分类问题时的一个扩展,它的主要思想是:用多个感知器去进行多类分类,但每个感知器只将一类目标视为正例,而其他的目标均视为负例。

如上图,假设现有一个c类感知器,可用于c个类别的分类。$X^i$(i=1,2,…,N)是一个样本,感知器有4个权重向量$\theta_j$(j=1,2,…,c),则样本$X^i$的类别决策可由如下公式得到:

$$C^i=arg \max_{j=1,2,…,c}{\theta_j^TX^i}$$

而多类感知器的更新规则也与原始感知器稍有不同。首先给出多类感知器的代价函数(Cost function):

$$J_p(\theta)=\sum_{k=1}^N( \max_{j=1,…,c} \theta_j^T x^{(k)}-\theta_{y^{(k)}}^T x^{(k)} )$$

参数的更新规则(Parameter update rule):

$$\theta_j:=\theta_j-\alpha ( 1\lbrace j=C^{(k)}\rbrace – 1\lbrace j=y^{(k)}\rbrace )x^{(k)}$$

这里的$$C^{(k)}=arg \max_{j=1,…,c} {\theta_j^Tx^{(k)}}$$

而根据$C^{(k)}$和$y^{(k)}$的关系,又可以细化为:

用简单一句话来说就是,对于错分类样本,让错的感知器权重缩小一点,让应该对的感知器权重增大一点。这样“此消彼长”,经过几次迭代后就可以正确分类这一个样本了。

3.基于感知器的中文分词算法

3.1将感知器用于分词

多类感知器已经可以应付多类分类的问题了,那么它和中文分词有什么联系呢?连接中文分词与多类感知器的桥梁,就是基于字标注的分词方法。

应用基于字标注的分词方法,分词由切分问题转化为序列标注问题。每个字都有一个标注,也就是说每个字属于一个类别,那么给出一个字的标注的过程其实是一个分类过程。所以,利用多类感知器我们可以解决这样一个问题。

接下来,将要解决的问题就是如何进行特征表示,将文本语料转化成可用于感知器训练的特征向量。

3.2特征模板

特征模板是抽取语料特征的模式,是词特征学习的基础。(The feature template is the pattern of feature extraction from corpus, and the basis of corpus lexical feature learning.)

句子中的每一个字都会根据特征模板生成特定的特征,我对这些出现的特征进行统计记录,并生成了特征空间。

我的算法所使用的特征模板如下:

(1)$C_n (n=-2,-1,0,1,2)$
(2)$C_n C_{n+1} (n=-2,-1,0,1)$
(3)$C_{-1} C_1$

其中,$C_n$表示处于第n个位置的字。当n=0时,表示当前字。

仍旧以句子『我爱北京天安门。』为例。假设$C_0$为北,则按照模板将产生以下特征:

我,爱,北,京,天

我爱,爱北,北京,京天

爱京

以上三组分别对应特征模板中的(1),(2)和(3),可以看到特征模板(1)抽取出了一元特征(unigram),(2)和(3)抽取出了二元特征(bigram)。这些字以及字和字的二元组合就构成了不同的特征,之后采取一定的特征表示方法,将这些字符信息转化成数字信息构建特征向量就可以制作可供感知器训练使用的数据了。

在这里,我采用的方法简单粗暴,就是按照unigram和bigram分类,分别统计出现过的不同特征,并给每个特征一个序号,这个序号就是特征向量的维度信息。当然,特征表示的方法不唯一。

3.3Viterbi算法求解最优标注结果

维特比算法(Viterbi algorithm)是一种动态规划算法。它用于寻找最有可能产生观测事件序列的-维特比路径-隐含状态序列。这本是常出现于隐马尔可夫模型(Hiden Markov Model)中的术语,不过Viterbi算法也常被用于寻找观察结果最有可能解释相关的动态规划算法。

在基于字标注的中文分词中,每个字常常以某个概率被标注为标注集中的某个tag。若以每个字最大概率的标注的序列作为一句话的标注结果时,其结果的准确率和分词的效果往往不好,有时可能还会出现不符合分词规则的结果,比如标注”B”后一个标注为”S”。所以,就需要在以句子为整体,在序列上求得最优的标注结果。为此,需要利用Viterbi算法求解这个标注结果。

为了应用Viterbi算法,我们需要一些定义一些模型参数,这里借鉴了隐马尔可夫模型。我们将4-tag标注系统中的标注集$S=\lbrace B, M, E, S\rbrace$当作隐含状态集,而可观察状态的序列就是未分词的句子。

假定从语料中统计得到,初始状态i的概率为$\pi_i$,从状态i转移转移到状态j的转移概率为$\alpha_{i,j}$(这两部分的概率矩阵是通过对训练语料的标注统计得到的。)。

现有一句中文语句$C^{1:N}=c_1 c_2 … c_N$作为观察状态序列,产生此观察状态序列的最有可能的隐含状态序列(标注序列)$T^{1:N}=t_1 t_2 … t_N$可由以下递推关系给出:

定义$\delta_i(n)$为部分最大似然概率,即序号从1~n的字符子串的最大似然值,目表是求解出$T^{1:N} = arg \max_{T^{1:N}}P(C^{1:N}|T^{1:N})$,$\delta_i(t)$满足:

(1)$\delta_i(1)=P(c_1|t_1=i) \cdot \pi_i$
(2)$\delta_i(n)=P(c_n|t_n=i) \cdot \max_{j\in S}( \delta_j(n-1) \alpha_{j,i})$

其中$n\le N$,$\delta_i(n)$是以i状态为结尾的前t个观测结果最有可能对应的隐含状态的序列的概率。通过保存向后指针记录上面(2)式中用到的状态j可以获得维特比路径。令$Ptr(n,i) = arg \max_{j\in S}( \delta_j(n-1) \alpha_{j,i})$,表示n时刻的状态i是由n-1时刻哪个状态转移而来的,可得到:

$t_N = arg \max_{j\in S}( \delta_j(n-1) \alpha_{j,i})$
$t_{n-1} = Ptr(n,t_n)$

这里我们使用arg max的标准定义。算法的时间复杂度为$O(N\times \left|{S}\right|^{2})$。

由上面的这些公式可以看到,目前不能从语料中通过统计得到的就是$P(c_n|t_n=i)$,这其实是HMM中的发射概率。在我的算法中,这部分概率是由多类感知器给出的:多类感知器对当前字进行分类,输出它分别属于四个类别的概率,利用这个概率完成上述的计算。

java 对 英文分词 java实现分词_权重

如上图中,图中箭头所示路径代表的序列”S\S\B\E\B\M\E\S”为该句最优的标注结果。

例句『我爱北京天安门。』对应的可能标注序列为$4^{\left|C\right|}=4^8$个,其中还包括不符合分词规范的可能序列。使用暴力方法去求得最优标注序列实在是难为计算机了,为了求解出该序列,就需要使用维特比算法了。

4.总结

至此,一个基于感知器算法的中文分词算法的基本原理和关键算法已经讲述完毕。整个分词算法的基本思路与基于HMM或CRF的分词算法大体类似,只是在发射概率的计算上使用了多类感知器的分类结果的概率输出,而不是HMM给出。

在模型复杂度上,多类感知器比HMM或CRF简单不少,实现难度也低了不少。最后,我们使用SIGHAN2005(icwb2-data)的语料数据进行了分词实验。作为对比,我们使用同样的特征模板和语料,用CRF++工具训练了基于CRF的中文分词器(这部分的具体操作方法请看:中文分词入门之字标注法4)。以下是两个分词器的效果对比:

表1 PKU语料库上性能指标比较

PKU

CWSP

CRF

Recall

0.923

0.924

Precision

0.938

0.939

F1-Measure

0.930

0.931

OOV-Recall

0.578

0.595

IV-Recall

0.944

0.944

表2 CITYU语料库上性能指标比较

CITYU

CWSP

CRF

Recall

0.937

0.941

Precision

0.933

0.945

F1-Measure

0.935

0.943

OOV-Recall

0.648

0.685

IV-Recall

0.960

0.961

表3 MSR语料库上性能指标比较

MSR

CWSP

CRF

Recall

0.954

0.963

Precision

0.965

0.966

F1-Measure

0.960

0.965

OOV-Recall

0.687

0.698

IV-Recall

0.961

0.970

表4 AS语料库上性能指标比较

AS

CWSP

CRF

Recall

0.950

0.956

Precision

0.934

0.944

F1-Measure

0.942

0.950

OOV-Recall

0.634

0.680

IV-Recall

0.964

0.968

表格中,CWSP表示基于感知器的中文分词算法,CRF表示使用CRF++工具训练的分词算法。可以看到,基于感知器的中文分词算法的performance与基于更复杂模型CRF的分词算法相比相差不到1个百分点,是可以接受的结果。