PaddleNLP搭配PaddleOCR提取图片关键信息

前言

通过上文PaddleOCR环境搭建并简单提取文字
已经可以实现从图片提取文字。
通过以下代码循环获取文本列表。

txts = [line[1][0] for line in result]

变量txts里面的值
接下去可以使用PaddleNLP进行关键信息抽取

PaddleNLP

PaddleNLP是一款简单易用且功能强大的自然语言处理开发库。聚合业界优质预训练模型并提供开箱即用的开发体验,覆盖NLP多场景的模型库搭配产业实践范例可满足开发者灵活定制的需求。
官方gitee仓库:https://gitee.com/monkeycc/PaddleNLP

安装PaddleNLP

打开Anaconda Prompt

安装paddlenlp

pip install paddlenlp -i https://pypi.tuna.tsinghua.edu.cn/simple

使用一键预测模型

这里我们引用PaddleNLP的一键预测功能无需训练,直接输入数据即可通过抽取结果。

from paddlenlp import Taskflow
# 获取信息抽取模型information_extraction
ie = Taskflow('information_extraction', schema=[])
txts = [line[1][0] for line in result]
# 合并文本
all_context = "\n".join(txts)
schema = ['甲方', '乙方', '工程名称','工程地点']
ie.set_schema(schema)
# nlp模型推理
nlp_result = ie(all_context)
print(nlp_result)

输出:

[{
‘甲方’: [{‘text’: ‘叶县环境保护局’, ‘start’: 7, ‘end’: 14, ‘probability’:
0.9188739300160371}],
‘乙方’: [{‘text’: ‘叶县建昆重政工程有限公司’, ‘start’: 18, ‘end’: 30, ‘probability’: 0.8437942288489282}],
‘工程名称’: [{‘text’:‘叶县环境空气质量自动监测站建设工程’, ‘start’: 144, ‘end’: 161, ‘probability’:
0.8328638234375312}],
‘工程地点’: [{‘text’: ‘叶县’, ‘start’: 7, ‘end’: 9, ‘probability’: 0.8829175051535643}]
}]

分析结果得出数据结构为[{}]的形式嵌套,即列表里嵌套字典。
使用下列代码格式化结果:

for key in schema:
    value = nlp_result[0][key][0]['text']
    print(key+':'+value)

输出:

甲方:叶县环境保护局
乙方:叶县建昆重政工程有限公司
工程名称:叶县环境空气质量自动监测站建设工程
工程地点:叶县

完整代码:

from paddleocr import PaddleOCR, draw_ocr
from PIL import Image

# paddleocr目前支持中英文、英文、法语、德语、韩语、日语等80个语种,可以通过修改lang参数进行切换
ocr = PaddleOCR(use_angle_cls=False, lang="ch")  # need to run only once to download and load model into memory
img_path = "./test_img/hetong2.jpg"
result = ocr.ocr(img_path, cls=False)
# 引用nlp
from paddlenlp import Taskflow
# 获取信息抽取模型information_extraction
ie = Taskflow('information_extraction', schema=[])
txts = [line[1][0] for line in result]
print(txts)
# 合并文本
all_context = "\n".join(txts)
schema = ['甲方', '乙方', '工程名称','工程地点']
ie.set_schema(schema)
# nlp模型推理
nlp_result = ie(all_context)
print(nlp_result)
result = []
# 格式化预测结果
for key in schema:
    value = nlp_result[0][key][0]['text']
    print(key+':'+value)

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,作为语言模型,我无法提供窗口程序编写方面的支持。不过我可以给你提供一些基于PaddleNLP的taskflow实现的代码来提取PDF文档信息,供你参考。 ```python import paddle import paddle.nn as nn from paddle.static import InputSpec from paddlenlp.datasets import load_dataset from paddlenlp.data import Stack, Tuple, Pad from paddlenlp.transformers import BertModel, BertForTokenClassification from paddlenlp.metrics import ChunkEvaluator from paddlenlp.utils.log import logger from paddle.io import DataLoader from typing import List, Tuple import os import fitz import re import tkinter as tk from tkinter import filedialog paddle.set_device('cpu') class PDFReader: def __init__(self): self.model = None self.label_map = { 0: 'O', 1: 'B-NAME', 2: 'I-NAME', 3: 'B-ADDRESS', 4: 'I-ADDRESS', 5: 'B-PHONE', 6: 'I-PHONE', 7: 'B-EMAIL', 8: 'I-EMAIL', 9: 'B-ORGANIZATION', 10: 'I-ORGANIZATION' } self.rev_label_map = {v: k for k, v in self.label_map.items()} def load_model(self, model_path: str): self.model = BertForTokenClassification.from_pretrained( model_path, num_classes=len(self.label_map), dropout=None) def extract_info(self, pdf_path: str) -> List[Tuple[str, str]]: assert self.model is not None, "Please load model first" doc = fitz.open(pdf_path) info_list = [] for page in doc: text = page.get_text() text = re.sub('\s+', ' ', text) tokens = [] for char in text: tokens.append(char) labels = self.predict(tokens) entities = self.extract_entities(tokens, labels) info_list.extend(entities) return info_list def predict(self, tokens: List[str]) -> List[int]: self.model.eval() encoded_inputs = self.model.tokenizer( tokens, return_length=True, is_split_into_words=True) input_ids = paddle.to_tensor(encoded_inputs['input_ids']) token_type_ids = paddle.to_tensor(encoded_inputs['token_type_ids']) seq_len = paddle.to_tensor(encoded_inputs['seq_len']) logits = self.model(input_ids, token_type_ids, seq_len) preds = paddle.argmax(logits, axis=-1) return preds.numpy().tolist()[0] def extract_entities(self, tokens: List[str], labels: List[int]) -> List[Tuple[str, str]]: entities = [] entity_type = None entity_value = "" for i, label in enumerate(labels): if label == self.rev_label_map['O']: if entity_type is not None and entity_value != "": entities.append((entity_type, entity_value)) entity_type = None entity_value = "" else: if entity_type is None: entity_type = self.label_map[label].split('-')[1] entity_value += tokens[i] else: if self.label_map[label].split('-')[1] == entity_type: entity_value += tokens[i] else: entities.append((entity_type, entity_value)) entity_type = self.label_map[label].split('-')[1] entity_value = tokens[i] if entity_type is not None and entity_value != "": entities.append((entity_type, entity_value)) return entities class PDFReaderWindow: def __init__(self): self.reader = PDFReader() self.reader.load_model("path/to/model") self.window = tk.Tk() self.window.title("PDF Reader") self.window.geometry("400x400") self.pdf_path_label = tk.Label(self.window, text="PDF Path:") self.pdf_path_label.pack() self.pdf_path_entry = tk.Entry(self.window, width=50) self.pdf_path_entry.pack() self.choose_pdf_button = tk.Button( self.window, text="Choose PDF", command=self.choose_pdf) self.choose_pdf_button.pack() self.extract_info_button = tk.Button( self.window, text="Extract Info", command=self.extract_info) self.extract_info_button.pack() self.info_text = tk.Text(self.window, height=20) self.info_text.pack() def choose_pdf(self): pdf_path = filedialog.askopenfilename( title="Choose PDF", filetypes=(("PDF Files", "*.pdf"),)) self.pdf_path_entry.delete(0, tk.END) self.pdf_path_entry.insert(0, pdf_path) def extract_info(self): pdf_path = self.pdf_path_entry.get() info_list = self.reader.extract_info(pdf_path) self.info_text.delete('1.0', tk.END) for info in info_list: self.info_text.insert(tk.END, f"{info[0]}: {info[1]}\n") def run(self): self.window.mainloop() if __name__ == '__main__': window = PDFReaderWindow() window.run() ``` 这个程序实现了一个简单的窗口应用程序,用户可以选择一个PDF文件,并点击按钮提取其中的信息。程序使用了PaddleNLP中的一个预训练模型来做实体识别。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值