词性标注方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
词性标注方法
分词系统词性标注模块的基本需求即为对给定的一个分好词的句子,每一个词附上一些相应的词性。
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: n q q q ,...,,21O:
n o o o ,...,,21这里Q 代表原因(Hidden )
,O 代表现象。公式2: P (Q ) = 【P (|1q >
n q 【 P
(|)×P(|)×…×P(|n )】 1o 1q 2o 2q n o q 我们可以看到上述公式分为两部分,前一部分即为原因之间的转移概率
(MM ),后一部分为原因导致现象发生的概率,即发射概率。
因此对于基于HMM 的词性标注来说,即是找到一个POS 路径使得P(Q)达到最
大。为了解决该问题,可以采用基于动态规划原理的Viterbi 算法。
iii) Viterbi 算法
该算法本质上是用于解决一个解码问题,即对于一个给定的现象,挖掘其背
后的本质。对于“词性标注”这个应用领域来说即对“确定的切词结果”找到背后的各个词的“词性”。 这里的词即公式2中的, …, 1o n o 词性即公式2中的, …, 1q n q 因此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(本质)
构成的状态图如下所示:
喝水
从该图中我们可以看出,该图与上述算法略有不同,不同点为上述算法对每个现象都建立了一个大小为状态数的向量(对于词性标注这个应用来说即建立一个大小为词性标注集的向量),而我们的图中只画出了实际计算过程中每个现象背后隐含的状态数,实际计算过程中也是一样的。
因此实际计算过程如下
(1) 计算T1 — 晚上
Viterbi(s’, t-1) = 1.0; Viterbi(s, t) =
)](]1,[[max
,'1't s s s states
num s o b a t s viterbi i **--≤≤ = Viterbi[, S] * p(t|)*p(晚上|t) 记录backpointer 值:这儿即为
(2) 计算 T2 — 喝
Viterbi(s’, t-1) =
Viterbi[t, 晚上]; Viterbi(s, t) =
)](]1,[[max
,'1't s s s states
num s o b a t s viterbi i **--≤≤ = Viterbi[t, 晚上] * p(Vg|t)*p(喝|Vg)
Viterbi(s, t) =
)](]1,[[max
,'1't s s s states
num s o b a t s viterbi i **--≤≤ = Viterbi[t, 晚上] * p(e|t)*p(喝|e)
Viterbi(s, t) =
)](]1,[[max
,'1't s s s states
num s o b a t s viterbi i **--≤≤ = Viterbi[t, 晚上] * p(v|t)*p(喝|v) 记录backpointer 值:所有三条路径的值均为 晚上/t
(3) 计算 T3 — 水
喝
水