分享4个工具,轻松搞定PDF和图像中提取文本

大型语言模型已经席卷了互联网,导致更多的人没有认真关注使用这些模型最重要的部分:高质量的数据!

本文旨在提供一些有效从任何类型文档中提取文本的技术。

Python库

本文专注于Pytesseract、easyOCR、PyPDF2和LangChain库。实验数据是一个单页PDF文件,可在以下链接获取:

https://github.com/keitazoumana/Experimentation-Data/blob/main/Experimentation_file.pdf

由于Pytesseract和easyOCR可以处理图像,因此在执行内容提取之前需要将PDF文件转换为图像。可以使用pypdfium2进行转换,这是一个用于处理PDF文件的强大库,其实现如下:

pip install pypdfium2

以下函数以PDF作为输入,并将PDF的每一页作为图像列表返回。

def convert_pdf_to_images(file_path, scale=300/72):pdf_file = pdfium.PdfDocument(file_path)page_indices = [i for i in range(len(pdf_file))]renderer = pdf_file.render(pdfium.PdfBitmap.to_pil,page_indices = page_indices, scale = scale,)final_images = [] for i, image in zip(page_indices, renderer):image_byte_array = BytesIO()image.save(image_byte_array, format='jpeg', optimize=True)image_byte_array = image_byte_array.getvalue()final_images.append(dict({i:image_byte_array}))return final_images

现在,我们可以使用`display_images`函数来可视化PDF文件的所有页面。

def display_images(list_dict_final_images):all_images = [list(data.values())[0] for data in list_dict_final_images]for index, image_bytes in enumerate(all_images):image = Image.open(BytesIO(image_bytes))figure = plt.figure(figsize = (image.width / 100, image.height / 100))plt.title(f"----- Page Number {index+1} -----")plt.imshow(image)plt.axis("off")plt.show()

通过组合上述两个函数,我们可以得到以下结果:

convert_pdf_to_images = convert_pdf_to_images('Experimentation_file.pdf')
display_images(convert_pdf_to_images)

图片PDF以图像格式可视化

深入文本提取过程

Pytesseract

Pytesseract(Python-tesseract)是用于从图像中提取文本信息的Python OCR工具,可以使用以下pip命令进行安装:

pip install pytesseract

以下的辅助函数使用了 Pytesseract 的 `image_to_string()` 函数从输入图像中提取文本。

from pytesseract import image_to_string
def extract_text_with_pytesseract(list_dict_final_images):image_list = [list(data.values())[0] for data in list_dict_final_images]image_content = []for index, image_bytes in enumerate(image_list):image = Image.open(BytesIO(image_bytes))raw_text = str(image_to_string(image))image_content.append(raw_text)return "\n".join(image_content)

可以使用 `extract_text_with_pytesseract` 函数提取文本,如下所示:

text_with_pytesseract = extract_text_with_pytesseract(convert_pdf_to_images)
print(text_with_pytesseract)

成功执行以上代码将生成以下结果:

This document provides a quick summary of some of Zoumana’s article on Medium.
It can be considered as the compilation of his 80+ articles about Data Science, Machine Learning and
Machine Learning Operations.
...
Pytesseract was able to extract the content of the image.
Here is how it managed to do it!
Pytesseract starts by identifying rectangular shapes within the input image from top-right to bottom-right. Then it extracts the content of the individual images, and the final result is the concatenation of those extracted content. This approach works perfectly when dealing with column-based PDFs and image documents.
...

Pytesseract 首先通过从图像的右上角到右下角识别矩形形状。然后它提取各个图像的内容,最终的结果是这些提取内容的串联。这种方法在处理基于列的 PDF 和图像文档时效果非常好。

easyOCR

easyOCR 也是一个用于光学字符识别的开源 Python 库,目前支持提取 80 多种语言的文本。easyOCR需要安装Pytorch 和 OpenCV,可以使用以下指令安装:

!pip install opencv-python-headless==4.1.2.30

根据您的操作系统,安装 Pytorch 模块的方法可能不同。但所有的说明都可以在官方页面上找到。现在我们来安装 easyOCR 库:

!pip install easyocr

在使用 easyOCR 时,因为它支持多语言,所以在处理文档时需要指定语言。通过其 Reader 模块设置语言,指定语言列表。例如,fr 用于法语,en 用于英语。语言的详细列表在此处可用。

from easyocr import Reader# Load model for the English language
language_reader = Reader(["en"])

文本提取过程在`extract_text_with_easyocr` 函数中实现:

def extract_text_with_easyocr(list_dict_final_images):image_list = [list(data.values())[0] for data in list_dict_final_images]image_content = []for index, image_bytes in enumerate(image_list):image = Image.open(BytesIO(image_bytes))raw_text = language_reader.readtext(image)raw_text = " ".join([res[1] for res in raw_text])image_content.append(raw_text)return "\n".join(image_content)

我们可以如下执行上述函数:

text_with_easy_ocr = extract_text_with_easyocr(convert_pdf_to_images)
print(text_with_easy_ocr)

图片easyOCR 的结果

与 Pytesseract 相比,easyOCR 的效果似乎不太高效。例如,它能够有效地读取前两个段落。然而,它不是将每个文本块视为独立的文本,而是使用基于行的方法进行读取。例如,第一个文本块中的字符串“Data Science section covers basic to advanced”已与第二个文本块中的“overfitting when training computer vision”组合在一起,这种组合完全破坏了文本的结构并使最终结果产生偏差。

PyPDF2

PyPDF2 也是一个专门用于 PDF 处理任务的 Python 库,例如文本和元数据的检索、合并、裁剪等。

!pip install PyPDF2

提取逻辑实现在 `extract_text_with_pyPDF` 函数中:

def extract_text_with_pyPDF(PDF_File):pdf_reader = PdfReader(PDF_File)raw_text = ''for i, page in enumerate(pdf_reader.pages):text = page.extract_text()if text:raw_text += textreturn raw_text
text_with_pyPDF = extract_text_with_pyPDF("Experimentation_file.pdf")
print(text_with_pyPDF)

图片

使用 PyPDF 库进行文本提取

提取过程快速而准确,甚至保留了原始字体大小。PyPDF 的主要问题是它不能有效地从图像中提取文本。

LangChain

LangChain 的 UnstructuredImageLoader 和 UnstructuredFileLoader 模块可分别用于从图像和文本/PDF 文件中提取文本,并且在本节中将探讨这两个选项。

首先,我们需要按照以下方式安装 langchain 库:

!pip install langchain

从图像中提取文本

from langchain.document_loaders.image import UnstructuredImageLoader

以下是提取文本的函数:

def extract_text_with_langchain_image(list_dict_final_images):image_list = [list(data.values())[0] for data in list_dict_final_images]image_content = []for index, image_bytes in enumerate(image_list):image = Image.open(BytesIO(image_bytes))loader = UnstructuredImageLoader(image)data = loader.load()raw_text = data[index].page_contentimage_content.append(raw_text)return "\n".join(image_content)

现在,我们可以提取内容:

text_with_langchain_image = extract_text_with_langchain_image(convert_pdf_to_images)
print(text_with_langchain_image)

图片来自 langchain UnstructuredImageLoader 的文本提取

该库成功高效地提取了图像的内容。

从 PDF 中提取文本

以下是从 PDF 中提取内容的实现:

from langchain.document_loaders import UnstructuredFileLoader
def extract_text_with_langchain_pdf(pdf_file):loader = UnstructuredFileLoader(pdf_file)documents = loader.load()pdf_pages_content = '\n'.join(doc.page_content for doc in documents)return pdf_pages_content
text_with_langchain_files = extract_text_with_langchain_pdf("Experimentation_file.pdf")
print(text_with_langchain_files)

类似于 PyPDF 模块,langchain 模块能够生成准确的结果,同时保持原始字体大小。

图片

从 langchain 的 UnstructuredFileLoader 中提取文本

技术交流

建了技术交流群!想要进交流群、获取原版资料的同学,可以直接加微信号:dkl88194。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

方式①、添加微信号:dkl88194,备注:来自CSDN + 技术交流
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

资料1

在这里插入图片描述

资料2
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/190443.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络TCP篇①

目录 一、TCP 基本信息 1.1、TCP 的头格式 1.2、什么是 TCP 1.3、什么是 TCP 连接 1.4、TCP 与 UDP 的区别 1.2、TCP 连接建立 1.2.1、TCP 三次握手的过程 1.2.2、为什么是三次握手?不是两次?四次?(这个问题真是典中典&am…

深度学习实战63-利用自适应混合金字塔网络实现人脸皮肤美颜效果,快速部署与实现一键美颜功能

大家好,我是微学AI,今天给大家介绍一下深度学习实战63-利用自适应混合金字塔网络实现人脸皮肤美颜效果,快速部署与实现一键美颜功能。在本文中,我将介绍一种新颖的自适应混合金字塔网络(ABPN),该网络可以实现对超高分辨率照片的快速局部修饰。该网络主要由两个组件组成:一…

你知道Canary金丝雀版本的由来吗

Canary金丝雀版本是一种软件开发中常见的概念,它作为一种测试和试用版,旨在保护用户安全性和隐私,同时促进创新和改进。本文主要介绍Canary版本的由来。 随着技术的不断进步,软件开发变得越来越复杂且困难。为了满足用户需求并提…

【渗透】记录阿里云CentOS一次ddos攻击

文章目录 发现防御 发现 防御 流量清洗 使用高防

io基础入门

压缩的封装 参考:https://blog.csdn.net/qq_29897369/article/details/120407125?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-120407125-blog-120163063.235v38pc_relevant_sort_base3&spm1001.2101.3001.…

【数据结构(五)】递归

文章目录 1. 递归的概念2. 递归能解决什么问题3. 递归的规则4. 递归实际应用案例4.1. 迷宫问题4.2. 八皇后问题4.2.1. 思路分析4.2.1. 代码实现 1. 递归的概念 简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂的问题&…

数据结构 - 堆:TOP-K问题

问题描述 TOP-K问题:即求数据结合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大 比如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等 对于Top-K问题,能想到的最简单直接的方式就是排序,但是&…

Linux部署elasticsearch集群

文章目录 一、集群规划二、安装前准备(所有节点操作)创建数据目录修改系统配置文件/etc/sysctl.conf创建用户组设置limits.conf 三、初始化配置(在节点1上操作)下载安装包解压安装包修改jvm.options文件下配置的所占内存修改集群配置文件elasticsearch.yml将安装包传到另外两个…

00后卷王真的很卷吗?

前言 都在传00后躺平、整顿职场,但该说不说,是真的卷,感觉我都要被卷废了... 前段时间,公司招了一个年轻人,其中有一个是00后,工作才一年多,直接跳槽到我们公司,薪资据说有18K&…

Linux学习——模拟实现mybash小程序

目录 一,跟正宗的bash见个面 二,实现一个山寨的bash 1.提示符 2.输入命令与回显命令 3.解析命令 4.执行命令 5.执行逻辑 三,全部代码 一,跟正宗的bash见个面 在这篇文章中,我会写一个myshell小程序。这个小程序…

logback-spring.xml详解

《springboot使用logback日志框架超详细教程》文中,filter中最重要的两个过滤器LevelFilter(日志级别精确匹配)、ThresholdFilter(阈值过滤) 的描述非常准确: springboot使用logback日志框架超详细教程_sp…

SQL Server数据库部署

数据库简介 使用数据库的必要性 使用数据库可以高效且条理分明地存储数据,使人们能够更加迅速、方便地管理数据。数据库 具有以下特点。 》可以结构化存储大量的数据信息,方便用户进行有效的检索和访问。 》 可以有效地保持数据信息的一致性&#xff0c…

【Casbin】一篇文章入门Casbin

Casbin Casbin模型基础(PERM)Policy定义Request定义MatchersEffect ACL模型RBAC模型Go语言实战使用前先下载casbin包新建一个Casbin enforcer判断是否能通过增加Policy删除Policy更新Policy获取Policy Casbin 权限管理在几乎每个系统中都是必备的模块。…

java设计模式学习之【桥接模式】

文章目录 引言桥接模式简介定义与用途:实现方式 使用场景优势与劣势桥接模式在Spring中的应用绘图示例代码地址 引言 想象你正在开发一个图形界面应用程序,需要支持多种不同的窗口操作系统。如果每个系统都需要写一套代码,那将是多么繁琐&am…

【vue-router】useRoute 和 useRouter 的区别

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…

一起学docker系列之十四Dockerfile微服务实践

目录 1 前言2 创建微服务模块2.1 **创建项目模块**2.2 **编写业务代码** 3 编写 Dockerfile4 构建 Docker 镜像5 运行 Docker 容器6 测试微服务7 总结8 参考地址 1 前言 微服务架构已经成为现代软件开发中的一种重要方式。而 Docker 提供了一种轻量级、便携式的容器化解决方案…

ESP32和ESP8266的ESP-MESH

ESP32和ESP8266的ESP-MESH 功能介绍一、介绍ESP-MESH二、安装painlessMesh库三、ESP-MESH基本示例(广播消息)四、示范 功能介绍 了解如何使用ESP-MESH网络协议通过ESP32和ESP8266 NodeMCU板构建网状网络。 ESP-MESH允许多个设备(节点&#x…

群晖NAS配置之自有服务器frp实现内网穿透

什么是frp frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。今天跟大家分享一下frp实现内网穿透 为什么使用 frp &a…

基于瑞芯微rk3588+寒武纪 | 38TOPS INT8算力的AI边缘计算盒子,智能安防、智慧工地、智慧城管、智慧油站

边缘计算盒子 瑞芯微rk3588寒武纪 | 38TOPS INT8算力 ● 采用 Big-Little 大小核架构,搭载四核 A76四核 A55,CPU主频高达 2.4GHz ,提供1MB L2 Cache 和 3MB L3 ,Cache提供更强的 CPU 运算能力。 ● 高性能四核 Mali-G610 GPU&a…

i++和++i的区别

i和i的区别 一、基本概念 两者的作用都是自增加1。 单独拿出来说的话,i和i,效果都是一样的,就是ii1 public static void main(String[] args) {int i 0;i;System.out.println(i);}public static void main(String[] args) {int i 0;i;Sys…