Node.js - Разобрать необработанный текст в JSON, используя RegEx. - PullRequest
0 голосов
/ 25 марта 2020

Я все еще новичок в Node.js и в настоящее время разрабатываю небольшое приложение для моей кухни. Это приложение может сканировать квитанции и использует OCR для извлечения данных. Для извлечения OCR я использую веб-интерфейс ocr-space. После этого мне нужно разобрать необработанный текст в структуру JSON и отправить его в мою базу данных. Я также проверил эту квитанцию, используя AWS textract, что дало мне еще худший результат. В настоящее время я борюсь за синтаксический анализ с использованием RegEx в Node.js.

Вот моя JSON структура, которую я использую для анализа данных квитанции:

receipt = {
      title: 'title of receipt'
      items: [
               'item1',
               'item2',
               'item3'
          ],
      preparation: 'preparation text' 
}

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

  • Поиск ключевых слов, таких как «предметы» и «подготовка» в необработанном тексте
  • Разбор текста между этими ключевыми словами
  • Выполнить дальнейшую строку обработка, как пропущенные пробелы, триминг и т. д. c.

Этот подход не работает, если эти ключевые слова отсутствуют. Возьмите, например, следующую квитанцию, где я изо всех сил пытаюсь разобрать ее в моей структуре JSON. Квитанция на немецком языке, и нет соответствующих ключевых слов («items» или «Zutaten», «prepare» или «Zubereitung»).

Необходима следующая информация из необработанного текста:

  • название: строка 1
  • элементы: строка 2 - 8
  • подготовка: строка 9 до конца

У вас есть какие-либо советы или подсказки, как поступить ближе к решению? Или у вас есть другие идеи, как соответствующим образом управлять такими ситуациями?

Quinoa-Brot
30 g Chiasamen
350 g Quinoa
70 ml Olivenöl
1/2 TL Speisenatron
1 Prise Salz
Saft von 1/2 Zitrone
1 Handvoll Sonnenblumenkerne
30 g Schwarzkümmelsamen
1 Chiasamen mit 100 ml Wasser
verrühren und 30 Minuten quel-
len lassen. Den Ofen auf 200 oc
vorheizen, eine kleine Kastenform
mit Backpapier auslegen.
2 Quinoa mit der dreifachen
Menge Wasser in einen Topf ge-
ben, einmal aufkochen und dann
3 Minuten köcheln lassen - die
Quinoa wird so nur teilweise ge-
gegart. In ein Sieb abgießen, kalt
abschrecken und anschließend
gut abtropfen lassen. 

Между каждой строкой есть \ n табулятор.

Обработанная квитанция должна выглядеть следующим образом:

receipt = {
    title: 'Quinoa-Brot',
    items: [
        '30 g Chiasamen',
        '350 g Quinoa',
        '70 ml Olivenöl',
        '1/2 TL Speisenatron',
        '1 Prise Salz',
        'Saft von 1/2 Zitrone'
        '1 Handvoll Sonnenblumenkerne'
        '30 g Schwarzkümmelsamen',
    ],
    preparation: '1 Chiasamen mit 100 ml Wasser verrühren und 30 Minuten quellen lassen. Den Ofen auf 200 oc vorheizen, eine kleine Kastenform mit Backpapier auslegen. 2 Quinoa mit der dreifachen Menge Wasser in einen Topf geben, einmal aufkochen und dann 3 Minuten köcheln lassen - die Quinoa wird so nur teilweise gegegart. In ein Sieb abgießen, kalt abschrecken und anschließend gut abtropfen lassen.'
}

1 Ответ

1 голос
/ 20 апреля 2020

Решения для сопоставления с образцом, такие как RegExp, не подходят для такой проблемы категоризации. Возможно, вы захотите рассмотреть кластеризацию (k-means, et c.) - обучение модели различать ингредиенты и инструкции. Это может быть сделано путем маркировки нескольких рецептов (чем больше, тем лучше), или путем использования неконтролируемого ML путем кластеризации построчно.

Если вам по какой-то причине нужно придерживаться RegExp, вы отслеживаете повторяющиеся слова. Слабая методология: на названия ингредиентов (Chiasemen, Quinoa,) будут ссылаться в инструкциях, так что вы можете найти совпадения на многострочном, чтобы найти, где то же слово будет повторяться позже:

(?<=\b| )([^ ]+)(?= |$).+(\1)

Если вы выполните это для al oop, плюс logi c, вы сможете найти пары ингредиент-инструкция и проработать документ с информацией о силуэте.

Возможно, вы сможете воспользоваться ингредиентом строки, содержащие цифры c, такие как числа или слова, такие как «кусочки, палки, листья», которые вы можете хранить в словаре. Это может обогатить совпадения входных границ слов.

Я бы вообще пересмотрел использование RegExp здесь ...

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