脑中的数学是抽象的,手中的数学是简单的。
接着谈字串粗分的N-最短路径方法。
所谓N-最短路径就是最少路径和全路径的折中,保留前N长度的路径。
N-最短路径方法的基本思想是根据词典,找出字串中所有可能的词构造词图(一种有向无环图),每个词对应图中的一条有向边,并赋给相应的边长(权值)。针对这个词图,N-最短路径求解就是在起点到终点的所有路径中,求出长度值按严格升序排列依次为第1、第2、...、第N的路径集合作为相应的粗分结果集。如果两条或两条以上路径长度相等,那么他们的长度并列第i,都要列入粗分结果集,最后的粗分结果集大小>=N。
N-最短路径方法的基本思想是根据词典,找出字串中所有可能的词构造词图(一种有向无环图),每个词对应图中的一条有向边,并赋给相应的边长(权值)。针对这个词图,N-最短路径求解就是在起点到终点的所有路径中,求出长度值按严格升序排列依次为第1、第2、...、第N的路径集合作为相应的粗分结果集。如果两条或两条以上路径长度相等,那么他们的长度并列第i,都要列入粗分结果集,最后的粗分结果集大小>=N。
设待分字串C=c1c2..cn,其中ci为单个的字,n为串的长度,建立一个节点数为n+1的切分有向无环图,各节点编号依次为v0,v1,..,vn。通过以下方法建立词图所有可能的词弧(边)。
(1)相邻节点vk-1,vk之间建立有向边<vk-1,vk>,边的长度为lk,边对应的词默认为ck(k=1,2,..,n)
(2)若w=cici+1..cj是一个词,则节点vi-1,vj之间建立有向边<vi-1,vj>,边的长度为lw,边对应的词为w
(1)相邻节点vk-1,vk之间建立有向边<vk-1,vk>,边的长度为lk,边对应的词默认为ck(k=1,2,..,n)
(2)若w=cici+1..cj是一个词,则节点vi-1,vj之间建立有向边<vi-1,vj>,边的长度为lw,边对应的词为w

如何确定边的长度?没有任何其他帮助的情况下,所有的边长可以设为1。那么寻找长度最短的路径也就是最少词的切分路径,可以想象的是,随着字串长度n的增加和最短路径数N的增大,长度相同的路径数会急剧增加,同时粗分结果数量也必然上升,这对后期处理不利。
如果把N-最短路径粗分模型改进为:
假设字串为C=c1c2..cn,要求的词串为W=w1w2..wm。求使得概率P(W|C)的值是最大的N个W。
采用一元统计模型,即只引入词频并假定词与词之间是相互独立。我们引入词wi的词频信息P(wi),对模型进行改进,得到一个基于N-最短路径的一元统计模型。由贝耶斯定理:P(W|C)=P(W)P(C|W)/P(C),其中,P(C)是字串概率,是一个常数,不必考虑。从词串恢复到字串的概率P(C|W)=1(只有唯一的一种方式,因为字串只有一个)。
假设字串为C=c1c2..cn,要求的词串为W=w1w2..wm。求使得概率P(W|C)的值是最大的N个W。
采用一元统计模型,即只引入词频并假定词与词之间是相互独立。我们引入词wi的词频信息P(wi),对模型进行改进,得到一个基于N-最短路径的一元统计模型。由贝耶斯定理:P(W|C)=P(W)P(C|W)/P(C),其中,P(C)是字串概率,是一个常数,不必考虑。从词串恢复到字串的概率P(C|W)=1(只有唯一的一种方式,因为字串只有一个)。
问题就转化为确定P(W)最大的N种切分结果集合。
W=w1w2..wm是字串C=c1c2..cn的一种切分结果。wi是一个词,P(wi)表示wi的出现概率。在大规模语料库训练的基础上,根据大数定理:在大样本统计的前提下,样本的频率接近于其概率值。所以P(wi)的极大似然估计值等于词频。有:
P(wi) = ki / (k1 + k2 + .. + km),ki为wi在训练样本中出现的次数
对于一元统计模型,词与词之间是独立的,则W的联合概率P(W)=P(w1)*P(w2)*..*P(wm),设K=k1+k2+..+km,则:
P(W)=(k1/K)*(k2/K)*..*(km/K),令P*(W)=-lnP(W),则:
P*(W) = -lnP(w1)-lnP(w2)-..-lnP(wm) = -ln(k1/K)-ln(k2/K)-..-ln(km/K) = m*ln(K)-ln(k1)-ln(k2)-..-ln(km)
那么就把求P(W)的极大值问题转化为求P*(W)的极小值问题。适当修改切分有向无环图边长(加1是为了数据平滑处理):
(1)*<vk-1,vk>的长度值lk=-ln(0+1),(k=1,2,..,n)
(2)*w=cici+1..cj对应的有向边为<vi-1,vj>,其长度值lw=ln(K+m)-ln(ki+1)
P(wi) = ki / (k1 + k2 + .. + km),ki为wi在训练样本中出现的次数
对于一元统计模型,词与词之间是独立的,则W的联合概率P(W)=P(w1)*P(w2)*..*P(wm),设K=k1+k2+..+km,则:
P(W)=(k1/K)*(k2/K)*..*(km/K),令P*(W)=-lnP(W),则:
P*(W) = -lnP(w1)-lnP(w2)-..-lnP(wm) = -ln(k1/K)-ln(k2/K)-..-ln(km/K) = m*ln(K)-ln(k1)-ln(k2)-..-ln(km)
那么就把求P(W)的极大值问题转化为求P*(W)的极小值问题。适当修改切分有向无环图边长(加1是为了数据平滑处理):
(1)*<vk-1,vk>的长度值lk=-ln(0+1),(k=1,2,..,n)
(2)*w=cici+1..cj对应的有向边为<vi-1,vj>,其长度值lw=ln(K+m)-ln(ki+1)
N-最短路径的求解就是求v0到vn的N-最短路径集合。可以采用贪心方法,我们使用的算法是基于Dijkstra的一种简单扩展,改进的地方在于:每个节点处记录N个最短路径值,并记录相应路径上当前节点的前驱。如果同一长度对应多条路径,必须同时记录这些路径上当前节点的前驱。最后通过回溯可求出v0到vn的N-最短路径集合。
以3-最短路径方法为例。
假设词图如下,边长都为1:
以下是节点记录,前驱记录了(节点号,编号)

以下是节点记录,前驱记录了(节点号,编号)

现在从记录回溯第一条最短路径。由节点7的表格中查出前驱为(5,1),记录前驱节点为5,并沿着前驱继续查节点5的编号为1的记录,得前驱(3,1),依此类推得前驱(2,1)、(1、1)、(0,1),则得到切分为(0 1 2 3 5 7),即:他/说/的/确实/在理。
对于基于统计模型的N-最短路径问题,按照修改后的词图,使用上面的算法可以得出更准确的切分结果。
词图的构造是中科院计算技术研究所最先提出来的,并用于中科院的分词系统ICTCLAS中,我估计做中文分词的人都应该知道这个分词系统,网上有不少阅读这个分词系统的代码笔记,普遍反映这个词图构造是最难懂的一个部分,我没有仔细研究中科院的代码,但是我自己的实现是基于以上的论述,利用一个邻接表来实现,很简单的,vector再嵌一个vector就实现了,呵呵,stl有时候还是蛮可爱的嘛。
这个词图的实现不过100行左右代码,很美观,但确实是挺抽象的,你看懂了吗?
待续...