Algorithm 这是维特比的好例子吗';什么是最佳路径?

Algorithm 这是维特比的好例子吗';什么是最佳路径?,algorithm,path,viterbi,Algorithm,Path,Viterbi,我一直在开发一个程序,可以读取OCR输出,找到页码,然后将它们返回给我。每当我的函数找到一个数字时,它就会开始一个序列,然后在下一页查找比上一页大1的数字。它还可以添加空格来推断缺失的数字 在任何给定的书上,我的函数都将识别1-100个潜在序列。它识别的许多序列都是垃圾…完全没有用。然而,其他的通常是主序列的子集,可以缝合在一起形成更全面的序列。这是我的问题:如何将它们缝合在一起?到目前为止,我的输出如下所示: Index: 185 PNUM: 158 Index: 186 PNUM:

我一直在开发一个程序,可以读取OCR输出,找到页码,然后将它们返回给我。每当我的函数找到一个数字时,它就会开始一个序列,然后在下一页查找比上一页大1的数字。它还可以添加空格来推断缺失的数字

在任何给定的书上,我的函数都将识别1-100个潜在序列。它识别的许多序列都是垃圾…完全没有用。然而,其他的通常是主序列的子集,可以缝合在一起形成更全面的序列。这是我的问题:如何将它们缝合在一起?到目前为止,我的输出如下所示:

 Index: 185 PNUM: 158   
 Index: 186 PNUM: 159   
 Index: 187 PNUM: 160   
 Index: 188 PNUM: 161   
 Index: 189 PNUM: 162   
 Index: -1 PNUM: blank   
 Index: -1 PNUM: blank   
 -------------------------------------------------
 Index: 163 PNUM: 134   
 Index: 164 PNUM: 135   
 Index: -1 PNUM: blank   
-------------------------------------------------
 Index: 191 PNUM: 166   
 Index: 192 PNUM: 167   
 Index: 193 PNUM: 168   
 Index: 194 PNUM: 169   
索引是本书封面的页数,包括所有版权、奉献、目录等传统上不编号的页面。PNUM是检测到的我的alg页码。这里我们可以看到三种不同的序列,它们的顶部和底部应该缝合在一起。正如您所注意到的,顶部序列的索引中的偏移量和pnum之间的偏移量是27,而底部序列的偏移量是25。偏移量之间存在差异的最常见原因是缺少页面或页面被扫描了两次


有人建议我使用维特比最佳路径算法将这些序列缝合在一起,但这种方法对我来说似乎有些过分,因为我只需要将序列缝合在一起,而不需要确认它们的准确性。我真的不知道该怎么办,我非常感谢任何帮助。谢谢

维特比

是的,维特比会工作,有点过火,但会给你很大的灵活性,以弥补OCR中的问题,丢失的页面,重复等

如果你使用维基百科伪代码,你的问题可以重新表述为

//this is the actual hidden variable you're trying to guess
states = ('i', 'ii', 'iii', 'iv', ...., '1','2','3' ....)

//what OCR will give you, a 98% accurate view of state
//blank is for when there is no page number
//other is for an OCR result you didn't anticipate, such as 'f413dsaf'
possible_observations = (blank,other, 'i','ii','iii','iv',...,'1','2','3'...)

//the probability distribution of states for the first page
//must sum to 1.0
start_probability = {'i': 0.2, '1':0.5, all the rest: (1-0.7)/numOtherStates}

//the probability that the state '2' is found after '1'
//let's put a 0.05 percent chance of duplicate
//and put a very small probability of getting somewhere random
transition_probability = {
'i' : {'ii':0.8,'1':0.1,'i':0.05,allOthers: 0.05/numOtherStates},
'1' : {'2': 0.9, '1': 0.05, allOthers: 0.05/numOtherStates}
//etc
}

//that's the probability of what you OCR will see given the true state
//for the true page '1', there's 95% percent chance the OCR will see '1', 1% it will see    
//'i', 3% it will see a blank, and 0.01%/otherObservation that it will OCR something else
//you can use some string distance for that one (Levenshtein etc...)
emission_probability = {
'1' : {'1': 0.95, 'i': 0.01, blank: 0.03, otherObservations: (0.01)/numObservations},
'2' : {'2': 0.95, 'z': 0.01, blank: 0.03, otherObservations: (0.01)/numObservations},
}

observations = for i = 1 to maxINDEX {PNUM[INDEX]}
其他可能性:使用levenshtein距离


将所有页码按顺序再次放入数组{PNUM[INDEX=0],PNUM[INDEX=1],…},并尝试将其与1,2,3。。。最大值(PNUM)。在计算距离时,levenshtein算法将插入更改(删除、插入、页面更改)。如果您编写代码来显示这些更改,您也应该有一些像样的东西。

谢谢您的帮助!由于书籍通常至少有100页,这是否意味着我必须输入1-100之间的所有可能数字?是的,你的状态空间将是'I','ii','iii','1','max PNUM',因此你的转移矩阵将非常大,但主系数在对角线上方(期望跳到下一页)。维特比应该返回最大概率的序列。如果你想开始估计概率矩阵或观察值,那就是成熟的HMM。