往期文章请点这里
目录
- Overview
- Part of Speech Tagging
- Markov Chains
- Markov Chains and POS Tags
- POS tags as States
- Transition probabilities
- The transition matrix
- Initial probabilities
- Hidden Markov Models
- Emission probabilities
- Summary
- Calculating Probabilities
- Transition probabilities
- The corpus
- Populating the Transition Matrix
- Smoothing
- Populating the Emission Matrix
- The Viterbi Algorithm
- Viterbi algorithm - a graph algorithm
- Viterbi algorithm Steps
- Viterbi: Initialization
- Viterbi: Forward Pass
- Viterbi: Backward Pass
- Implementation notes
往期文章请点这里
Overview
●What is part of speech tagging?
●Markov chains
●Hidden Markov models
●Viterbi algorithm
●Example
Part of Speech Tagging
词性标注(Part of Speech Tagging),简称POS Tagging,是自然语言处理(NLP)中的一个任务,它涉及到识别文本中每个单词的词性类别。词性,或称词类,是指一个词在句子中的语法功能,如名词、动词、形容词、副词等。
词性标注对于理解句子结构和语义非常重要,它可以帮助计算机更好地解析语言,从而支持诸如机器翻译、信息检索、文本摘要、情感分析等高级语言处理任务。例如,在句子 “The cat sat on the mat” 中,词性标注可能会标记 “The” 为定冠词(DT),“cat” 为名词(Noun),“sat” 为动词(Verb),“on” 为介词(Preposition),“the” 为定冠词(DT),“mat” 为名词(Noun)。通过这种方式,词性标注为进一步的语言分析提供了基础。
例子:
关于词性标签缩写可参照:
Lexical Term | Tag | Example Words |
---|---|---|
Noun | NN | something, nothing |
Verb | VB | learn, study |
Determiner | DT | the, a |
Wh-adverb | WRB | why, where |
Adjective | JJ | big, happy |
Adverb | RB | quickly, very |
Pronoun | PRP | he, she, it |
Preposition | IN | on, at, of |
Conjunction | CC | and, but, or |
Possessive | POS | 's, his, her |
Article | ART | the, a, an |
Numeral | CD | one, two, three |
Exclamation | UH | oh, wow |
Auxiliary | VBZ | is, are, has |
Modal | MD | can, could, will |
Comparative | JJR | bigger, faster |
Superlative | JJS | biggest, fastest |
Gerund | VBG | running, studying |
Infinitive | VBN | to run, to study |
Participle | VBD | ran, studied |
Interjection | INTJ | hello, goodbye |
请注意,词性标签的命名可能因不同的词性标注系统而有所不同,但上述表格提供了一些常见的词性标签和示例。
词性标签的应用
命名实体识别(Named Entity Recognition, NER):命名实体识别是识别文本中的特定实体,如人名、地点、组织、日期等。词性标注在此过程中非常有用,因为它可以帮助确定实体的边界。例如,如果一个名词(NN)后面跟着一个特定的词性,如地名(例如“New York”),词性标注可以帮助确定这个名词是一个地点实体。
语音识别(Speech Recognition):语音识别系统将口语转化为文本。词性标注在此过程中有助于提高识别的准确性。由于口语中的语法结构可能不如书面语规范,词性标注可以帮助系统理解句子结构,从而更准确地将口语转化为正确的文本形式。
指代消解(Coreference Resolution):指代消解是确定文本中不同代词或名词短语指向相同实体的过程。词性标注有助于识别和匹配可能的指代关系。例如,如果一个代词(如“he”)出现在句子中,词性标注可以帮助确定这个代词的性别和数量,进而帮助系统找到它所指的名词短语。上面的图中,“埃菲尔铁塔位于巴黎,它高324米”,这里可以用指代消解推断“它”是指什么。
Markov Chains
上例中,learn是动词,在英语语法中,动词后面会接什么词性的单词呢?大概率是名词。
这个现象也称为:Part of Speech Dependencies
这里使用可视化的方式来表示单词序列的词性变换,这个也是马尔科夫链
马尔科夫链可以表示为一个有向图,图中的节点表示模型的状态(state),这里
Q
=
{
q
1
,
q
2
,
q
3
}
Q=\{q_1,q_2,q_3\}
Q={q1,q2,q3}
Markov Chains and POS Tags
POS tags as States
将句子看做是带有相关词性标注的词序列,就可以用马尔科夫链来表示这个序列:
Transition probabilities
将边加上状态转移(过渡)概率,可得到下图:
马尔科夫链有一个非常重要的假设或者说性质,就是:下一个事件的概率仅仅取决于当前事件。例如在下图中,下一个词的状态只有当前词learn来决定,而与前面的词无关,只需要看绿色圈圈即可。
The transition matrix
可用矩阵来保存状态转移概率:
矩阵每一行的和为1,即:
∑
j
=
1
N
a
i
j
=
1
\sum_{j=1}^N a_{ij}=1
∑j=1Naij=1
Initial probabilities
对于句子的第一个词,没有前一个状态来决定其状态:
我们可以引入一个初始概率
π
\pi
π来表示初始单词词性生成概率:
将表格写成矩阵的形式为:
A
=
[
0.4
0.1
0.5
0.2
0.2
0.6
0.4
0.3
0.3
0.2
0.3
0.5
]
A = \begin{bmatrix} 0.4 & 0.1 &0.5\\ 0.2 & 0.2 &0.6\\ 0.4 & 0.3 &0.3\\ 0.2 & 0.3 &0.5 \end{bmatrix}
A=
0.40.20.40.20.10.20.30.30.50.60.30.5
Hidden Markov Models
Hidden表示状态是隐藏的,可将词性标签的状态看做是隐藏状态,因为它们从文本数据中不直接可观察到。机器能观察到的只有句子中的单词。我们用虚线节点表示隐藏状态,则其过渡概率可以用N+1乘N维的矩阵A表示,N是隐藏状态的数量。
Emission probabilities
发射概率指的是在给定一个特定的状态时,观察到某个具体输出(或观察值)的概率。简单来说,它描述了在某个隐藏状态下,某个可见事件(如单词、声音等)发生的可能性。例如这里在隐藏状态VB的状态下,生成一些词(观测值)的概率如下图所示:
右边是发射概率的表格形式,发射矩阵表示词性标签代表的每个最终隐藏状态到语料库中的M个单词的转换概率。
同样的,每一行的概率和为1,即:
∑
j
=
1
V
b
i
j
=
1
\sum_{j=1}^V b_{ij}=1
∑j=1Vbij=1
注意,图示中三个词在不同隐藏状态下的生成概率都大于0,是因为词在不同上下文中可能会有不同的词性。
He lay on his back.
I’ll be back.
第一句back是名词,第二句是副词。
Summary
States:
Q
=
{
q
1
,
⋯
,
q
N
}
Q = \{q_1, \cdots, q_N\}
Q={q1,⋯,qN}
Transition matrix:
A
=
[
a
1
,
1
⋯
a
1
,
N
0
⋱
⋮
a
N
+
1
,
1
⋯
a
N
+
1
,
N
]
A=\begin{bmatrix} a_{1,1} & \cdots & a_{1,N} \\ 0 & \ddots & \vdots \\ a_{N+1,1} & \cdots & a_{N+1,N} \\ \end{bmatrix}
A=
a1,10aN+1,1⋯⋱⋯a1,N⋮aN+1,N
Emission matrix:
B
=
[
b
1
,
1
⋯
b
1
V
⋮
⋱
⋮
b
N
1
⋯
a
N
V
]
B=\begin{bmatrix} b_{1,1} & \cdots & b_{1V} \\ \vdots & \ddots & \vdots \\ b_{N1} & \cdots & a_{NV} \\ \end{bmatrix}
B=
b1,1⋮bN1⋯⋱⋯b1V⋮aNV
Calculating Probabilities
Transition probabilities
根据实例计算转移概率,假设语料库如下:
我们用颜色来表示不同的词性标签,从词库中可以统计得到,例如蓝色到紫色出现了两次,语料库中以蓝色开头的标签数量是3:
transition probability:
要计算马尔科夫模型的所有转移概率,必须统计语料库中所有标签对出现次数。
1.Count occurrences of tag pairs
C
(
t
i
−
1
,
t
i
)
C(t_{i-1},t_i)
C(ti−1,ti)
2.Calculate probabilities using the counts
P
(
t
i
∣
t
i
−
1
)
=
C
(
t
i
−
1
,
t
i
)
∑
j
=
1
N
C
(
t
i
−
1
,
t
j
)
P(t_i | t_{i-1}) = \frac{C(t_{i-1}, t_i)}{\sum_{j=1}^{N} C(t_{i-1}, t_j)}
P(ti∣ti−1)=∑j=1NC(ti−1,tj)C(ti−1,ti)
The corpus
假设有以下语料库:
In a Station of the Metro
The apparition of these faces in the crowd :
Petals on a wet , black bough .
语料库中每一行是一个单独的句子。先在句首添加起始标记,以便计算初始概率:
然后将所有字母转成小写字母,这里没有去掉标点,因为是一个toy model
Populating the Transition Matrix
先准备好空表:
先用与相关标记的计数来填充矩阵的第一列(矩阵的行代表当前状态,列代表下一个状态,值代表从当前状态转移到下一个状态的转移概率),先用不同颜色来标记状态:
对于第一列,需要计算下面标记组合出现的次数
得到以下结果:
按这个方式可以填充其他部分,这里有一个trick,注意到语料库中没有动词VB,所以,矩阵中VB所在的行列均为0:
最后结果如下(这里O-O,在语料中出现了八次,注意最后一句加上标点,有4次):
接下来计算转移概率:
但是VB这行会出现分母为0的情况。
Smoothing
为解决这个问题,需要加上一个很小的值
ϵ
\epsilon
ϵ,最后公式变成:
P
(
t
i
∣
t
i
−
1
)
=
C
(
t
i
−
1
,
t
i
)
+
ϵ
∑
j
=
1
N
C
(
t
i
−
1
,
t
j
)
+
N
×
ϵ
P(t_i | t_{i-1}) = \frac{C(t_{i-1}, t_i)+\epsilon}{\sum_{j=1}^{N} C(t_{i-1}, t_j)+N\times \epsilon}
P(ti∣ti−1)=∑j=1NC(ti−1,tj)+N×ϵC(ti−1,ti)+ϵ
分母加上一项,以保证概率总和为1
这里如果用
ϵ
=
0.001
\epsilon=0.001
ϵ=0.001,这转移矩阵就得到:
平滑之后没有为0的概率,VB的转移概率是相等的。
实际操作中,第一行不需要加
ϵ
\epsilon
ϵ,加上会使得标点符号也会有概率出现在句首,这个是不科学的。
Populating the Emission Matrix
上面的转移矩阵只考虑了词性的转化,这里需要将具体的词也考虑进来,例如:
我们希望计算一个词性标签与特定词语的共现次数,例如:
进一步用复杂一点例子:
以第一列为例,这里不是计算标签对的数量,而是计算一个词与特定标签相关联的次数:
例如
C
(
N
N
,
i
n
)
=
0
C(NN,in)=0
C(NN,in)=0表示在语料库中in与Noun标签并无关联,同理in与动词也无关系,在其他标签类别中出现了两次:
最后的概率由以下公式计算:
P
(
w
i
∣
t
i
)
=
C
(
t
i
,
w
i
)
+
ϵ
∑
j
=
1
N
C
(
t
i
,
w
j
)
+
N
⋅
ϵ
=
C
(
t
i
,
w
i
)
+
ϵ
C
(
t
i
)
+
N
⋅
ϵ
P(w_i | t_i) = \frac{C(t_i, w_i) + \epsilon}{\sum_{j=1}^{N} C(t_i, w_j) + N \cdot \epsilon}\\ =\cfrac{C(t_i, w_i) + \epsilon}{C(t_i)+ N \cdot \epsilon}
P(wi∣ti)=∑j=1NC(ti,wj)+N⋅ϵC(ti,wi)+ϵ=C(ti)+N⋅ϵC(ti,wi)+ϵ
其中,大与字母N代表标签数,大写字母V代表我们的词汇表大小。
The Viterbi Algorithm
Viterbi algorithm - a graph algorithm
维特比算法是一个图算法,下面以句子:I love to learn为例,来演示其原理。
这里绿色显示的转移概率是0.3,橙色显示的发射概率为0.5
那么第一个单词为I的概率实际是联合概率:0.5×0.3=0.15
接下来观察到love有两种可能,分别是O→NN和O→VB
由于VB对应生成love的发射概率要大,因此选择O→VB:
这I后面接love的概率为:0.5×0.5=0.25
由于love后面的to只会在O状态下出现:
love后面接to的概率为:0.2×0.4=0.08
最后是learn,只会在VB状态出现:
其出现概率是0.5×0.2=0.1
最后可得到所有单词序列对应的隐藏状态概率为:
0.15
∗
0.25
∗
0.08
∗
0.1
=
0.0003
0.15*0.25*0.08*0.1=0.0003
0.15∗0.25∗0.08∗0.1=0.0003
Viterbi algorithm Steps
一共三步:
1.Initialization step
2.Forward pass
3.Backward pass
这里要用到两个辅助矩阵:
矩阵C保存中间的最优概率,矩阵D保存访问过的状态的索引。
下面详细讲解三个步骤。
Viterbi: Initialization
初始化步骤是填充辅助矩阵C和D第一列的:
填充结果为:
填充公式为:
c
i
,
1
=
π
i
∗
b
i
,
c
i
n
d
e
x
(
w
1
)
=
a
1
,
i
∗
b
i
,
c
i
n
d
e
x
(
w
1
)
c_{i,1}=\pi_i*b_{i,cindex(w_1)}\\ =a_{1,i}*b_{i,cindex(w_1)}
ci,1=πi∗bi,cindex(w1)=a1,i∗bi,cindex(w1)
C矩阵中的第一列表示从图中的起始状态
π
\pi
π到第一个标签
t
i
t_i
ti和单词
w
1
w_1
w1的转换概率,示例图中有三个隐藏状态。
从公式中可以看到,第一列单词
w
1
w_1
w1出现的概率是初始化概率乘以状态发射概率,初始化概率从矩阵A中可以得到,发射概率从矩阵B中可以得到。
对于矩阵D:
第一列直接设置为0即可:
d
i
,
1
=
0
d_{i,1}=0
di,1=0
因为没有遍历任何之前的词性标签。
Viterbi: Forward Pass
前向传递是填充矩阵C和D的第二步。
对于矩阵C,使用的公式为:
c
i
,
j
=
max
k
c
k
,
j
−
1
∗
a
k
,
i
∗
b
i
,
c
i
n
d
e
x
(
w
j
)
c_{i,j}=\underset{k}{\max}c_{k,j-1}*a_{k,i}*b_{i,cindex(w_j)}
ci,j=kmaxck,j−1∗ak,i∗bi,cindex(wj)
例如要计算
c
1
,
2
c_{1,2}
c1,2
c
1
,
2
=
max
k
c
k
,
1
∗
a
k
,
1
∗
b
i
,
c
i
n
d
e
x
(
w
2
)
c_{1,2}=\underset{k}{\max}c_{k,1}*a_{k,1}*b_{i,cindex(w_2)}
c1,2=kmaxck,1∗ak,1∗bi,cindex(w2)
b
i
,
c
i
n
d
e
x
(
w
2
)
b_{i,cindex(w_2)}
bi,cindex(w2)是状态
t
1
t_1
t1到
w
2
w_2
w2的发射概率
a
k
,
1
a_{k,1}
ak,1是状态
t
k
t_k
tk到当前状态
t
1
t_1
t1的转移概率
t
k
1
t_{k1}
tk1表示已经遍历的前一个路径的概率
这里选择k使得整个公式最大化
对于矩阵D:
使用以下公式:
d
i
,
j
=
arg max
k
c
k
,
1
∗
a
k
,
1
∗
b
i
,
c
i
n
d
e
x
(
w
2
)
d_{i,j}=\underset{k}{\argmax}c_{k,1}*a_{k,1}*b_{i,cindex(w_2)}
di,j=kargmaxck,1∗ak,1∗bi,cindex(w2)
Viterbi: Backward Pass
到这一步,C和D已经填充完毕
现在需要从D中提取路径,它代表了最可能生成我们给定的词序列的隐藏状态的序列(从第一个到第K个)
首先,在矩阵C的最后一列中计算具有最高概率的条目
c
i
,
K
c_{i,K}
ci,K的系引。这个索引处的概率是最可能的隐藏状态序列生成给定词序列的概率。
s
=
arg max
i
c
i
,
K
s=\underset{i}{\argmax}c_{i,K}
s=iargmaxci,K
例如:这里最高概率的条目是第一个,概率为0.01,也就是对应的
c
1
,
5
c_{1,5}
c1,5
这个索引表示你观察到单词
w
5
w_5
w5时遍历的最后一个隐藏状态。也就是生成
w
5
w_5
w5最有可能状态是
t
1
t_1
t1词性标签,将
t
1
t_1
t1加到序列的最后:
然后根据D中的值查找矩阵D中的下一个索引:
Implementation notes
1.In Python index starts with 0!
2.Use log probabilities,防止概率值太小相乘导致下溢
c
i
,
j
=
max
k
c
k
,
j
−
1
∗
a
k
,
i
∗
b
i
,
c
i
n
d
e
x
(
w
j
)
c_{i,j}=\underset{k}{\max}c_{k,j-1}*a_{k,i}*b_{i,cindex(w_j)}
ci,j=kmaxck,j−1∗ak,i∗bi,cindex(wj)
取log后:
log
c
i
,
j
=
max
k
log
(
c
k
,
j
−
1
)
+
log
(
a
k
,
i
)
+
log
(
b
i
,
c
i
n
d
e
x
(
w
j
)
)
\log c_{i,j}=\underset{k}{\max}\log( c_{k,j-1})+\log( a_{k,i})+\log (b_{i,cindex(w_j)})
logci,j=kmaxlog(ck,j−1)+log(ak,i)+log(bi,cindex(wj))