西湖大学自然语言处理(七)—— 解决OOV问题的两种平滑技术
西湖大学自然语言处理(七)—— 解决OOV问题的两种平滑技术
平滑的目的——解决数据稀疏性的问题
Knesser-Ney Smoothing
核心思想——劫富济贫
absolute discount smoothing
公式:
P ( w ∣ u ) = m a x ( u w ∈ D − δ , 0 ) ∑ w ′ u w ′ + λ P K N ( w ) P(w|u)=\frac {max(uw\in D-\delta , 0)} {\sum_{w'}uw'}+\lambda P_{KN}(w) P(w∣u)=∑w′uw′max(uw∈D−δ,0)+λPKN(w)
其 中 , P K N ( w ) = C K N ( w ) ∑ w ′ C K N ( w ′ ) 其中,P_{KN}(w)=\frac{C_{KN}(w)}{\sum_{w'}C_{KN}(w')} 其中,PKN(w)=∑w′CKN(w′)CKN(w)
这样写,事实上,当词库中没有该单词组
u
w
uw
uw时,就用
w
w
w的在词库中出现的频率来代替,但事实上,这样做会存在一个问题,举例如下:
这部分参考周周_hey的讲解:
https://www.jianshu.com/p/044108934966
San Francisco 是个地名,这个地名出现的频率很高。所以 Francisco 这个词出现的频率很高,那他对应的unigram概率应该也很高,也就是说比“glasses”这个的概率更高,但是实际上"Francisco"这个词单独出现的概率很低,他都是跟在"San"的后面出现的,unigram的计算方法不会考虑到这一点,导致Francisco的unigram特别高,那这个一元是不准确的。
又例如,conditioning和fencing这两个单词,乍一看,conditioning出现频率大于fencing,因为很多文章会用到air conditioning这一短语,大部分的conditioning会跟在air后面,然后fencing击剑这一运动就不是那么的常见了。如果给定一个没有见过的单词,conditioning出现在该单词后面的可能性小于fencing出现在该单词后面的可能性,所以,这种计算方法是不准确的。
解决办法:可以用 w w w这个字前面出现的字的情况的数量来代替原先的用该字在词库中的数量,用数学公式表示就是:
C K N = ∣ u : u w ∈ D ∣ C_{KN} = |{u:uw\in D}| CKN=∣u:uw∈D∣
这里对公式进行说明一下, u u u是指目前的字, w w w是指 u u u前面一个字, u w uw uw是指在 w w w出现的条件下, u u u也出现的情况; w ′ w' w′表示 u u u前面的任何一个字
所以,最终的公式可以写为:
P
(
w
∣
u
)
=
m
a
x
(
u
w
∈
D
−
δ
,
0
)
∑
w
′
u
w
′
+
λ
P
K
N
(
w
)
P(w|u)=\frac {max(uw\in D-\delta , 0)} {\sum_{w'}uw'}+\lambda P_{KN}(w)
P(w∣u)=∑w′uw′max(uw∈D−δ,0)+λPKN(w)
其
中
,
P
K
N
(
w
)
=
C
K
N
(
w
)
∑
w
′
C
K
N
(
w
′
)
,
C
K
N
=
∣
u
:
u
w
∈
D
∣
其中,P_{KN}(w)=\frac{C_{KN}(w)}{\sum_{w'}C_{KN}(w')},C_KN = |{u:uw\in D}|
其中,PKN(w)=∑w′CKN(w′)CKN(w),CKN=∣u:uw∈D∣
Good-Turing Smoothing
以 trigrams(三元组)为例
V
o
c
a
b
s
i
z
e
=
1
0
4
Vocab size = 10^4
Vocabsize=104
t
r
i
g
r
a
m
s
=
1
0
12
trigrams =10^{12}
trigrams=1012
在这
1
0
12
10^{12}
1012种可能性中,在数据集中出现的三元组的个数假定为:
T
o
t
a
l
t
r
i
g
r
a
m
s
Total trigrams
Totaltrigrams =
1
0
6
10^6
106
在这出现的三元组中,每个三元组出现的频度也是不一样的,
o
c
c
u
r
r
i
n
g
o
n
c
e
=
7.5
∗
1
0
5
occurringonce = 7.5*10^5
occurringonce=7.5∗105
o
c
c
u
r
r
i
n
g
t
w
i
c
e
=
2
∗
1
0
5
occurringtwice = 2*10^5
occurringtwice=2∗105
o
c
c
u
r
r
i
n
g
t
h
r
e
e
t
i
m
e
s
=
9
∗
1
0
4
occurringthreetimes = 9*10^4
occurringthreetimes=9∗104
.
.
.
...
...
o
c
c
u
r
r
i
n
g
z
e
r
o
t
i
m
e
s
=
1
0
12
−
1
0
6
occurringzerotimes=10^{12}-10^6
occurringzerotimes=1012−106
随着词在数据里出现的次数增多,这样的不同的词的个数会越来越少
目的是给这些数据里没有出现但是可能存在的三元组一个非零的次数
想法:用一个更大的数据集包含现在的数据集,那么那些为零的次数在更大的数据集里面次数就可能不为0了,
设原来出现的次数为
r
r
r,在更大数据集里面出现的次数为
C
r
C_r
Cr,我们要做的就是一个从
r
r
r到
C
r
C_r
Cr的映射

把原来有意义的数据,按照出现的次数打乱,第一列就是出现一次的词(
r
=
1
r = 1
r=1),第二列就是出现两次的词(
r
=
2
r = 2
r=2),以此类推,每一个框就代表这个词在data中出现的总次数,
N
1
N1
N1表示这一列有
N
1
N1
N1个框,总词数 =
1
∗
N
1
+
2
∗
N
2
+
.
.
.
1*N1 + 2*N2 + ...
1∗N1+2∗N2+...
t r i g r a m s = ∑ r = 1 ∞ r ∗ N r trigrams = \sum_{r=1}^{∞}r*N_r trigrams=∑r=1∞r∗Nr
假定在更大的数据集里面,框的批次规律不发生改变,在原来数据集中出现零次的框在更大数据集里面假定用N1的框,在原来数据集中出现一次的框在更大数据集里面假定用N2的框,依此类推
o
c
c
u
r
r
i
n
g
o
n
c
e
=
7.5
∗
1
0
5
→
r
∗
N
r
=
7.5
∗
1
0
5
occurringonce = 7.5*10^5→r*N_r = 7.5*10^5
occurringonce=7.5∗105→r∗Nr=7.5∗105
o
c
c
u
r
r
i
n
g
t
w
i
c
e
=
2
∗
1
0
5
→
r
∗
N
r
=
2
∗
2
∗
1
0
5
occurringtwice = 2*10^5→r*N_r = 2*2*10^5
occurringtwice=2∗105→r∗Nr=2∗2∗105
o
c
c
u
r
r
i
n
g
t
h
r
e
e
t
i
m
e
s
=
9
∗
1
0
4
→
r
∗
N
r
=
3
∗
9
∗
1
0
4
occurringthreetimes = 9*10^4→r*N_r = 3*9*10^4
occurringthreetimes=9∗104→r∗Nr=3∗9∗104
.
.
.
...
...
o
c
c
u
r
r
i
n
g
z
e
r
o
t
i
m
e
s
=
1
0
12
−
1
0
6
→
r
∗
N
r
=
0
occurringzerotimes=10^{12}-10^6→r*N_r = 0
occurringzerotimes=1012−106→r∗Nr=0
估算:
r
∗
N
r
=
C
r
−
1
∗
N
r
−
1
r*N_r = C_{r-1} * N_{r-1}
r∗Nr=Cr−1∗Nr−1
C
r
−
1
=
r
∗
N
r
N
r
−
1
C_{r-1} = \frac{r*N_r}{N_{r-1}}
Cr−1=Nr−1r∗Nr
例如:
C
0
=
7.5
∗
1
0
5
1
0
12
=
7.
5
−
7
C_0 = \frac{7.5*10^{5}}{10^{12}} = 7.5^{-7}
C0=10127.5∗105=7.5−7
C
1
=
4
∗
1
0
5
7.5
∗
1
0
5
=
0.53
C_1 = \frac{4*10^{5}}{7.5*10^{5}} = 0.53
C1=7.5∗1054∗105=0.53
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)