HimeraSearchDB
Carding_EbayThief
triada
CrackerTuch
d-shop
HimeraSearchDB

НОВОСТИ Алгоритмы пост-обработки результатов распознавания текстовых полей

Bonnie
Оффлайн
Регистрация
12.04.17
Сообщения
19.095
Реакции
107
Репутация
0
web4484wjnlsdgvcvav8khbyirq.jpeg

(изображение взято )

Сегодня мы бы хотели вам рассказать о задаче пост-обработки результатов распознавания текстовых полей исходя из априорных знаний о поле. Ранее мы уже писали про , который позволяет исправлять некоторые ошибки распознавания слов, написанных на естественных языках. Однако значительную часть важных документов, в том числе документов, удостоверяющих личность, составляют поля другого характера – даты, номера, VIN-коды автомобилей, номера ИНН и СНИЛС, с их контрольными суммами и многое другое. Хотя их нельзя отнести к полям естественного языка, тем не менее у таких полей зачастую существует некоторая, иногда неявная, языковая модель, а значит, для них тоже можно применить некоторые алгоритмы коррекции. В этом посте речь пойдет об двух механизмах пост-обработки результатов распознавания, которые можно применять для большого количества документов и типов полей.

Языковую модель поля можно условно подразделить на три составляющие:
  1. Синтаксис: правила, регулирующие структуру текстового представления поля. Пример: поле “дата окончания срока действия документа” в машинно-читаемой зоне представлятся в виде семи цифр “DDDDDDD”.
  2. Семантика поля: правила, основывающиеся на смысловой интерпретации поля или его составных частей. Пример: в поле “дата окончания срока действия документа” машинно-читаемой зоны первые две цифры – это последние две цифры года, 3-я и 4-я цифры – это месяц, 5-я и 6-я – это день, и 7-я цифра – контрольная сумма.
  3. Семантика связей: правила, основывающиеся на структурной и смысловой связи поля с другими полями документа. Пример: поле “дата окончания срока действия документа” не может кодировать дату, соответствующую более раннему моменту времени, чем поле “дата рождения”.

Располагая информацией о семантической и синтаксической структуре документа и распознаваемого поля, можно построить специализированный алгоритм пост-обработки результата распознавания. Однако, принимая во внимание необходимость поддержки и развития систем распознавания и сложность их разработки, интересно рассмотреть “универсальные” методы и инструменты, которые позволили бы с минимальными усилиями (со стороны разработчиков) построить достаточно хороший алгоритм пост-обработки, который бы работал с обширным классом документов и полей. Методика настройки и поддержки такого алгоритма была бы унифицирована, а изменяемым компонентом структуры алгоритма была бы только языковая модель.

Стоит отметить, что пост-процессинг результатов распознавания текстовых полей не всегда полезен, а иногда даже вреден: в случае, если у вас достаточно хороший модуль распознавания строки и вы работаете в критических системах с документами, удостоверяющими личность, то какой-либо пост-процессинг лучше минимизировать и выдавать результаты “так как есть”, либо четко контролировать любые изменения и сообщать о них клиенту. Однако во многих случаях, когда заведомо известно, что документ действительный, и что языковая модель поля надежна – использование алгоритмов пост-обработки позволяет значительно повысить итоговое качество распознавания.

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

Метод на основе взвешенных конечных преобразователей


Красивая и достаточно общая модель, позволяющая построить универсальный алгоритм пост-обработки результатов распознавания, описана . Модель опирается на структуру данных взвешенных конечных преобразователей (Weighted Finite-State Transducers, WFST).

WFST представляют собой обобщение взвешенных конечных автоматов – если взвешенный конечный автомат кодирует некоторый взвешенный язык
899a675510d28419769a9b42281f0c65.svg
(т.е. взвешенное множество строк над некоторым алфавитом
4e1b49a1f827737c3c2fec7b6eeef35b.svg
), то WFST кодирует взвешенное отображение языка
a2ab5882273242f94981925836a91ec8.svg
над алфавитом
2a6b1209bdf752a5f991cb012b5b791a.svg
в язык
3c46110c45a2c9d8d3c279cad331920b.svg
над алфавитом
e9fc45bcff4c99d6b42a83b8da01eabd.svg
. Взвешенный конечный автомат, принимая строку
5bf27c73c71f303844ee4973cab18377.svg
над алфавитом
4e1b49a1f827737c3c2fec7b6eeef35b.svg
, ставит ей в соответствие некоторый вес
02b27e089139bd8efdfe985192ec9336.svg
, тогда как WFST, принимая строку
32591378f1f3c477755274a1269b0f49.svg
над алфавитом
2a6b1209bdf752a5f991cb012b5b791a.svg
, ставит ей в соответствие множество (возможно, бесконечное) пар
d136d665d0c512df23a1eae1000eb95f.svg
, где
917beb0cc43863c39e8041595dc6f95c.svg
– строка над алфавитом
e9fc45bcff4c99d6b42a83b8da01eabd.svg
, в которую преобразуется строка
32591378f1f3c477755274a1269b0f49.svg
, а
9c6a44e8ed4cb10046e00346c6b58b15.svg
– вес такого преобразования. Каждый переход преобразователя характеризуется двумя состояниями (между которыми осуществляется переход), входным символов (из алфавита
2a6b1209bdf752a5f991cb012b5b791a.svg
), выходным символов (из алфавита
e9fc45bcff4c99d6b42a83b8da01eabd.svg
) и весом перехода. Считается, что пустой символ (пустая строка) является элементом обоих алфавитов. Весом преобразования строки
fb14b2485daa4b8f13252981a33df4e5.svg
в строку
92fe455fc98f988c4d76f3d76b36d7ef.svg
является сумма произведений весов переходов по всем путям, на которых конкатенация входных символов образует строку
fb14b2485daa4b8f13252981a33df4e5.svg
, а конкатенация выходных символов образует строку
92fe455fc98f988c4d76f3d76b36d7ef.svg
, и которые переводят преобразователь из начального состояния в одно из терминальных.

Над WFST определяется операция композиции, на которую и опирается метод пост-обработки. Пусть заданы два преобразователя
173a122f7849b9134ce2718c6e02ab46.svg
и
052301117e72c384454188c12ba6ec0b.svg
, причем
173a122f7849b9134ce2718c6e02ab46.svg
преобразует строку
fb14b2485daa4b8f13252981a33df4e5.svg
над
bf49536ff21c20c8dd6a6c30fa00884f.svg
в строку
92fe455fc98f988c4d76f3d76b36d7ef.svg
над
ea91a9a754c501c4e117285194fc1d8c.svg
с весом
f8d84154605b3652f439d036c0ae04ca.svg
, а
052301117e72c384454188c12ba6ec0b.svg
преобразует
92fe455fc98f988c4d76f3d76b36d7ef.svg
над
ea91a9a754c501c4e117285194fc1d8c.svg
в строку
be9efa77761b1343076071d07add5798.svg
над
b04afc54f564b1e7dc5ff1c3a8ec48cf.svg
с весом
1adf054f58e7620e4f853f436b39fcaa.svg
. Тогда преобразователь
d0fef745aef55c9cccf5c3b3999dbdb3.svg
, называемый композицией преобразователей, преобразует строку
fb14b2485daa4b8f13252981a33df4e5.svg
в строку
be9efa77761b1343076071d07add5798.svg
с весом
6b6267867aed215a641ef6b00fdbf382.svg
. Композиция преобразователей является вычислительно затратной операцией, но может вычисляться лениво – состояния и переходы результирующего преобразователя могут быть построены в момент, когда к ним необходимо совершать доступ.

Алгоритм пост-обработки результата распознавания на основе WFST опирается на три основных источника информации – модель гипотез
c25cdf6f30745730e0ef76706327c970.svg
, модель ошибок
efb79e7df0792cea483c6ed41efea702.svg
и языковую модель
b8f002734a17c86c9be6e9e3aa8cdfb0.svg
. Все три модели представляются в виде взвешенных конечных преобразователей:

  1. Модель гипотез
    c25cdf6f30745730e0ef76706327c970.svg
    представляет из себя взвешенный конечный автомат (частный случай WFST – каждая строка преобразуется сама в себя, вес преобразования совпадает с весом самой строки), принимающий гипотезы, видвинутые системой распознавания поля. К примеру, пусть результатом распознавания текстового поля является последовательность ячеек
    2b473fd75c118eae403e73e06abc0cfc.svg
    , а каждая ячейка соответствует результату распознавания некоторого символа и представляет собой множество альтернатив и их оценок (весов):
    efd145e4a2defc2ed71b4e24bf8e9bd1.svg
    , где
    af8a1cf667abc5982ba8b1008ab1d698.svg
    c7307a1bf9d387db2abbcfc4215797c1.svg
    -й символ алфавита,
    8c626b0640801ca8b783dd4d27187a9e.svg
    – оценка (вес) этого символа. Тогда модель гипотез можно представить в виде конечного преобразователя с
    c3c523a878065a0846fa7e92f7e5293c.svg
    -м состоянием, уложенным в цепочку:
    5f855ab76444c11e5dff28e478ebe06a.svg
    -е состояние является начальным,
    a1e39da1c84981d7264baa207047222a.svg
    -е – терминальным, переходы осуществляются между
    afde825977cf3ca73a2f1952aa66c2cd.svg
    -м и
    75cb01aa8d9f97db4343ac0c5ef11b2d.svg
    -м состояниями и соответствуют ячейке
    0c57245dbd3c18e987498491056a7911.svg
    . На
    c7307a1bf9d387db2abbcfc4215797c1.svg
    -м переходе входным и выходным символом является символ
    af8a1cf667abc5982ba8b1008ab1d698.svg
    , а вес перехода соответствует оценке данной альтернативы. Ниже на рисунке представлен пример модели гипотез, сооветствующей результату распознавания строки из трех символов.
    7kjo13f-3_8ydvxj2ub421zhzyq.png

    Рис. 1. Пример модели гипотез, представленной в виде WFST (рисунок из ). Переходы с нулевым весом опущены.

  1. Модель ошибок
    efb79e7df0792cea483c6ed41efea702.svg
    является взвешенным конечным преобразователем, кодирующим всевозможные преобразования гипотез, которые можно производить для их приведения в соответствие языковой модели. В самом простом случае она может быть представлена в виде WFST с единственным состоянием (которое является и начальным и терминальным). Каждый переход кодирует некоторое изменение символа с соответствующим весом. К примеру, весом замены символа может являться оценка вероятности соответствующей ошибки алгоритма распознавания символа.
  2. Языковой моделью
    b8f002734a17c86c9be6e9e3aa8cdfb0.svg
    является представление синтаксиса и семантики распознаваемого поля в виде взвешенного конечного автомата. Т.е. языковой моделью яляется автомат, принимающий все допустимые значения рассматриваемого поля (и выставляющий каждому допустимому значению некоторый вес).

После определения модели гипотез, ошибок и языковой модели задача пост-обработки результатов распознавания теперь может быть поставлена следующим образом: рассмотрим композицию всех трех моделей
258b217865a28732f7efea99f27844a5.svg
(в терминах композиции WFST). Преобразователь
3650cb4e8670eeb97ce55a835259374a.svg
кодирует всевозможные преобразования строк
fb14b2485daa4b8f13252981a33df4e5.svg
из модели гипотез
c25cdf6f30745730e0ef76706327c970.svg
в строки
be9efa77761b1343076071d07add5798.svg
из языковой модели
b8f002734a17c86c9be6e9e3aa8cdfb0.svg
, применяя к строкам
fb14b2485daa4b8f13252981a33df4e5.svg
преобразования, закодированные в модели ошибок
efb79e7df0792cea483c6ed41efea702.svg
. Причем вес такого преобразования включает вес исходной гипотезы, вес преобразования и вес результирующей строки (в случае взвешенной языковой модели). Соответственно в такой модели оптимальной пост-обработке результата распознавания будет соответствовать оптимальный (с точки зрения веса) путь в преобразователе
3650cb4e8670eeb97ce55a835259374a.svg
, переводящий его из начального в одно из терминальных состояний. Входная строка на этом пути будет соответствовать выбранной исходной гипотезе, а выходная строка – исправленному результату распознавания. Оптимальный путь можно искать с помощью алгоритмов поиска кратчайших путей в ориентированных графах.

Преимуществами данного подхода является его общность и гибкость. Модель ошибок, к примеру, может быть без труда расширена таким образом, чтобы учесть удаления и добавления символов (для этого всего лишь стоит добавить в модель ошибок переходы с пустым выходным или входным символом соответственно). Однако у такой модели есть и существенные недостатки. Во-первых, языковая модель здесь должна быть представлена в виде конечного взвешенного конечного преобразователя. Для сложных языков такой автомат может получиться довольно громоздким, и в случае изменения или уточнения языковой модели будет необходимо его перестроение. Также необходимо заметить, что композиция трех преобразователей в качестве результата имеет, как правило, еще более громоздкий преобразователь, а эта композиция вычисляется каждый раз при запуске пост-обработки одного результата распознавания. Ввиду громоздкости композиции, поиск оптимального пути на практике приходится выполнять эвристическими методами, такими как A*-search.

Метод на основе проверяющих грамматик


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

Проверяющей грамматикой будем называть пару
fd347b00c55ac4ec6540b463ad680c1b.svg
, где
4e1b49a1f827737c3c2fec7b6eeef35b.svg
– алфавит, а
d010b8a414d72f3ae43997a3a0c383db.svg
– предикат допустимости строки над алфавитом
4e1b49a1f827737c3c2fec7b6eeef35b.svg
, т.е.
282f7a5f2b4b8217fcb3e2f19c580e65.svg
. Проверяющая грамматика кодирует некоторый язык над алфавитом
4e1b49a1f827737c3c2fec7b6eeef35b.svg
следующим образом: строка
cbda7dcf37fe5ffdfb068437f1a9639d.svg
принадлежит языку, если предикат
d010b8a414d72f3ae43997a3a0c383db.svg
принимает на этой строке истинное значение. Стоит заметить, что проверяющая грамматика является более общим способом представления языковой модели, чем конечный автомат. Действительно, любой язык, представимый в виде конечного автомата
3650cb4e8670eeb97ce55a835259374a.svg
, может быть представлен в виде проверяющей грамматики (с предикатом
3dea6c104ca5878cea71b4e0f6a431df.svg
, где
ee29d3119304322fc8ff23735ff9c8bd.svg
– множество строк, принимаемых автоматом
3650cb4e8670eeb97ce55a835259374a.svg
. Однако не все языки, которые можно представить в виде проверяющей грамматики, представимы в виде конечного автомата в общем случае (к примеру, язык слов неограниченной длины над алфавитом
a9843f42dac088912b353acfdcb9a4d1.svg
, в которых количество символов
77a3ebb4782888583e97885d3053b554.svg
больше, чем количество символов
4281f5336579f64aa8eac86ca1503e43.svg
).

Пусть задан результат распознавания (модель гипотез) в виде последовательности ячеек
2b473fd75c118eae403e73e06abc0cfc.svg
(таких же, как и в предыдущем разделе). Для удобства будем считать, что каждая ячейка содержит K альтернатив и все оценки альтернатив принимают положительное значение. Оценкой (весом) строки будем считать произведение оценок каждого из символов этой строки. Если модель языка задана в виде проверяющей грамматики
fd347b00c55ac4ec6540b463ad680c1b.svg
, то задача пост-обработки может быть сформулирована в виде задачи дискретной оптимизации (максимизации) на множестве управлений
6ef02b58077800a2b22a5e71ecc6eeec.svg
(множестве всех строк длины
a1e39da1c84981d7264baa207047222a.svg
над алфавитом
4e1b49a1f827737c3c2fec7b6eeef35b.svg
) с предикатом допустимости
d010b8a414d72f3ae43997a3a0c383db.svg
и функционалом
8d920b0e847b392accd0e0d75498c7ed.svg
, где
1d37353a3480e6c9e24bf62a3fc10f3b.svg
– оценка символа
7a362f59eba33ebc236fefd712440e76.svg
в
75cb01aa8d9f97db4343ac0c5ef11b2d.svg
-й ячейке.

Любая задача дискретной оптимизации (т.е. с конечным множестве управлений) может быть решена при помощи полного перебора управлений. Описываемый алгоритм эффективно перебирает управления (строки) в порядке убывания значения функционала до того момента, пока предикат допустимости не примет истинного значения. Зададим как
8da05675e58b0287c1cca7e37cdc1d99.svg
максимальное количество итераций алгоритма, т.е. максимальное количество строк с максимальной оценкой, на которой будет вычисляться предикат.

Вначале проведем сортировку альтернатив по убыванию оценок, и будем далее считать что для любой ячейки
0c57245dbd3c18e987498491056a7911.svg
верно неравенство
200613c3daed32c6a4e077ebbef7b2d0.svg
при
e18bc0ef500bf2eacf31394cbb669379.svg
. Позицией будем называть последовательность индексов
6c81616fd0777598b5f72bb00fd1d82f.svg
, соответствующее строке
bffa1170928103888512e8f4abdf6e06.svg
. Оценкой позиции, т.е. значением функционала на этой позиции, считаем произведение оценок альтернатив, соответствующих индексам, входящих в позицию:
d105a539751b437b9b41c67ac7ed1c5b.svg
. Для хранения позиций потребуется структура данных PositionBase, позволяющая добавлять новые позиции (с получением их адреса), получать позицию по адресу и проверять, добавлена ли заданная позиция в базу.

В процессе перечисления позиций мы будем выбирать непросмотренную позицию с максимальной оценкой, после чего добавлять в очередь на рассмотрение PositionQueue все позиции, которые можно получить из текущей добавлением единицы к одному из индексов, входящих в позицию. Очередь на рассмотрение PositionQueue будет содержать тройки
9596c2843676ec22e1ca35c324669dbd.svg
, где
859cfd804dfe88b1fdb1b431d440de8e.svg
– оценка непросмотренной позиции,
bc2e1316980f83eed49a82ca5dd0f525.svg
– адрес просмотренной позиции в PositionBase, из которой была получена данная позиция,
fdfd51092bb8d23740bdaae45950aa8f.svg
– индекс элемента позиции с адресом
bc2e1316980f83eed49a82ca5dd0f525.svg
, который был увеличен на единицу для получения данной позиции. Для организации очереди PositionQueue потребуется структура данных, позволяющая добавлять очередную тройку
9596c2843676ec22e1ca35c324669dbd.svg
, а также извлекать тройку с максимальной оценкой
859cfd804dfe88b1fdb1b431d440de8e.svg
.

На первой итерации алгоритма необходимо рассмотреть позицию
0506aa3230e4366f656c45913cf57b70.svg
, обладающую максимальной оценкой. Если предикат
d010b8a414d72f3ae43997a3a0c383db.svg
принимает на строке, соответствующей этой позиции, истинное значение, то алгоритм завершается. В противном случае позиция
32591378f1f3c477755274a1269b0f49.svg
добавляется в PositionBase, а в PositionQueue добавляются все тройки вида
72e309388903ac3376e98d8e64316b3f.svg
, для всех
f10c629c68a8bd9faeb57dbc4b293b4e.svg
, где
42e06f19806b7f405c5c29221d5331ee.svg
– адрес начальной позиции в PositionBase. На каждой последующей итерации алгоритма из PositionQueue извлекается тройка
9596c2843676ec22e1ca35c324669dbd.svg
с максимальным значением оценки
859cfd804dfe88b1fdb1b431d440de8e.svg
, по адресу исходной позиции
bc2e1316980f83eed49a82ca5dd0f525.svg
и индексу
fdfd51092bb8d23740bdaae45950aa8f.svg
восстанавливается рассматриваемая позиция
5bf27c73c71f303844ee4973cab18377.svg
. Если позиция
5bf27c73c71f303844ee4973cab18377.svg
уже добавлена в базу рассмотренных позиций PositionBase, то она пропускается и из PositionQueue извлекается очередная тройка с максимальным значением оценки
859cfd804dfe88b1fdb1b431d440de8e.svg
. В противном случае на строке, соответствующей позиции
5bf27c73c71f303844ee4973cab18377.svg
проверяется значение предиката
d010b8a414d72f3ae43997a3a0c383db.svg
. Если предикат
d010b8a414d72f3ae43997a3a0c383db.svg
принимает на этой строке истинное значение, то алгоритм завершается. Если предикат
d010b8a414d72f3ae43997a3a0c383db.svg
не принимает истинное значение на этой строке, то строка
5bf27c73c71f303844ee4973cab18377.svg
добавляется в PositionBase (с присвоением адреса
3a1668281daf18680a259de22f952e27.svg
), в очередь PositionQueue добавляются все производные позиции и происходит переход к следующей итерации.


FindSuitableString(M, N, K, P, C[1], ..., C[N]):
для каждого i : 1 ... N:
сортировка C по убыванию оценок альтернатив
(конец цикла)
инициализация PositionBase и PositionQueue
S_1 = {1, 1, 1, ..., 1}
если P(S_1):
ответ: S_1, алгоритм завершается
(конец условия)
добавление S_1 в PositionBase с адресом R(S_1)
для каждого i : 1 ... N:
если K > 1, то:
добавить тройку q[1], R(S_1), i> в PositionQueue
(конец условия)
(конец цикла)
пока количество позиций в PositionBase меньше M:
пока не пуста PositionQueue:
извлечь из PositionQueue тройку с максимальной Q
S_from = позиция в PositionBase по адресу R
S_curr = {S_from[1], S_from[2], ..., S_from + 1, ..., S_from[N]}
если S_curr содержится в PositionBase:
продолжаем цикл
иначе:
добавить S_curr в PositionBase с адресом R(S_curr)
(конец условия)
если P(S_curr):
ответ: S_curr, алгоритм завершается
(конец условия)
для каждого i : 1 ... N:
если K > S_curr:
добавить тройку q[S_curr],
R(S_curr),
i> в PositionQueue
(конец условия)
(конец цикла)
выход из внутреннего цикла
(конец цикла)
(конец цикла)
ответ не найден за M итераций



Заметим, что за
8da05675e58b0287c1cca7e37cdc1d99.svg
итераций будет осуществлена проверка предиката не более чем
8da05675e58b0287c1cca7e37cdc1d99.svg
раз, произойдет не более
8da05675e58b0287c1cca7e37cdc1d99.svg
добавлений в PositionBase, а добавление в PositionQueue, извлечение из PositionQueue, а также поиск в PositionBase произойдет не более
d3cea060e08931d2d2ae58bc4c90f712.svg
раз. Если для реализации PositionQueue используется структура данных “куча”, а для организации PositionBase используеся структура данных “бор”, то трудоемкость алгоритма составляет
8f66c0ef2fb6320ab87d5f1e728d4586.svg
, где
3bdae27e65ac0c352379343b50b3a1b0.svg
– трудоемость проверки предиката
d010b8a414d72f3ae43997a3a0c383db.svg
на строке длины
a1e39da1c84981d7264baa207047222a.svg
.

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

Однако быстродействие и простота использования (при работе с новым типом поля нужно просто дать алгоритму доступ к функции валидации значения) делают метод на основе проверяющих грамматик очень мощным инструментом в арсенале разработчика систем распознавания документов. Мы используем данный подход для большого количества разнообразных полей, таких как всевозможные даты, номер банковской карты (предикат – проверка ), поля машинно-читаемых зон документов с контрольными суммами, и многих других.



Публикация подготовлена на основе : Универсальный алгоритм пост-обработки результатов распознавания на основе проверяющих грамматик. K.Б. Булатов, Д.П. Николаев, В.В. Постников. Труды ИСА РАН, Т. 65, № 4, 2015, стр. 68-73.
 
Сверху Снизу