Node.js - 使用 RegEx 将原始文本解析为 JSON

Node.js - Parse raw text to JSON using RegEx

我还是 Node.js 的新手,目前正在为我的厨房开发一个小应用程序。此应用程序可以扫描收据并使用 OCR 提取数据。对于 OCR 提取,我使用 ocr-space 网络 api。之后我需要将原始文本解析为 JSON 结构并将其发送到我的数据库。我还使用 AWS textract 测试了这张收据,结果更差。 目前我在 Node.js 中使用 RegEx 的解析部分苦苦挣扎。

这是我用来解析收据数据的 JSON 结构:

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

由于大多数收据都有一个项目部分,然后是一个准备部分,我目前的一般方法如下所示:

如果缺少这些关键字,此方法将不起作用。以下面的收据为例,我很难将其解析为我的 JSON 结构。收据是德文的,没有对应的关键字('items'或'Zutaten','preparation'或'Zubereitung')。

需要原始文本中的以下信息:

您有任何提示或技巧可以帮助您更接近解决方案吗?或者您有任何其他想法如何相应地处理此类情况?

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.'
}

RegExp 等模式匹配解决方案听起来不适合此类分类问题。您可能需要考虑聚类(k-means 等)——训练模型以区分成分和说明。这可以通过标记许多食谱(越多越好)或通过逐行聚类使用无监督 ML 来完成。

如果您出于某种原因需要坚持使用 RegExp,请跟踪重复的单词。弱方法:成分名称(Chiasemen、Quinoa、)将在说明中引用,因此您可以在多行上进行匹配以查找稍后重复相同单词的位置:

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

如果你运行循环执行此操作,加上逻辑,你可以找到成对的成分-说明对,并使用剪影信息浏览文档。

您或许可以利用包含数字数据(如数字)或字词(如 "piece(s), sticks, leaves")的成分行,这些数据可能会存储在字典中。可以丰富词边界输入匹配。

我会重新考虑在这里使用 RegExp...