用所有可能的组合创建字符串

时间:2013-12-05 04:02:02

标签: python algorithm ocr jython combinatorics

我正在使用OCR算法(基于tesseract),它难以识别某些字符。通过创建我自己的“后处理哈希表”,我已经部分地解决了这个问题。例如,由于文本只是数字,我已经发现如果文本中有Q个字符,那么它应该是9

但是,68个字符存在更严重的问题,因为它们都被识别为B。既然我知道我在寻找什么(当我将图像翻译成文本时)并且字符串相当短(6~8位),我想创建包含6和{{的所有可能组合的字符串1}}并将它们中的每一个与我正在寻找的那个进行比较。

例如,我有OCR识别的以下字符串:

8

因此,此处的L0B7B0B5 每个B6

现在我想生成如下列表:

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

我很乐意听到有关如何完成此任务的任何其他想法。也许有一个我没想到的更简单的解决方案?

2 个答案:

答案 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[]     

  }


}