乐趣区

关于自然语言处理:基于ERNIELayoutPDFplumberUIEX的多方案学术论文信息抽取2022总结-2023展望新年第一篇文章

本文参加了 SegmentFault 思否年度征文「一名技术人的 2022」,欢送正在浏览的你也退出。

本我的项目链接:https://aistudio.baidu.com/aistudio/projectdetail/5196032?contributionType=1
基于 ERNIELayout&pdfplumber-UIE 的多计划学术论文信息抽取,小样本能力强悍,OCR、版面剖析、信息抽取一应俱全。

0. 问题形容

能够参考 issue:ERNIE-Layout 在(人名和邮箱)信息抽取的诸多问题论述 #4031

  1. ERNIE-Layout 因为看到性能比拟弱小就尝试了一下,但遇到信息抽取谬误,以及抽取不全等问题
  2. 应用 PDFPlumber 库和 PaddleNLP UIE 模型抽取,遇到问题:无奈把姓名和邮箱一一对应。

1. 基于 ERNIE-Layout 的 DocPrompt 凋谢文档抽取问答模型

ERNIE-Layout 以文心文本大模型 ERNIE 为底座,交融文本、图像、布局等信息进行跨模态联结建模,创新性引入布局常识加强,提出浏览程序预测、细粒度图文匹配等自监督预训练任务,降级空间解偶注意力机制,在各数据集上成果获得大幅度晋升,相干工作 ERNIE-Layout: Layout-Knowledge Enhanced Multi-modal Pre-training for Document Understanding 已被 EMNLP 2022 Findings 会议收录[1]。思考到文档智能在多语种上商用宽泛,依靠 PaddleNLP 对外开源业界最强的多语言跨模态文档预训练模型 ERNIE-Layout。

反对:

  • 发票抽取问答
  • 海报抽取
  • 网页抽取
  • 表格抽取
  • 长文档抽取
  • 多语言票据抽取
  • 同时提供 pipelines 流水线搭建

更多参考官网,这里就不开展了

ERNIE-Layout GitHub 地址:https://github.com/PaddlePadd…

Hugging Face 网页版:https://huggingface.co/spaces…

# 环境装置
!pip install --upgrade opencv-python
!pip install --upgrade paddlenlp
!pip install --upgrade paddleocr --user
#如果装置失败多试几次 个别都是网络问题
!pip install xlwt

# 反对单条、批量预测
from paddlenlp import Taskflow
docprompt_en= Taskflow("document_intelligence",lang="en",topn=10)
docprompt_en({"doc": "./image/paper_1.jpg", "prompt": ["人名和邮箱"]})

# batch_size:批处理大小,请联合机器状况进行调整,默认为 1。# lang:抉择 PaddleOCR 的语言,ch 可在中英混合的图片中应用,en 在英文图片上的成果更好,默认为 ch。# topn: 如果模型辨认出多个后果,将返回前 n 个概率值最高的后果,默认为 1。
[{'prompt': '人名和邮箱',
  'result': [{'value': 'momtaziaa921@mums.ac.irabbasmomtazi@yahoo.com',
    'prob': 1.0,
    'start': 69,
    'end': 79},
   {'value': 'banafshch.nikfar@gmail.com',
    'prob': 0.98,
    'start': 153,
    'end': 159}]}]

能够看到成果不好,多个实体不能一起抽取,须要构建成单个问答,比方姓名和邮箱离开抽取,尝试结构正当的开放式 prompt。

小技巧

  • Prompt 设计 :在 DocPrompt 中,Prompt 能够是陈述句(例如,文档键值对中的 Key),也能够是疑问句。因为是凋谢域的抽取问答,DocPrompt 对 Prompt 的设计 没有非凡限度,只有合乎自然语言语义即可 。如果对以后的抽取后果不称心, 能够多尝试一些不同的 Prompt
  • 反对的语言 :反对本地门路或者 HTTP 链接的 中英文图片 输出,Prompt 反对多种不同语言,参考以上不同场景的例子。
docprompt_en({"doc": "./image/paper_1.jpg", "prompt": ["人名是什么","邮箱是多少",]})
#无奈列举全副姓名

[{'prompt': '人名是什么',
  'result': [{'value': 'AA.Momtazi-Borojeni',
    'prob': 0.74,
    'start': 0,
    'end': 4}]},
 {'prompt': '邮箱是多少',
  'result': [{'value': 'momtaziaa921@mums.ac.irabbasmomtazi@yahoo.com',
    'prob': 1.0,
    'start': 69,
    'end': 79}]}]

[{'prompt': '人名是什么',
  'result': [{'value': 'AA.Momtazi-Borojeni',
    'prob': 0.74,
    'start': 0,
    'end': 4}]},
 {'prompt': '邮箱是多少',
  'result': [{'value': 'momtaziaa921@mums.ac.irabbasmomtazi@yahoo.com',
    'prob': 1.0,
    'start': 69,
    'end': 79}]}]

[{'prompt': '人名',
  'result': [{'value': 'J.Mosafer', 'prob': 0.95, 'start': 80, 'end': 82},
   {'value': 'B.Nikfar', 'prob': 0.94, 'start': 111, 'end': 113},
   {'value': 'AVaezi', 'prob': 0.94, 'start': 225, 'end': 225},
   {'value': 'AA.Momtazi-Borojeni', 'prob': 0.88, 'start': 0, 'end': 4}]},
 {'prompt': 'email',
  'result': [{'value': 'momtaziaa921@mums.ac.irabbasmomtazi@yahoo.com',
    'prob': 1.0,
    'start': 69,
    'end': 79},
   {'value': 'banafshch.nikfar@gmail.com',
    'prob': 0.98,
    'start': 153,
    'end': 159}]}]

docprompt_en({"doc": "./image/paper_1.jpg", "prompt": ["人名","邮箱","姓名","名字","email"]})
[{'prompt': '人名',
  'result': [{'value': 'J.Mosafer', 'prob': 0.95, 'start': 80, 'end': 82},
   {'value': 'B.Nikfar', 'prob': 0.94, 'start': 111, 'end': 113},
   {'value': 'AVaezi', 'prob': 0.94, 'start': 225, 'end': 225},
   {'value': 'AA.Momtazi-Borojeni', 'prob': 0.88, 'start': 0, 'end': 4}]},
 {'prompt': '邮箱',
  'result': [{'value': 'momtaziaa921@mums.ac.irabbasmomtazi@yahoo.com',
    'prob': 1.0,
    'start': 69,
    'end': 79},
   {'value': 'banafshch.nikfar@gmail.com',
    'prob': 0.87,
    'start': 153,
    'end': 159}]},
 {'prompt': '姓名',
  'result': [{'value': 'AA.Momtazi-Borojeni',
    'prob': 0.76,
    'start': 0,
    'end': 4}]},
 {'prompt': '名字',
  'result': [{'value': 'AA.', 'prob': 0.7, 'start': 0, 'end': 1}]},
 {'prompt': 'email',
  'result': [{'value': 'momtaziaa921@mums.ac.irabbasmomtazi@yahoo.com',
    'prob': 1.0,
    'start': 69,
    'end': 79},
   {'value': 'banafshch.nikfar@gmail.com',
    'prob': 0.98,
    'start': 153,
    'end': 159}]}]

能够看出失去的成果不是很好,比拟玄学,起因应该就是 ocr 辨认对应姓名人名准确率绝对不高,无奈全副命中;并且无奈一一对应。

这块倡议看看 paddleocr 具体实现步骤,钻研一下在看看怎么解决。

上面讲第二种办法

2. 基于 PDFplumber-UIE 信息抽取

2.1 PDF 文档解析(pdfplumber 库)

装置 PDFPlumber
!pip install pdfplumber –user

官网链接:https://github.com/jsvine/pdfplumber

pdf 的文本和表格解决用多种形式能够实现,本文介绍 pdfplumber 对文本和表格提取。这个库在 GitHub 上 stars:3.3K 多,应用起来很不便,成果也很好,能够满足对 pdf 中信息的提取需要。

pdfplumber.pdf 中蕴含了.metadata 和.pages 两个属性。

  • metadata 是一个蕴含 pdf 信息的字典。
  • pages 是一个蕴含 pdfplumber.Page 实例的列表,每一个实例代表 pdf 每一页的信息。

每个 pdfplumber.Page 类:pdfplumber 外围性能,对 PDF 的大部分操作都是基于这个类,类中蕴含了几个次要的属性:文本、表格、尺寸等

  • page_number 页码
  • width 页面宽度
  • height 页面高度
  • objects/.chars/.lines/.rects 这些属性中每一个都是一个列表,每个列表都蕴含一个字典,每个字典用于阐明页面中的对象信息,包含直线,字符,方格等地位信息。

一些罕用的办法

  • extract_text() 用来提页面中的文本,将页面的所有字符对象整顿为的那个字符串
  • extract_words() 返回的是所有的单词及其相干信息
  • extract_tables() 提取页面的表格

2.1.1 pdfplumber 简略应用

# 利用 metadata 能够取得 PDF 的根本信息,作者,日期,起源等根本信息。import pdfplumber
import pandas as pd

with pdfplumber.open("/home/aistudio/work/input/test_paper.pdf") as pdf:
    print(pdf.metadata)
    # print("总页数:"+str(len(pdf.pages))) #总页数
    print("pdf 文档总页数:", len(pdf.pages))
# 读取第一页的宽度,页低等信息
    # 第一页 pdfplumber.Page 实例
    first_page = pdf.pages[0]
    # 查看页码
    print('页码:', first_page.page_number)

    # 查看页宽
    print('页宽:', first_page.width)

    # 查看页高
    print('页高:', first_page.height)

{'CreationDate': "D:20180428190534+05'30'",'Creator':'Arbortext Advanced Print Publisher 9.0.223/W Unicode','ModDate':"D:20180428190653+05'30'", 'Producer': 'Acrobat Distiller 9.4.5 (Windows)', 'Title': '0003617532 1..23 ++', 'rgid': 'PB:324947211_AS:677565220007936@1538555545045'}
pdf 文档总页数: 24
页码:1
页宽:594.95996
页高:840.95996
# 导入 PDFPlumber
import pdfplumber
#打印第一页信息
with pdfplumber.open("/home/aistudio/work/input/test_paper.pdf") as pdf:
    first_page = pdf.pages[0]
    textdata=first_page.extract_text()
print(textdata)

#打印全副页面
import pdfplumber as ppl
pdf_path = "/home/aistudio/work/input/test_paper.pdf"
pdf = ppl.open(pdf_path)
# 取得 PDFPlumber 的对象,上面查看 pdf 全部内容
for page in pdf.pages:
    print(page.extract_text())

!pip install xlwt

# 读取表格第一页
import pdfplumber
import xlwt

# 加载 pdf
path = "/home/aistudio/Scan-1.pdf"
with pdfplumber.open(path) as pdf:
    page_1 = pdf.pages[0]  # pdf 第一页
    table_1 = page_1.extract_table()  # 读取表格数据
    print(table_1)
    # 1. 创立 Excel 对象
    workbook = xlwt.Workbook(encoding='utf8')
    # 2. 新建 sheet 表
    worksheet = workbook.add_sheet('Sheet1')
    # 3. 自定义列名
    clo1 = table_1[0]
    # 4. 将列表元组 clo1 写入 sheet 表单中的第一行
    for i in range(0, len(clo1)):
        worksheet.write(0, i, clo1[i])
    # 5. 将数据写进 sheet 表单中
    for i in range(0, len(table_1[1:])):
        data = table_1[1:][i]
        for j in range(0, len(clo1)):
            worksheet.write(i + 1, j, data[j])
    # 保留 Excel 文件分两种
    workbook.save('/home/aistudio/work/input/test_excel.xls')
# 读取表格全页
import pdfplumber
from openpyxl import Workbook

class PDF(object):
    def __init__(self, file_path):
        self.pdf_path = file_path
        # 读取 pdf 文件
        try:
            self.pdf_info = pdfplumber.open(self.pdf_path)
            print('读取文件实现!')
        except Exception as e:
            print('读取文件失败:', e)

    # 打印 pdf 的根本信息、返回字典,作者、创立工夫、批改工夫 / 总页数
    def get_pdf(self):
        pdf_info = self.pdf_info.metadata
        pdf_page = len(self.pdf_info.pages)
        print('pdf 共 %s 页' % pdf_page)
        print("pdf 文件根本信息:\n", pdf_info)
        self.close_pdf()

    # 提取表格数据, 并保留到 excel 中
    def get_table(self):
        wb = Workbook()  # 实例化一个工作簿对象
        ws = wb.active  # 获取第一个 sheet
        con = 0
        try:
            # 获取每一页的表格中的文字,返回 table、row、cell 格局:[[[row1],[row2]]]
            for page in self.pdf_info.pages:
                for table in page.extract_tables():
                    for row in table:
                        # 对每个单元格的字符进行简略荡涤解决
                        row_list = [cell.replace('\n', '') if cell else'' for cell in row]
                        ws.append(row_list)  # 写入数据
                con += 1
                print('--------------- 分割线, 第 %s 页 ---------------' % con)
        except Exception as e:
            print('报错:', e)
        finally:
            wb.save('\\'.join(self.pdf_path.split('\\')[:-1]) + '\pdf_excel.xlsx')
            print('写入实现!')
            self.close_pdf()

    # 敞开文件
    def close_pdf(self):
        self.pdf_info.close()

if __name__ == "__main__":
    file_path = "/home/aistudio/Scan-1.pdf"
    pdf_info = PDF(file_path)
    # pdf_info.get_pdf() # 打印 pdf 根底信息
    # 提取 pdf 表格数据并保留到 excel 中, 文件保留到跟 pdf 同一文件门路下
    pdf_info.get_table()

更多功能(表格读取,图片提取,可视化界面)能够参考官网或者上面链接:

https://blog.csdn.net/fuhanghang/article/details/122579548

2.1.2 学术论文特定页面文本提取

发表论文作者信息通常放在论文首页的脚末行或参考文献的前面,依据这种状况咱们能够进行分类(只有获取作者的邮箱信息即可):

  • 第一种国外论文:首页含作者相干信息 or 首页是封面第二页才是作者信息【获取前 n 页即可,举荐是 2 页】
  • 第二种国内论文:首页含作者信息(邮箱等)在参考文献之后会有各个做的详细信息,比方是职位,钻研畛域,科研成果介绍等等【获取前 n 页和尾页,举荐是 2 页 + 尾页】

这样做的益处在于两个方面:

  1. 节约了存储空间和数据处理工夫
  2. 节约资源耗费,在模型预测时候输出文本数量显著缩小,在数据面上减速推理

针对 1 简略论述:PDF 原始大小 614.1KB

解决形式 pdf 转文字时延 存储占用空间
保留指定前 n 页面文字 242ms 2.8KB
保留指定前 n 页面文字和尾页 328ms 5.3KB
保留全文 2.704s 64.1KB

针对二:以下 6 中计划提速不过多赘述,能够参考上面我的项目

  • 模型抉择 uie-mini 等小模型预测,损失肯定精度晋升预测效率
  • UIE 实现了 FastTokenizer 进行文本预处理减速
  • fp16 半精度推理速度更快
  • UIE INT8 精度推理
  • UIE Slim 数据蒸馏
  • SimpleServing 反对反对多卡负载平衡预测

UIE Slim 满足工业利用场景,解决推理部署耗时问题,晋升效力!:https://aistudio.baidu.com/aistudio/projectdetail/4516470?contributionType=1

之后有工夫从新把 paddlenlp 技术路线整顿一下

# 第一种写法:保留指定前 n 页面文字
with pdfplumber.open("/home/aistudio/work/input/test_paper.pdf") as p:
    for i in range(3):
        page = p.pages[i]
        textdata = page.extract_text()
        # print(textdata)
        data = open('/home/aistudio/work/input/text.txt',"a") #a 示意指定写入模式为追加写入
        data.write(textdata)
#这里打印出 n 页文字,因为是追加保留内容是 n - 1 页

#第一种写法:保留指定前 n 页面文字
with pdfplumber.open("/home/aistudio/work/input/test_paper.pdf") as p:
    for i in range(3):
        page = p.pages[i]
        textdata = page.extract_text()
        # print(textdata)
        data = open('/home/aistudio/work/input/text.txt',"a") #a 示意指定写入模式为追加写入
        data.write(textdata)
#这里打印出 n 页文字,因为是追加保留内容是 n - 1 页

#保留指定前 n 页面文字和尾页
pdf_path = "/home/aistudio/work/input/test_paper.pdf"
pdf = ppl.open(pdf_path)
texts = []

# 按页关上,合并所有内容,保留前 2 页
for i in range(2):
    text = pdf.pages[i].extract_text()
    texts.append(text)
#保留最初一页,index 从 0 开始
end_num=len(pdf.pages)
text_end=pdf.pages[end_num-1].extract_text()
texts.append(text_end)
txt_string = ''.join(texts)

# 保留为和原 PDF 同名的 txt 文件
txt_path = pdf_path.split('.')[0]+"_end" + '.txt'
with open(txt_path, "w", encoding='utf-8') as f:
    f.write(txt_string)
    f.close()

#保留全副文章:pdf_path = "/home/aistudio/work/input/test_paper.pdf"
pdf = ppl.open(pdf_path)
texts = []

# 按页关上,合并所有内容,对于多页或一页 PDF 都能够应用
for page in pdf.pages:
    text = page.extract_text()
    texts.append(text)
txt_string = ''.join(texts)

# 保留为和原 PDF 同名的 txt 文件
txt_path = pdf_path.split('.')[0] +"_all"+'.txt'
with open(txt_path, "w", encoding='utf-8') as f:
    f.write(txt_string)
    f.close()

#从 txt 中读取文本,作为信息抽取的输出。对于比拟长的文本,可能须要人工的设定一些宰割关键词,分段输出以晋升抽取的成果。txt_path="/home/aistudio/work/input/test_paper2.txt"
with open(txt_path, 'r') as f:
    file_data = f.readlines()
record = ''
for data in file_data:
    record += data
print(record)

2.2 UIE 信息抽取(论文作者和邮箱)

2.2.1 零样本抽取

from pprint import pprint
import json
from paddlenlp import Taskflow

def openreadtxt(file_name):
    data = []
    file = open(file_name,'r',encoding='UTF-8')  #关上文件
    file_data = file.readlines() #读取所有行
    for row in file_data:
        data.append(row) #将每行数据插入 data 中     
    return data

data_input=openreadtxt('/home/aistudio/work/input/test_paper2.txt')

schema = ['人名', 'email']
few_ie = Taskflow('information_extraction', schema=schema, batch_size=16)

results=few_ie(data_input)
print(results)

with open("./output/reslut_2.txt", "w+",encoding='UTF-8') as f:    #a :   写入文件,若文件不存在则会先创立再写入,但不会笼罩原文件,而是追加在文件开端
    for result in results:
        line = json.dumps(result, ensure_ascii=False)  #对中文默认应用的 ascii 编码. 想输入真正的中文须要指定 ensure_ascii=False
        f.write(line + "\n")

print("数据后果已导出")

2.3 长文本的答案获取

UIE 对于词和句子的抽取成果比拟好,然而对应大段的文字后果,还是须要传统的正则形式作为配合,在本次应用的 pdf 中,还须要取得法院具体的裁决后果,应用正则表达式可灵便匹配想要的后果。

start_word = '如下'
end_word = '特此布告'

start = re.search(start_word, record)
end = re.search(end_word, record)
print(record[start.span()[1]:end.span()[0]]):海口中院认为:新达公司的住所地在海口市国贸小道 48
号新达商务大厦,该司是由海南省工商行政管理局核准注销
的企业,故海口中院对本案有管辖权。因新达公司不能清偿
到期债权,故深物业股份公司提出对新达公司进行破产清理
  1  
的申请合乎受理条件。按照《中华人民共和国企业破产法》第二条第一款、第三条、第七条第二款之规定,裁定如下:受理申请人深圳市物业倒退(团体)股份有限公司对被
申请人海南新达开发总公司破产清理的申请。本裁定自即日起失效。二、其余状况 
本公司已对海南公司账务进行了全额计提,破产清理对
本公司财务状况无影响。具体情况请查阅本公司 2011 年 11 月 28 日公布的《董事会
决定布告》。

2.4 正则晋升成果

对于长文本,能够依据关键词进行宰割后抽取,然而对于多个实体,比方这篇布告中,通过的多个议案,就无奈应用 UIE 抽取。

# 导入正则表达式相干库
import re 
schema = ['通过议案']
start_word = '通过以下议案'
start = re.search(start_word, record)
input_data = record[start.span()[0]:]
print(input_data)
ie = Taskflow('information_extraction', schema=schema)
pprint(ie(input_data))

# 正则匹配“一 二 三 四 五 六 七 八 九 十”print(re.findall(r"[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341]、.*\n", input_data))

['一、2021 年第三季度报告 \n', '二、对于批准全资子公司收买担保公司 60% 股权的议案 详见公司于 2021 年 10 月 29 日登载在《证券时报》、《中国证券 \n', '三、对于批准控股子公司广西新柳邕公司为认购广西新柳邕项 \n', '四、对于续聘会计师事务所的议案 \n', '五、对于向银行申请综合授信额度的议案 \n', '一、向中国民生银行股份有限公司深圳分行申请不超过人民币 5\n', '二、向招商银行股份有限公司深圳分行申请不超过人民币 6 亿 \n', '六、经理层《岗位聘任协定》\n', '七、经理层《年度经营业绩责任书》\n', '八、经理层《任期经营业绩责任书》\n', '九、对于暂不召开股东大会的议案 \n']
# 3. 基于基于 UIE- X 的信息提取

## 3.1 跨模态文档信息抽取

跨模态文档信息抽取能力 UIE-X 来了。信息抽取简略说就是利用计算机从自然语言文本中提取出外围信息,是自然语言解决畛域的一项要害工作,包含命名实体辨认(也称实体抽取)、关系抽取、事件抽取等。传统信息抽取计划基于序列标注,须要大量标注语料能力取得较好的成果。2022 年 5 月飞桨 PaddleNLP 推出的 UIE,是业界首个开源的面向通用信息抽取的产业级技术计划,基于 Prompt 思维,零样本和小样本能力弱小,曾经成为业界信息抽取工作上的首选计划。除了纯文本内容外,企业中还存在大量须要从跨模态文档中抽取信息并进行解决的业务场景,例如从合同、收据、报销单、病历等不同类型的文档中抽取所需字段,进行录入、比对、审核校准等操作。为了满足各行业的跨模态文档信息抽取需要,PaddleNLP 基于文心 ERNIE-Layout[1]跨模态布局加强预训练模型,集成 PaddleOCR 的 PP-OCR、PP-Structure 版面剖析等当先能力,基于大量信息抽取标注集,训练并开源了 UIE-X–––首个兼具文本及文档抽取能力、多语言、凋谢域的信息抽取模型。* 反对实体抽取、关系抽取、跨工作抽取
* 反对跨语言抽取
* 集成 PP-OCR,可灵便定制 OCR 后果
* 应用 PP-Structure 版面剖析性能
* 减少渲染模块,OCR 和信息抽取后果可视化

我的项目链接:[https://aistudio.baidu.com/aistudio/projectdetail/5017442](https://aistudio.baidu.com/aistudio/projectdetail/5017442)

## 3.2 产业实际分享:基于 UIE- X 的医疗文档信息提取

PaddleNLP 全新公布 UIE-X 🧾,除已有纯文本抽取的全副性能外,新增文档抽取能力。UIE- X 连续 UIE 的思路,基于跨模态布局加强预训练模型文心 ERNIE-Layout 重训模型,交融文本、图像、布局等信息进行联结建模,可能深度了解多模态文档。基于 Prompt 思维,实现凋谢域信息抽取,反对零样本抽取,小样本能力当先。官网链接:https://github.com/PaddlePaddle/PaddleNLP/tree/develop/applications/information_extraction

本案例为 UIE- X 在医疗畛域的实战,通过大量标注 + 模型微调即可具备定制场景的端到端文档信息提取

目前医疗畛域有大量的医学查看报告单,病历,发票,CT 影像,眼科等等的医疗图片数据。现阶段,针对这些图片都是靠人工分类,结构化录入零碎中,做患者的全生命周期的治理。耗时耗力,人工成本极大。如果能靠人工智能的技术做到图片的主动分类和结构化,将大大的降低成本,进步零碎录入的整体效率。我的项目链接:[https://aistudio.baidu.com/aistudio/projectdetail/5261592](https://aistudio.baidu.com/aistudio/projectdetail/5261592)

4. 总结

本我的项目提供了基于 ERNIELayout&PDFplumber-UIEX 多计划学术论文信息抽取,有趣味同学能够钻研一下 UIE-X。

UIE- X 连续 UIE 的思路,基于跨模态布局加强预训练模型文心 ERNIE-Layout 重训模型,交融文本、图像、布局等信息进行联结建模,可能深度了解多模态文档。基于 Prompt 思维,实现凋谢域信息抽取,反对零样本抽取,小样本能力当先.

退出移动版