一、需求

现在有很多个电子发票PDF文件, 使用自动化工具帮我们批量自动从发票PDF提取出格式化信息。如从发票

提取出 DICT_DATA

DICT_DATA = {
    "开票日期": "2023年01月06日",
    "应税货物(或服务)名称": "*信息技术服务*技术服务费",
    "价税合计(大写)": "",
    "税率": "6%",
    "备注": "230106163474406331"
}

二、准备工作

2.1 安装ollama

点击前往网站 https://ollama.com/ ,下载ollama软件,支持win、Mac、linux

2.2 下载LLM

ollama软件目前支持多种大模型, 如阿里的(qwen、qwen2)、meta的(llama3),

以llama3为例,根据自己电脑显存性能, 选择适宜的版本。如果不知道选什么,那就试着安装,不合适不能用再删除即可。

打开电脑命令行cmd(mac是terminal), 网络是连网状态,执行模型下载(安装)命令

ollama run llama3

等待 llama3:8b 下载完成。

2.3 安装python包

在python中调用ollama服务,需要ollama包。

打开电脑命令行cmd(mac是terminal), 网络是连网状态,执行安装命令

pip3 install ollama

2.4 启动ollama服务

在Python中调用本地ollama服务,需要先启动本地ollama服务, 打开电脑命令行cmd(mac是terminal), 执行

ollama serve

三、实验

3.1 读取pdf

图片

import cntext as ct


text = ct.read_pdf('data/1.pdf')
print(ct.__version__)
text

3.2 提取信息

使用ollama服务中的大模型 llama3:8b , 需要大模型提示信息及数据。这是我实验里设计的提示信息prompt

提取TEXT中的关键信息,返回DICT_DATA, DICT_DATA为dict数据格式,所含关键词依次为”开票日期”, “应税货物(或服务)名称”, “价税合计(大写)”, “税率”, “备注”; 结果只显示DICT_DATA。TEXT: {text}

import ollama

response = ollama.chat(model='llama3:8b', messages=[
      {
        'role': 'user',
        'content': f'提取TEXT中的关键信息,返回DICT_DATA, DICT_DATA为dict数据格式,所含关键词依次为"开票日期", "应税货物(或服务)名称", "价税合计(大写)", "税率", "备注"; 结果只显示DICT_DATA。TEXT: {text1}',
      },
    ])

result = response['message']['content']
result

从运行结果看出, 大模型从发票PDF中准确提取到我们需要的信息,耗时大概10s。需要注意,有时候大模型还会返回

'Here is the extracted key information in dictionary format:\n\n```\n{\n    "开票日期": "2023年01月06日",\n      "应税货物(或服务)名称": "*信息技术服务*技术服务费",\n    "价税合计(大写)": "贰佰陆拾叁元整",\n    "税率": "6%",\n    "备注": "230106163474406331"\n}\n```\n\nLet me know if you have any further requests! 😊'

现在我们需要将 DICT_DATA 变为真正的字典数据

import re

result = response['message']['content']
result = [r for r in re.split('```|DICT_DATA = ', result) if '{' in r][0]

print(type(eval(result)))
print(eval(result))

3.3 封装成函数extract_info

实验成功,我们将其封装为函数extract_info

import ollama
import re

def extract_info(text):
    response = ollama.chat(model='llama3:8b', stream=False,  messages=[
          {
            'role': 'user',
            'content': f'提取TEXT中的关键信息,返回DICT_DATA, DICT_DATA为dict数据格式,所含关键词依次为"开票日期", "应税货物(或服务)名称", "价税合计(大写)", "税率", "备注"; 结果只显示DICT_DATA。TEXT: {text}',
          },
        ])

    result = response['message']['content']
    result = [r for r in re.split('```|DICT_DATA = ', result) if '{' in r][0]
    return eval(result)



result = extract_info(text)
result

3.4 批量提取

假设data文件夹内有成百上千的发票(实际上只有一张发票), 对data文件夹进行批量信息提取,结果存储为csv。

%%time

import os
#cntext版本为2.1.2,非开源,
#需联系大邓372335839获取
import cntext as ct
import pandas as pd

#当前代码所在的代码文件与data文件夹处于同一个文件夹内
#获取data内所有pdf的路径
pdf_files = [f'data/{file}' for file in os.listdir('data') if '.pdf' in file]

dict_datas = []
for pdf_file in pdf_files:
    pdf_text = ct.read_pdf(pdf_file)
    dict_data = extract_info(pdf_text)
    dict_datas.append(dict_data)

df = pd.DataFrame(dict_datas)
df

https://mp.weixin.qq.com/s/QSsDpfyJmGRR6IVdlvWdwg

作者:Jeebiz  创建时间:2024-07-09 12:37
最后编辑:Jeebiz  更新时间:2024-08-29 20:41