我正在使用OCR算法(基于tesseract),它难以识别某些字符。通过创建我自己的“后处理哈希表”,我已经部分地解决了这个问题。例如,由于文本只是数字,我已经发现如果文本中有Q
个字符,那么它应该是9
。
但是,6
和8
个字符存在更严重的问题,因为它们都被识别为B
。既然我知道我在寻找什么(当我将图像翻译成文本时)并且字符串相当短(6~8位),我想创建包含6
和{{的所有可能组合的字符串1}}并将它们中的每一个与我正在寻找的那个进行比较。
例如,我有OCR识别的以下字符串:
8
因此,此处的L0B7B0B5
每个B
或6
。
现在我想生成如下列表:
8
所以它是3位二进制表,在这种情况下有8个选项。但是字符串中L0878085
L0878065
L0876085
L0876065
.
.
个字符的数量可以不是3(可以是任意数字)。
我尝试过使用Python B
模块:
itertools
将提供以下结果:
list(itertools.product(*["86"] * 3))
我假设我以后可以用来交换[('8', '8', '8'), ('8', '8', '6'), ('8', '6', '8'), ('8', '6', '6'), ('6', '8', '8'), ('6', '8', '6'), ('6', '6', '8'), ('6', '6', '6')]
个字符。但是,出于某种原因,我不能让B
在我的环境中工作。我认为它有一些事情要做我正在使用 Jython 而不是纯粹的 Python 。
我很乐意听到有关如何完成此任务的任何其他想法。也许有一个我没想到的更简单的解决方案?
答案 0 :(得分:3)
itertools.product
接受您可以使用的repeat
关键字:
In [92]: from itertools import product
In [93]: word = "L0B7B0B5"
In [94]: subs = product("68", repeat=word.count("B"))
In [95]: list(subs)
Out[95]:
[('6', '6', '6'),
('6', '6', '8'),
('6', '8', '6'),
('6', '8', '8'),
('8', '6', '6'),
('8', '6', '8'),
('8', '8', '6'),
('8', '8', '8')]
然后,一个相当简洁的方法来进行替换是使用字符串replace
方法进行简化操作:
In [97]: subs = product("68", repeat=word.count("B"))
In [98]: [reduce(lambda s, c: s.replace('B', c, 1), sub, word) for sub in subs]
Out[98]:
['L0676065',
'L0676085',
'L0678065',
'L0678085',
'L0876065',
'L0876085',
'L0878065',
'L0878085']
另一种方法,使用itertools
中的几个函数:
In [90]: from itertools import chain, izip_longest
In [91]: subs = product("68", repeat=word.count("B"))
In [92]: [''.join(chain(*izip_longest(word.split('B'), sub, fillvalue=''))) for sub in subs]
Out[92]:
['L0676065',
'L0676085',
'L0678065',
'L0678085',
'L0876065',
'L0876085',
'L0878065',
'L0878085']
答案 1 :(得分:0)
这里用于生成字符串的简单递归函数: - (它是伪代码)
permut(char[] original,char buff[],int i) {
if(i<original.length) {
if(original[i]=='B') {
buff[i] = '6'
permut(original,buff,i+1)
buff[i] = '8'
permut(original,buff,i+1)
}
else if(original[i]=='Q') {
buff[i] = '9'
permut(original,buff,i+1)
}
else {
buff[i] = ch[i];
permut(original,buff,i+1)
}
}
else {
store buff[]
}
}