维特比算法的简单理解——以分词算法为例

在中文分词任务中,一个很棘手的问题是中文词中字组合的复杂性。

例如句子:南京市长江大桥,这句话可以有多种分词方法都说的通:
(1)南京市/长江大桥
(2)南京/市长/江大桥

在基于规则匹配的分词法中, 如果多种分法的词在词典中都能找得到,则会有多种可能。

我们可以基于统计概率来得到每个词的概率,以此得到分词结果的概率。
p ( 南 京 市 / 长 江 大 桥 ) = p ( 南 京 市 ) p ( 长 江 大 桥 ) p ( 南 京 / 市 长 / 江 大 桥 ) = p ( 南 京 ) p ( 市 长 ) p ( 江 大 桥 ) p(南京市/长江大桥) = p(南京市)p(长江大桥)\\ p(南京/市长/江大桥) = p(南京)p(市长)p(江大桥) p(/)=p()p()p(//)=p()p()p()
我们可以对比所有分词方法的概率,选出最高的那个。即求:
p ( s ) = a r g m a x ∏ i = 1 n p ( w i ) p(s) = argmax\prod_{i=1}^n p(w_i) p(s)=argmaxi=1np(wi)
通过取log可以把乘法改成加法,简化计算同时防止概率连乘产生过于小的数字:
p ( s ) = a r g m a x ∑ i = 1 n l o g p ( w i ) p(s) = argmax\sum_{i=1}^nlogp(w_i) p(s)=argmaxi=1nlogp(wi)
然而这样的方法需要暴力组合字典所能带来的所有可能,会重复计算很多子问题。维特比算法即用动态规划求最优路径的算法
维特比算法的简单理解——以分词算法为例_第1张图片
dp[i]代表前i个字组合的最大概率,显然:
d p [ i ] = m i n ( d p [ j ] + l o g p ( w i j ) ) dp[i] = min(dp[j] + logp(w_{ij})) dp[i]=min(dp[j]+logp(wij))
w i j w_{ij} wij代表第j到第i个字组成的词在字典里的概率。

于是维特比分词算法可以写成:

for i = 1 ~ N:
	dp[i] = min(dp[i],dp[j] + logp(w_{ij}))
return dp[N]

你可能感兴趣的:(机器学习)