”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 Google Gemini 在 Python 行中从棘手的 PDF 中提取数据

使用 Google Gemini 在 Python 行中从棘手的 PDF 中提取数据

发布于2024-08-17
浏览:668

在本指南中,我将向您展示如何使用 Gemini Flash 或 GPT-4o 等视觉语言模型 (VLM) 从 PDF 中提取结构化数据。

Gemini 是 Google 最新的视觉语言模型系列,在文本和图像理解方面表现出了最先进的性能。这种改进的多模式功能和长上下文窗口使其特别适用于处理传统提取模型难以处理的视觉上复杂的 PDF 数据,例如图形、图表、表格和图表。

通过这样做,您可以轻松构建自己的数据提取工具,用于可视化文件和网页提取。方法如下:

Gemini 的长上下文窗口和多模式功能使其对于处理传统提取模型难以处理的视觉复杂 PDF 数据特别有用。

设置您的环境

在我们深入提取之前,让我们设置我们的开发环境。本指南假设您的系统上安装了 Python。如果没有,请从 https://www.python.org/downloads/

下载并安装它

⚠️ 请注意,如果您不想使用 Python,您可以使用 thepi.pe 的云平台上传文件并将结果下载为 CSV,而无需编写任何代码。

安装所需的库

打开终端或命令提示符并运行以下命令:

pip install git https://github.com/emcf/thepipe
pip install pandas

对于 Python 新手来说,pip 是 Python 的包安装程序,这些命令将下载并安装必要的库。

设置您的 API 密钥

要使用管道,您需要 API 密钥。

免责声明:虽然 thepi.pe 是一个免费的开源工具,但 API 是有成本的,每个代币大约为 0.00002 美元。如果您想避免此类成本,请查看 GitHub 上的本地设置说明。请注意,您仍然需要向您选择的 LLM 提供商付款。

获取和设置方法如下:

  1. 访问 https://thepi.pe/platform/
  2. 创建帐户或登录
  3. 在设置页面中查找您的 API 密钥

Extracting Data from Tricky PDFs with Google Gemini in lines of Python

现在,您需要将其设置为环境变量。该过程因您的操作系统而异:

  • 从 pi.pe 平台上的设置菜单复制 API 密钥

对于 Windows:

  1. 在开始菜单中搜索“环境变量”
  2. 点击“编辑系统环境变量”
  3. 点击“环境变量”按钮
  4. 在“用户变量”下,单击“新建”
  5. 将变量名称设置为 THEPIPE_API_KEY,并将值设置为您的 API 密钥
  6. 点击“确定”保存

对于 macOS 和 Linux:
打开终端并将此行添加到 shell 配置文件(例如 ~/.bashrc 或 ~/.zshrc):

export THEPIPE_API_KEY=your_api_key_here

然后,重新加载您的配置:

source ~/.bashrc # or ~/.zshrc

定义您的提取模式

成功提取的关键是为要提取的数据定义清晰的架构。假设我们正在从工程量清单文档中提取数据:

Extracting Data from Tricky PDFs with Google Gemini in lines of Python

工程量清单文档中的页面示例。每个页面上的数据独立于其他页面,因此我们“每页”进行提取。每页要提取多条数据,所以我们设置多次提取为True

查看列名,我们可能想要提取如下模式:

schema = {
  "item": "string",
  "unit": "string",
  "quantity": "int",
}

您可以在 pi.pe 平台上根据自己的喜好修改架构。单击“查看架构”将为您提供一个架构,您可以复制并粘贴以与 Python API 一起使用

Image description

从 PDF 中提取数据

现在,让我们使用 extract_from_file 从 PDF 中提取数据:

from thepipe.extract import extract_from_file
results = extract_from_file(
  file_path = "bill_of_quantity.pdf",
  schema = schema,
  ai_model = "google/gemini-flash-1.5b",
  chunking_method = "chunk_by_page"
)

在这里,我们有 chunking_method="chunk_by_page" 因为我们想将每个页面单独发送到 AI 模型(PDF 太大,无法一次全部发送)。我们还设置 multiple_extractions=True 因为每个 PDF 页面都包含多行数据。 PDF 页面如下所示:

Image description

在 pi.pe 平台上查看的工程量清单 PDF 的提取结果

处理结果

提取结果以字典列表的形式返回。我们可以处理这些结果来创建 pandas DataFrame:

import pandas as pd
df = pd.DataFrame(results)
# Display the first few rows of the DataFrame
print(df.head())

这将创建一个包含所有提取信息的 DataFrame,包括文本内容和图形和表格等视觉元素的描述。

导出为不同格式

现在我们已经将数据存储在 DataFrame 中,我们可以轻松地将其导出为各种格式。以下是一些选项:

导出到 Excel

df.to_excel("extracted_research_data.xlsx", index=False, sheet_name="Research Data")

这将创建一个名为“extracted_research_data.xlsx”的 Excel 文件,其中包含一个名为“Research Data”的工作表。 index=False 参数可防止 DataFrame 索引作为单独的列包含在内。

导出为 CSV

如果您喜欢更简单的格式,可以导出为 CSV:

df.to_csv("extracted_research_data.csv", index=False)

这将创建一个可以在 Excel 或任何文本编辑器中打开的 CSV 文件。

结束语

成功提取的关键在于定义清晰的模式并利用人工智能模型的多模式功能。随着您对这些技术越来越熟悉,您可以探索更高级的功能,例如自定义分块方法、自定义提取提示以及将提取过程集成到更大的数据管道中。

版本声明 本文转载于:https://dev.to/emcf/extracting-data-from-tricky-pdfs-with-google-gemini-in-10-lines-of-python-7ni?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-06-05
  • eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    称量()和ast.literal_eval()中的Python Security 在使用用户输入时,必须优先确保安全性。强大的Python功能Eval()通常是作为潜在解决方案而出现的,但担心其潜在风险。 This article delves into the differences betwee...
    编程 发布于2025-06-05
  • 在Python中如何创建动态变量?
    在Python中如何创建动态变量?
    在Python 中,动态创建变量的功能可以是一种强大的工具,尤其是在使用复杂的数据结构或算法时,Dynamic Variable Creation的动态变量创建。 Python提供了几种创造性的方法来实现这一目标。利用dictionaries 一种有效的方法是利用字典。字典允许您动态创建密钥并分...
    编程 发布于2025-06-05
  • Java为何无法创建泛型数组?
    Java为何无法创建泛型数组?
    通用阵列创建错误 arrayList [2]; JAVA报告了“通用数组创建”错误。为什么不允许这样做?答案:Create an Auxiliary Class:public static ArrayList<myObject>[] a = new ArrayList<myO...
    编程 发布于2025-06-05
  • 如何使用node-mysql在单个查询中执行多个SQL语句?
    如何使用node-mysql在单个查询中执行多个SQL语句?
    Multi-Statement Query Support in Node-MySQLIn Node.js, the question arises when executing multiple SQL statements in a single query using the node-mys...
    编程 发布于2025-06-05
  • 如何在GO编译器中自定义编译优化?
    如何在GO编译器中自定义编译优化?
    在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    编程 发布于2025-06-05
  • 如何使用PHP将斑点(图像)正确插入MySQL?
    如何使用PHP将斑点(图像)正确插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call ...
    编程 发布于2025-06-05
  • 在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
    在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
    在UTF8表中将latin1字符转换为utf8 ,您遇到了一个问题,其中含义的字符(例如,“jáuòiñe”)在utf8 table tabled tablesset中被extect(例如,“致电。为了解决此问题,您正在尝试使用“ mb_convert_encoding”和“ iconv”转换受...
    编程 发布于2025-06-05
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-06-05
  • 如何高效地在一个事务中插入数据到多个MySQL表?
    如何高效地在一个事务中插入数据到多个MySQL表?
    mySQL插入到多个表中,该数据可能会产生意外的结果。虽然似乎有多个查询可以解决问题,但将从用户表的自动信息ID与配置文件表的手动用户ID相关联提出了挑战。使用Transactions和last_insert_id() 插入用户(用户名,密码)值('test','test...
    编程 发布于2025-06-05
  • 如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    为有效的slug生成首先,该函数用指定的分隔符替换所有非字母或数字字符。此步骤可确保slug遵守URL惯例。随后,它采用ICONV函数将文本简化为us-ascii兼容格式,从而允许更广泛的字符集合兼容性。接下来,该函数使用正则表达式删除了不需要的字符,例如特殊字符和空格。此步骤可确保slug仅包含...
    编程 发布于2025-06-05
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-06-05
  • 在Pandas中如何将年份和季度列合并为一个周期列?
    在Pandas中如何将年份和季度列合并为一个周期列?
    pandas data frame thing commans date lay neal and pree pree'和pree pree pree”,季度 2000 q2 这个目标是通过组合“年度”和“季度”列来创建一个新列,以获取以下结果: [python中的concate...
    编程 发布于2025-06-05
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-06-05
  • C++中如何将独占指针作为函数或构造函数参数传递?
    C++中如何将独占指针作为函数或构造函数参数传递?
    在构造函数和函数中将唯一的指数管理为参数 unique pointers( unique_ptr [2启示。通过值: base(std :: simelor_ptr n) :next(std :: move(n)){} 此方法将唯一指针的所有权转移到函数/对象。指针的内容被移至功能中,在操作...
    编程 发布于2025-06-05

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3