LLM应用构建前的非结构化数据处理(三)文档表格的提取

1.学习内容

本节次学习内容来自于吴恩达老师的Preprocessing Unstructured Data for LLM Applications课程,因涉及到非结构化数据的相关处理,遂做学习整理。
本节主要学习pdf中的表格数据处理

2.环境准备

和之前一样,可以参考LLM应用构建前的非结构化数据处理(一)标准化处理认识数据
,其中配置信息保持一致

同样的,需要unstructured.io上获取APIkey。

3.开始尝试

3.1导入环境

# Warning control
import warnings
warnings.filterwarnings('ignore')

from unstructured_client import UnstructuredClient
from unstructured_client.models import shared
from unstructured_client.models.errors import SDKError

from unstructured.staging.base import dict_to_elements
# 初始化API
s = UnstructuredClient(
    api_key_auth="XXX",
    server_url="https://api.unstrXXX",
)

3.2样例浏览

from IPython.display import Image
Image(filename="images/embedded-images-tables.jpg", height=600, width=600) 

输出如下:
在这里插入图片描述

3.3处理pdf文档

filename = "example_files/embedded-images-tables.pdf"

with open(filename, "rb") as f:
    files=shared.Files(
        content=f.read(),
        file_name=filename,
    )

req = shared.PartitionParameters(
    files=files,
    strategy="hi_res",
    hi_res_model_name="yolox",
    skip_infer_table_types=[],
    pdf_infer_table_structure=True,
)

try:
    resp = s.general.partition(req)
    elements = dict_to_elements(resp.elements)
except SDKError as e:
    print(e)
# 找到处理数据中的Table元素的unstructured对象数据
tables = [el for el in elements if el.category == "Table"]
tables[0].text

输出如下:

'Inhibitor Polarization Corrosion be (V/dec) ba (V/dec) Ecorr (V) icorr (AJcm?) concentration (g) resistance (Q) rate (mmj/year) 0.0335 0.0409 —0.9393 0.0003 24.0910 2.8163 1.9460 0.0596 .8276 0.0002 121.440 1.5054 0.0163 0.2369 .8825 0.0001 42121 0.9476 s NO 03233 0.0540 —0.8027 5.39E-05 373.180 0.4318 0.1240 0.0556 .5896 5.46E-05 305.650 0.3772 = 5 0.0382 0.0086 .5356 1.24E-05 246.080 0.0919'

将其转为html形式

table_html = tables[0].metadata.text_as_html
table_html

输出如下:

'<table><thead><tr><th>Inhibitor concentration (g)</th><th>be (V/dec)</th><th>ba (V/dec)</th><th>Ecorr (V)</th><th>icorr (AJcm?)</th><th>Polarization resistance (Q)</th><th>Corrosion rate (mmj/year)</th></tr></thead><tbody><tr><td></td><td>0.0335</td><td>0.0409</td><td>—0.9393</td><td>0.0003</td><td>24.0910</td><td>2.8163</td></tr><tr><td>NO</td><td>1.9460</td><td>0.0596</td><td>—0.8276</td><td>0.0002</td><td>121.440</td><td>1.5054</td></tr><tr><td></td><td>0.0163</td><td>0.2369</td><td>—0.8825</td><td>0.0001</td><td>42121</td><td>0.9476</td></tr><tr><td>s</td><td>03233</td><td>0.0540</td><td>—0.8027</td><td>5.39E-05</td><td>373.180</td><td>0.4318</td></tr><tr><td></td><td>0.1240</td><td>0.0556</td><td>—0.5896</td><td>5.46E-05</td><td>305.650</td><td>0.3772</td></tr><tr><td>= 5</td><td>0.0382</td><td>0.0086</td><td>—0.5356</td><td>1.24E-05</td><td>246.080</td><td>0.0919</td></tr></tbody></table>'

3.4 格式化呈现

from io import StringIO 
from lxml import etree

parser = etree.XMLParser(remove_blank_text=True)
file_obj = StringIO(table_html)
tree = etree.parse(file_obj, parser)
print(etree.tostring(tree, pretty_print=True).decode())

输出如下:

<table>
  <thead>
    <tr>
      <th>Inhibitor concentration (g)</th>
      <th>be (V/dec)</th>
      <th>ba (V/dec)</th>
      <th>Ecorr (V)</th>
      <th>icorr (AJcm?)</th>
      <th>Polarization resistance (Q)</th>
      <th>Corrosion rate (mmj/year)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td/>
      <td>0.0335</td>
      <td>0.0409</td>
      <td>&#8212;0.9393</td>
      <td>0.0003</td>
      <td>24.0910</td>
      <td>2.8163</td>
    </tr>
    <tr>
      <td>NO</td>
      <td>1.9460</td>
      <td>0.0596</td>
      <td>&#8212;0.8276</td>
      <td>0.0002</td>
      <td>121.440</td>
      <td>1.5054</td>
    </tr>
    <tr>
      <td/>
      <td>0.0163</td>
      <td>0.2369</td>
      <td>&#8212;0.8825</td>
      <td>0.0001</td>
      <td>42121</td>
      <td>0.9476</td>
    </tr>
    <tr>
      <td>s</td>
      <td>03233</td>
      <td>0.0540</td>
      <td>&#8212;0.8027</td>
      <td>5.39E-05</td>
      <td>373.180</td>
      <td>0.4318</td>
    </tr>
    <tr>
      <td/>
      <td>0.1240</td>
      <td>0.0556</td>
      <td>&#8212;0.5896</td>
      <td>5.46E-05</td>
      <td>305.650</td>
      <td>0.3772</td>
    </tr>
    <tr>
      <td>= 5</td>
      <td>0.0382</td>
      <td>0.0086</td>
      <td>&#8212;0.5356</td>
      <td>1.24E-05</td>
      <td>246.080</td>
      <td>0.0919</td>
    </tr>
  </tbody>
</table>

3.5 还原表格到html中显示

from IPython.core.display import HTML
HTML(table_html)

输出如下:在这里插入图片描述

3.6 借助langchain进行摘要

from langchain_openai import ChatOpenAI
from langchain_core.documents import Document
from langchain.chains.summarize import load_summarize_chain

llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo-1106")
chain = load_summarize_chain(llm, chain_type="stuff")
chain.invoke([Document(page_content=table_html)])

输出如下:

{'input_documents': [Document(page_content='<table><thead><tr><th>Inhibitor concentration (g)</th><th>be (V/dec)</th><th>ba (V/dec)</th><th>Ecorr (V)</th><th>icorr (AJcm?)</th><th>Polarization resistance (Q)</th><th>Corrosion rate (mmj/year)</th></tr></thead><tbody><tr><td></td><td>0.0335</td><td>0.0409</td><td>—0.9393</td><td>0.0003</td><td>24.0910</td><td>2.8163</td></tr><tr><td>NO</td><td>1.9460</td><td>0.0596</td><td>—0.8276</td><td>0.0002</td><td>121.440</td><td>1.5054</td></tr><tr><td></td><td>0.0163</td><td>0.2369</td><td>—0.8825</td><td>0.0001</td><td>42121</td><td>0.9476</td></tr><tr><td>s</td><td>03233</td><td>0.0540</td><td>—0.8027</td><td>5.39E-05</td><td>373.180</td><td>0.4318</td></tr><tr><td></td><td>0.1240</td><td>0.0556</td><td>—0.5896</td><td>5.46E-05</td><td>305.650</td><td>0.3772</td></tr><tr><td>= 5</td><td>0.0382</td><td>0.0086</td><td>—0.5356</td><td>1.24E-05</td><td>246.080</td><td>0.0919</td></tr></tbody></table>')],
 'output_text': 'The table provides data on the corrosion rate and polarization resistance of different inhibitor concentrations in a solution. The data includes the inhibitor concentration, be and ba values, Ecorr, icorr, polarization resistance, and corrosion rate. The table shows the impact of different inhibitor concentrations on the corrosion rate and polarization resistance.'}

4. 总结

可以看到,非结构化数据识别还是有难度,不知道为什么,实验中部分识别结果是错的,如果追求准确性,还是得斟酌一下。

### 使用 LLM 模型从 PDF 文件中提取文本和信息 #### 解析 PDF 内容 为了有效地从 PDF 中提取信息,首先需要选择合适的 PDF 解析工具。PyMuPDF 是一种强大的库,能够处理多种类型的 PDF 数据提取工作,包括但不限于文本、注释、表格、图像及矢量图形[^2]。 #### 准备环境 安装必要的 Python 库来支持操作: ```bash pip install pymupdf langchain transformers torch ``` #### 加载并读取 PDF 文档 通过 PyMuPDF 来加载 PDF 并将其转换成适合进一步分析的形式: ```python import fitz # 这是 PyMuPDF 的别名 def read_pdf(file_path): document = fitz.open(file_path) text = "" for page_num in range(len(document)): page = document.load_page(page_num) text += page.get_text() return text.strip() file_path = "example_invoice.pdf" pdf_content = read_pdf(file_path) print(pdf_content[:500]) # 打印500字符作为示例 ``` #### 利用 LLM 处理文本数据 一旦获取到纯文本内容之后,可以借助于大型语言模型 (LLM),比如基于 Hugging Face Transformers 构建应用程序来进行更深层次的信息抽取任务。这里展示了一个简单例子,其中使用了 `pipeline` API 对输入文档执行命名实体识别(NER): ```python from transformers import pipeline ner_model_name = 'dbmdz/bert-large-cased-finetuned-conll03-english' nlp_ner = pipeline('ner', model=ner_model_name, tokenizer='bert-base-cased') entities = nlp_ner(pdf_content) for entity in entities: print(f"{entity['word']} -> {entity['entity']}") ``` 上述方法展示了如何结合使用 PyMuPDF 和 LLM 技术实现从 PDF 文件中高效地提取结构化信息的目的。值得注意的是,在实际应用过程中可能还需要针对特定领域调整参数设置或采用其他优化策略以提高准确性[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

l8947943

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值