赞
踩
想法
大型语言模型已经席卷了互联网,导致更多的人没有认真关注使用这些模型最重要的部分:高质量的数据!本文旨在提供一些有效从任何类型文档中提取文本的技术。
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 += text
-
-
- return 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_content
-
- image_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 中提取文本
· END ·
HAPPY LIFE
本文仅供学习交流使用,如有侵权请联系作者删除
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。