词性标注方法

  • 格式:pdf
  • 大小:131.03 KB
  • 文档页数:6

词性标注方法 分词系统词性标注模块的基本需求即为对给定的一个分好词的句子,每一个词附上一些相应的词性。 e.g. 晚上 喝 水 WORD POS LIST 晚上 t 喝 Vg | e | v 水 Ng | j | n

词性标注一个可能的结果为: 晚上/t 喝/v 水/n 注:词性标注体系请参考附录部分,北大词性标注体系

以上功能的核心思想通过算法抽象一下即可转变为一个HMM(Hidden Markov Model)。HMM这名字起得比较直观形象。还以上面的例子来解释一下该模型的思想。 i) MM (Markov Model) MM 说的通俗一点就是一个条件概率问题,譬如说 “晚上 喝 水”这句话,如果需要计算其概率,假设用S代表整个句子,则有如下公式: P (S) = P(晚上 喝 水) 如果采用二元MM,同时结合链乘原理,有如下公式:(公式1) P(S) = P(晚上|) × P(喝|晚上) × P(水|喝) × P( | 水) 注: — 代表句子开始位置 — 代表句子结束位置 因此二元MM即等价于一个当前词仅依赖于紧邻历史词的条件概率。

ii) HMM (Hidden Markov Model) HMM其实源自于MM,不过这里引入了两个新的概念:Hidden、Emission。 Hidden我们可以直接从术语上看到,而Emission是由Hidden引出的一个概念。首先解释一下Hidden:我们看到对于一个分好词的句子“晚上 喝 水”,这里“晚上”等这些单元都是我们看到的,因此是一些Explicit单元,而POS(词性)是我们看不到的,因此是一些Implicit (Hidden)单元。因此这儿的Hidden在词性标注这个应用领域指的是POS。更抽象一层,Hidden其实是外表背后的本质,所谓外表就是我们看到的现象,所谓本质即为导致该现象发生的原因。 那么“导致该现象发生的原因”这句话指的又是这么呢?通过这句话我们可以引入“Emission”这个概念。在词性标注领域即为某个具体句子中的某个位置的词性导致这个词出现概率,举个例子: e.g. 晚上 喝 水 WORD POS LIST 晚上 t 喝 Vg | e | v 水 Ng | j | n WORD — explicit unit(现象) POS LIST — implicit unit(本质)

因此对于具体的某个词,如“喝”来说,某个词性到导致这词的出现的事件,即为Emission,而该事件的概率即为Emission Probability,公式表示如下: P(喝|v) = C(喝v) / C(v) C(喝 v) — 代表 v 喝 同时出现的频数 C(v) — 代表 v 出现的频数 抽象一层即为本质导致现象发生的概率大小。

通过上面的例子,我们发现这里有一个思路需要转变一下,即对于MM来说,这里指的是本质之间的MM,因此对“词性标注”这个应用领域来说,即为词性之间的转移(条件)概率,因此对于一个具体的切分结果和一个具体的词性标注结果其HMM公式可表示为:

Q: nqqq,...,,21

O: nooo,...,,21

这里Q代表原因(Hidden),O代表现象。公式2:

P(Q) = 【P (|1

qs

)×P(|)×…×P(2q1qs/|)】 ×

n

q

【 P (|)×P(|)×…×P(|n)】 1o1q2o2qn

oq

我们可以看到上述公式分为两部分,前一部分即为原因之间的转移概率(MM),后一部分为原因导致现象发生的概率,即发射概率。 因此对于基于HMM的词性标注来说,即是找到一个POS路径使得P(Q)达到最大。为了解决该问题,可以采用基于动态规划原理的Viterbi算法。

iii) Viterbi算法 该算法本质上是用于解决一个解码问题,即对于一个给定的现象,挖掘其背后的本质。对于“词性标注”这个应用领域来说即对“确定的切词结果”找到背后的各个词的“词性”。

这里的词即公式2中的, …, 1

o

no

词性即公式2中的, …, 1

q

nq

因此Viterbi算法可描述如下: 注:上述算法中 T — 观察到的现象数,如“晚上 喝 水”,则这里T即为3 State-graph — 即为状态图,也即由现象和本质可以构成的状态图, 如上述例子 e.g. 晚上 喝 水 WORD POS LIST 晚上 t 喝 Vg | e | v 水 Ng | j | n WORD — explicit unit(现象) POS LIST — implicit unit(本质)

构成的状态图如下所示:

从该图中我们可以看出,该图与上述算法略有不同,不同点为上述算法对每 个现象都建立了一个大小为状态数的向量(对于词性标注这个应用来说即建立一 个大小为词性标注集的向量),而我们的图中只画出了实际计算过程中每个现象 背后隐含的状态数,实际计算过程中也是一样的。 因此实际计算过程如下

S t 晚上Vg 喝 e 喝 v 喝 Ng 水 j 水 n 水 E

Function Viterbi (observations of len T, state-graph) returns best-path

num-states ← NUM-OF-STATES(state-graph) Create a path probability matrix viterbi [num-states+2, T+2] viterbi[0,0]←1.0 for each time step t from 1 to T do for each state s from 1 to num-states do

viterbi[s,t]←

backpointer[s,t]← Backtrace from highest probability state in final column of viterbi [ ] and return path )](]1,[[max,'1'tsssstatesnumsobatsviterbii )](]1,[[maxarg,'1'tsssstatesnumsobatsviterbii (1) 计算T1 — 晚上

Viterbi(s’, t-1) = 1.0; Viterbi(s, t) = )](]1,[[max,'1'tsssstatesnumsobatsviterbii

= Viterbi[, S] * p(t|)*p(晚上|t) 记录backpointer值:这儿即为

(2) 计算 T2 — 喝

Viterbi(s’, t-1) = Viterbi[t, 晚上];

Viterbi(s, t) = )](]1,[[max,'1'tsssstatesnumsobatsviterbii

= Viterbi[t, 晚上] * p(Vg|t)*p(喝|Vg)

Viterbi(s, t) = )](]1,[[max,'1'tsssstatesnumsobatsviterbii

= Viterbi[t, 晚上] * p(e|t)*p(喝|e)

Viterbi(s, t) = )](]1,[[max,'1'tsssstatesnumsobatsviterbii

= Viterbi[t, 晚上] * p(v|t)*p(喝|v) 记录backpointer值:所有三条路径的值均为 晚上/t (3) 计算 T3 — 水

S t 晚上 Vg 喝 e 喝 v 喝 Ng 水 j 水 n 水 E

p(t|)p(晚上|t)

S t 晚上 Vg 喝 Ng 水 e 喝 v 喝 j 水 n 水

p(t|)p(晚上|t)

E 求 如图所示的绿色椭圆方块部分的Viterbi值 ① Viterbi(s’, t-1) = Viterbi[Vg, 喝];

Viterbi(s, t) = )(]1,[,''tsssobatsviterbi

= Viterbi[Vg, 喝]* p(Ng|Vg)*p(水|Ng) ② Viterbi(s’, t-1) = Viterbi[e, 喝];

Viterbi(s, t) = )(]1,[,''tsssobatsviterbi

= Viterbi[e, 喝]* p(Ng|e)*p(水|Ng) ③ Viterbi(s’, t-1) = Viterbi[v, 喝];

Viterbi(s, t) = )(]1,[,''tsssobatsviterbi

= Viterbi[v, 喝]* p(Ng|v)*p(水|Ng) 假设以上三条路径中路径①的Viterbi结果最大,则计算结果为:

Viterbi(s, t) = )](]1,[[max,'1'tsssstatesnumsobatsviterbii

= Viterbi[Vg, 喝]* p(Ng|Vg)*p(水|Ng) 记录backpointer值: 这儿即为 喝/Vg 对于另外两种颜色的椭圆也可以按相同方法计算

(3) 计算 T4 —

计算方法如同前述步骤,分别计算路径①、②、③的Viterbi值,然后取最 St 晚上 Vg 喝 e 喝 v 喝 Ng 水 j 水 n 水 E

p(t|)p(晚上|t)①

②③

S t 晚上 Vg 喝 e 喝 v 喝 水 Ng j 水 n 水

①p(t|)p(晚上|t) ②③E