2013-07-11 5 views
0

Ниже приведена функция, которая использует TessNet2 (OCR framework) для сканирования списка слов, записанных функцией OCR, встроенной в TessNet2. Поскольку страницы, которые я просматриваю в нашем менее совершенном качестве, обнаружение слов не на 100% точнее.Логика распознавания слов OCR

Поэтому иногда это путает «S» с «5» или «l» с «1». Кроме того, он не учитывает капитализацию. Поэтому я должен искать оба случая.

Способ, которым это работает, заключается в том, что я ищу определенные слова, близкие друг к другу на бумаге. Таким образом, первый набор слов [I] - это «Упорядоченный сервис по упорядочению». Если страница содержит эти слова рядом друг с другом, она переходит к следующему набору слов [j], а затем к следующему [h]. Если страница содержит все 3 набора слов, она возвращает true.

Это лучший способ, о котором я думал, но я надеюсь, что кто-то здесь может дать мне другой способ попробовать.

public Boolean isPageABSTRACTING(List<tessnet2.Word> wordList) 
    { 

     for (int i = 0; i < wordList.Count; i++) //scan through words 
     { 
      if ((wordList[i].Text == "Abstracting" || wordList[i].Text == "abstracting" || wordList[i].Text == "abstractmg" || wordList[i].Text == "Abstractmg" && wordList[i].Confidence >= 50) && (wordList[i + 1].Text == "Service" || wordList[i + 1].Text == "service" || wordList[i + 1].Text == "5ervice" && wordList[i + 1].Confidence >= 50) && (wordList[i + 2].Text == "Ordered" || wordList[i + 2].Text == "ordered" && wordList[i + 2].Confidence >= 50)) //find 1st tier check 
      { 
       for (int j = 0; j < wordList.Count; j++) //scan through words again 
       { 
        if ((wordList[j].Text == "Due" || wordList[j].Text == "Oue" && wordList[j].Confidence >= 50) && (wordList[j + 1].Text == "Date" || wordList[j + 1].Text == "Oate" && wordList[j + 1].Confidence >= 50) && (wordList[j + 2].Text == "&" && wordList[j + 2].Confidence >= 50)) //find 2nd tier check 
        { 
         for (int h = 0; h < wordList.Count; h++) //scan through words again 
         { 
          if ((wordList[h].Text == "Additional" || wordList[h].Text == "additional" && wordList[h].Confidence >= 50) && (wordList[h + 1].Text == "comments" || wordList[h + 1].Text == "Comments" && wordList[h + 1].Confidence >= 50) && (wordList[h + 2].Text == "about" || wordList[h + 2].Text == "About" && wordList[h + 2].Confidence >= 50) && (wordList[h + 3].Text == "this" || wordList[h + 3].Text == "This" && wordList[h + 3].Confidence >= 50)) //find 3rd tier check 
          { 
           return true; 
          } 
         } 
        } 
       } 
      } 
     } 

     return false; 
    } 

ответ

2

Во-первых, нет никакой необходимости в избыточных объемлющих циклов, каждый внутренний цикл не зависит ни от чего из внешнего цикла, так что нет никакой необходимости в огромной потери производительности от зацикливания над словами N^3 раза (в отличие от 3N).

Во-вторых, я думаю, что есть более элегантные подходы (например, использование словаря слов и вычисление наилучшего соответствия словам, которые не находятся в словаре, или другие более динамичные подходы), но они будут включать более сложные алгоритмы , Простой подход к эквиваленту можно сделать с помощью регулярных выражений:

// combine all the words into 1 string separated by a space 
// where the confidence is high enough 
// use a word that the regex's won't match for words where the confidence 
// isn't high enough 
var text = wordList.Select(w => w.Confidence >= 50 ? w.Text : "DONTMATCH") 
      .Aggregate((x,y) => x + " " + y); 

// now run the text through regular expressions 
// to match each criteria allowing for case insensitivity 
// and known misidentifications 
if (!Regex.IsMatch(text, @"abstract(in|m)g\s+(s|5)ervice\s+ordered", RegexOptions.IgnoreCase)) 
    return false; 

if (!Regex.IsMatch(text, @"(d|o)ue\s+(d|o)ate\s+&", RegexOptions.IgnoreCase)) 
    return false; 

if (!Regex.IsMatch(text, @"additional\s+comments\s+about\s+this", RegexOptions.IgnoreCase)) 
    return false; 
return true; 

Поскольку ваш алгоритм заинтересован только в нескольких конкретных фраз, и вы не хотите, чтобы соответствовать, когда доверие к слову является слишком низким , мы можем легко объединить все слова в одну длинную строку, разделенную пробелами (для удобства). Затем мы строим регулярные выражения для удовлетворения 3-х фраз, представляющих интерес, с известными альтернативами, и просто проверяем конкатенированную строку на регулярные выражения.

Это, очевидно, будет только для удовлетворения этого весьма специфического случая Тхо ...

+0

Не согласитесь, объяснив немного кода. Когда я запускаю это, «текст» становится строкой всего текста в результатах OCR, но несколько слов имеют «DONTMATCH». Я предполагаю, что это из-за того, что доверие не превышает 50. – MaylorTaylor

+0

попытался добавить немного больше объяснений в ... –

1

Вы можете попробовать использовать некоторые словарный запас и найти слово, наиболее близкий к признан Левенштейна Расстояние.