用ERNIE-Layout看图自动写报告:深度学习在自动报告生成中的实践

目录

简介:

1 环境准备

2 ERNIE-Layout文档智能应用

3 生成文档问答word报告

4 应用部署


简介:

在这篇博客文章中,我们将探讨如何使用ERNIE-Layout,一种先进的基于深度学习的视觉布局理解模型,实现看图自动写报告的功能。对于从事数据分析、商业智能等领域的专业人士来说,如何快速准确地从复杂的图表中提取信息并生成结构化的报告,一直是一个重要且具有挑战性的问题。幸运的是,借助最新的人工智能技术,我们现在可以设计出能自动完成这一任务的系统。

ERNIE-Layout是一个用于文档理解和信息提取的模型,能够理解并分析图像和文本信息,特别适用于处理混合了文本和非文本元素的复杂场景。在本篇博客中,我们将详细介绍如何利用ERNIE-Layout从图像中提取关键信息,并结合自然语言处理技术生成易于理解的报告。内容将涵盖数据预处理、模型训练、结果生成等全流程。

无论你是一位机器学习的专业研究者,还是一位对自动报告生成技术感兴趣的开发者,我们都相信你能在这篇文章中获得新的知识和灵感。让我们一起探索深度学习如何帮助我们更好地理解和呈现数据,解决真实世界的问题。

1 环境准备

In [50]

# 安装依赖库
!pip install --upgrade paddleocr
!pip install --upgrade paddlenlp
!pip install python-docx

2 ERNIE-Layout文档智能应用

ERNIE-Layout以文心文本大模型ERNIE为底座,融合文本、图像、布局等信息进行跨模态联合建模,创新性引入布局知识增强,提出阅读顺序预测、细粒度图文匹配等自监督预训练任务,升级空间解偶注意力机制,在各数据集上效果取得大幅度提升。

针对主流场景,ERNIE-Layout提供了开箱即用的Taskflow能力。

我们来看下面这张表格图片,体验下ERNIE-Layout强大的文档智能问答能力。

In [10]

from pprint import pprint
from paddlenlp import Taskflow
import numpy as np

docprompt = Taskflow("document_intelligence")
pprint(docprompt([{"doc": "./test01.png", "prompt": ["2022年,全省房地产开发投资是多少?", "2022年,全省房地产开发投资比上年增长多少?", "住宅投资是多少?"]}]))
[2023-02-13 18:59:59,599] [    INFO] - We are using <class 'paddlenlp.transformers.ernie_layout.tokenizer.ErnieLayoutTokenizer'> to load 'ernie-layoutx-base-uncased'.
[2023-02-13 18:59:59,603] [    INFO] - Already cached /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/vocab.txt
[2023-02-13 18:59:59,605] [    INFO] - Already cached /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/sentencepiece.bpe.model
[2023-02-13 19:00:00,211] [    INFO] - tokenizer config file saved in /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/tokenizer_config.json
[2023-02-13 19:00:00,218] [    INFO] - Special tokens file saved in /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/special_tokens_map.json
[{'prompt': '2022年,全省房地产开发投资是多少?',
  'result': [{'end': 42, 'prob': 1.0, 'start': 39, 'value': '5515. 45'}]},
 {'prompt': '2022年,全省房地产开发投资比上年增长多少?',
  'result': [{'end': 45, 'prob': 0.54, 'start': 43, 'value': '-11.'}]},
 {'prompt': '住宅投资是多少?',
  'result': [{'end': 55, 'prob': 0.95, 'start': 53, 'value': '4112.37'}]}]

可以看到,对于上面这张表格,直接用ERNIE-Layout的预训练模型,抽取结果已经比较准确,说明ERNIE-Layout的预训练模型在解读表格方面已经训练得比较到位了。

2022年,全省房地产开发投资5515.45亿元,比上年下降11.0%。其中,住宅投资4112.37亿元,下降9.8%,占房地产开发投资的比重为74.6%。

于是,上面这句话就可以拼接成:

In [28]

result = docprompt([{
    "doc":
    "./test01.png",
    "prompt": [
        "2022年,全省房地产开发投资是多少?", 
        "2022年,全省房地产开发投资比上年增长多少?", 
        "住宅投资是多少?",
        "住宅投资同比增长(%)是多少?"
    ]
}])

In [30]

print("2022年,全省房地产开发投资" + result[0]['result'][0]['value'] + "亿元,比上年增长" +
      result[1]['result'][0]['value'].replace(" ", "") + "%。其中,住宅投资" +
      result[2]['result'][0]['value'].replace(" ", "") + "亿元,增长" +
      result[3]['result'][0]['value'].replace(" ", "") + "%,占房地产开发投资的比重为" + str(
          np.round(
              float(result[2]['result'][0]['value'].replace(" ", "")) /
              float(result[0]['result'][0]['value'].replace(" ", "")) *
              100, 1)) + "%。")
2022年,全省房地产开发投资5515. 45亿元,比上年增长-11.%。其中,住宅投资4112.37亿元,增长-9.8%,占房地产开发投资的比重为74.6%。

需要注意的是,尽管大部分时候能够正确识别到数字文本,但是OCR结果中总是会多出一些空格(特别是有小数点时),因此我们需要在后处理时将这些空格删除。

3 生成文档问答word报告

根据业务的需要,接下来我们得把自动读取表格的结果整理成一个word报告。具体方法当然是使用python-docx依赖库。

其实,想要直接用python-docx生成我们常用的中文报告,要趟过的坑也不少。总结起来,至少包括了:

  • 中文字体的使用
  • 中文字号的对应
  • 标题、图片居中的处理
  • 文字颜色的调整
  • 文档缩进的处理

其中,WORD中字号、磅值的对应大体如下:

  • 字号‘八号’对应磅值5
  • 字号‘七号’对应磅值5.5
  • 字号‘小六’对应磅值6.5
  • 字号‘六号’对应磅值7.5
  • 字号‘小五’对应磅值9
  • 字号‘五号’对应磅值10.5
  • 字号‘小四’对应磅值12
  • 字号‘四号’对应磅值14
  • 字号‘小三’对应磅值15
  • 字号‘三号’对应磅值16
  • 字号‘小二’对应磅值18
  • 字号‘二号’对应磅值22
  • 字号‘小一’对应磅值24
  • 字号‘一号’对应磅值26
  • 字号‘小初’对应磅值36
  • 字号‘初号’对应磅值42

我们常用的报告字号,一般是二号、三号字,我们在设置时一一对照即可。

In [97]

from docx import Document
from docx.shared import Inches
from docx.oxml.ns import qn
from docx.shared import RGBColor,Cm,Pt
from docx.enum.text import WD_ALIGN_PARAGRAPH,WD_PARAGRAPH_ALIGNMENT

document = Document()

# 输入标题
h = document.add_heading()
h.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = h.add_run('2022年福建省房地产开发和销售情况')
# 中文字体可以直接输入名字,只要自己本机上有装这个字体,下载的时候就能够识别
run.font.name = '方正小标宋简体'
run.font.element.rPr.rFonts.set(qn('w:eastAsia'), '方正小标宋简体')
run.font.color.rgb = RGBColor(0, 0, 0)
run.font.size = Pt(22)

h1 = document.add_heading(level=1)
# 注意报告需要添加缩进
run = h1.add_run('    一、房地产开发投资完成情况')
run.font.name = '黑体'
run.font.element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
run.font.color.rgb = RGBColor(0, 0, 0)
run.font.size = Pt(16)

p1 = document.add_paragraph()
p1.paragraph_format.space_before = Pt(16)
# 注意报告需要添加缩进
run = p1.add_run("        2022年,全省房地产开发投资" + result[0]['result'][0]['value'].replace(" ", "") + "亿元,比上年增长" +
      result[1]['result'][0]['value'].replace(" ", "") + "%。其中,住宅投资" +
      result[2]['result'][0]['value'].replace(" ", "") + "亿元,增长" +
      result[3]['result'][0]['value'].replace(" ", "") + "%,占房地产开发投资的比重为" + str(
          np.round(
              float(result[2]['result'][0]['value'].replace(" ", "")) /
              float(result[0]['result'][0]['value'].replace(" ", "")) *
              100, 1)) + "%。")
run.font.name = '仿宋_GB2312'
run.blod = False
run.font.element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
run.font.color.rgb = RGBColor(0, 0, 0)
run.font.size = Pt(16)

paragraph = document.add_paragraph()
# 通过段落处理完成图片居中设置
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER     
run = paragraph.add_run("")
run.add_picture('test01.png', width=Cm(10.24))

document.save('demo.docx')

我们可以把生成的word文件下载下来,效果如下:

相当智能有没有!现在不需要写SQL也能出一个报告了! 

4 应用部署

本项目的部署效果读者可以在【应用体验】中查看,相关代码保存在untitled.streamlit.py中。

由于这类文档内容场景定制性较强,读者如需要进行自定义的报表生成,可以参照项目写法,自行修改部署脚本。

猜你喜欢

转载自blog.csdn.net/m0_68036862/article/details/131483885