Динамическая строка OCR для анализа YAML с помощью python & regex - PullRequest
0 голосов
/ 06 октября 2019

Я пытаюсь проанализировать результат распознавания Google для квитанции в структурированном YAML / JSON.

Например, рассмотрим квитанцию ​​с такими атрибутами:

  • SKU
  • Название товара
  • Итоговая цена
  • Количество и цена за единицу
  • Депозит в контейнере

И пример сканирования квитанции двухв корзине:

image

Вот результат распознавания:

1438                          # captain's SKU
CAPTAIN MORGAN WHITE 1X1.14L  # captain's item name
66.98 G                       # captain's subtotal
2 @ 33.49                     # captain's quantity and price per item
Container Deposit             # ignore this
773143                        # cazadores's SKU
CAZADORES BLANCO 1X750ml      # cazadores's item name
0.40                          # captain's container deposit value (it strangely shows here)
159.95 G                      # cazadores's subtotal
5 @ 31.99                     # cazadores's quantity and price per item
Container Deposit             # ignore this
0.50                          # cazadores's container deposit value

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

Каков наилучший способ точного анализа с помощью регулярных выражений?

Что я пробовал: у меня есть несколько регулярных выражений для каждого атрибута, например:

regex_library = {
    'sku': re.compile(r'\n(\d{3,})\n[A-Z]{2}'),
    'subtotal_and_tax_type': re.compile(r'(\d+.\d+) (G)'),
    'description': [
        re.compile(r'[A-Z- \']{5,50}\d[xX]\d+\.\d+L'),          # for pattern like 1x1.14L, like CAPTAIN MORGAN WHITE 1X1.14L'
        re.compile(r'[A-Z0-9- \']{5,50}\d[xX]\d+[Mm][Ll]\n'),   # for pattern that ends with ml, like 'CAZADORES BLANCO 1X750ml\n' 'EL JIMADOR BLANCO 1X750mL\n'
        re.compile(r'[A-Z0-9- \']{5,50}\d[xX]\d+[Mm]\n'),       # for missing the 'l' on 'ml', like "ROAD13 HONEST JOHN'S ROSE 1X750m\n", 'CAPTAIN MORGAN - SPICED 1X750m\n'
    ],
    'container_deposit': re.compile(r'[01]\.\d0'),
    'quantity_unit_price': [
        re.compile(r'\d+ @ \d+\.\d\d'),                         # for normal one, like ['2 @ 29.99']
        re.compile(r'\d+ \d+\.\d\d'),                           # for missing @, like ['3 48.49', '4 31.99']
        re.compile(r'\n\d{4}[\.,]\d\d\n'),                      # for no space and dot is acted like comma, like ['1220,49', '\n1216.49\n']
    ],
}

При подходе, подобном описанному выше, я получил список каждого атрибута, например:

  • список SKU
  • список имени элемента
  • и так далее

Затем я объединил его с zip, чтобы выполнить итерацию одновременно и сформировать его в класс отдельного элемента.

Проблема в том, что вывод OCR настолько дикийчто мне очень трудно добавить / проверить новое регулярное выражение. Мне кажется, что я нашел определенно работающий шаблон регулярных выражений, но он просто не работает на новом OCR-результате другого получения и так далее. А когда произошел сбой одного шаблона, итерация zip также не удастся, и я пропущу один или несколько элементов.

Опять же: Каков наилучший способ точного анализа этих данных с помощью регулярного выражения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...