PDF提取文本

news2025/1/10 3:33:37

1.环境配置

!pip install PyPDF2 pdfplumber

    PyPDF2 是用来处理 PDF 文件的库,主要功能包括PDF 文件读取、合并、拆分、旋转,可以从 PDF 中提取纯文本,尽管它的提取效果有限,特别是对于扫描版 PDF 文件。

    pdfplumber 是比 PyPDF2 更强大的 PDF 处理库,特别擅长处理 PDF 中的表格和文本,能够高效地提取 PDF 的文本内容,并且对于表格的处理更为精确。

2.使用 PyPDF2提取文本

import PyPDF2

# 打开PDF文件
with open('D:/program-OCR/data-PDF-TXT/book.pdf', 'rb') as file:
    reader = PyPDF2.PdfReader(file)
    text = ''
    # 提取每一页的文本
    for page in reader.pages:
        text += page.extract_text()

# 将提取的文本保存为TXT文件
with open('D:/program-OCR/data-PDF-TXT/output-book-PyPDF2.txt', 'w', encoding='utf-8') as output_file:
    output_file.write(text)

     rb 模式表示以二进制方式读取文件,适用于 PDF 文件等非文本文件。with open 是 Python 常用的文件操作方法,使用它可以确保在文件操作完后自动关闭文件,避免资源泄露。'w' 表示写入模式,如果文件不存在会创建文件,如果文件已存在会覆盖原有内容。

3.使用 pdfplumber提取文本

import pdfplumber

with pdfplumber.open('D:/program-OCR/data-PDF-TXT/book.pdf') as pdf:
    text = ''
    for page in pdf.pages:
        text += page.extract_text()

# 保存为TXT文件
with open('D:/program-OCR/data-PDF-TXT/output-book-pdfplumber.txt', 'w', encoding='utf-8') as output_file:
    output_file.write(text)

     with 语句确保文件在操作完成后自动关闭,pdf.pages 是包含 PDF 文件所有页面的列表。page.extract_text() 会提取该页面的文本内容,返回字符串。如果页面的内容是纯文本而没有复杂的排版,extract_text() 会返回相对干净的文本。pdfplumber 提取文本相较于其他库更注重排版和结构,因此如果 PDF 文件的文本排版比较复杂,pdfplumber 能够更好地保留原有的结构。

4.使用difflib比较相似度

import difflib

# 读取两个TXT文件
with open('D:/program-OCR/data-PDF-TXT/output-book-PyPDF2.txt', 'r', encoding='utf-8') as file1:
    pyPDF2_text = file1.read()

with open('D:/program-OCR/data-PDF-TXT/output-book-pdfplumber.txt', 'r', encoding='utf-8') as file2:
    pdfplumber_text = file2.read()

# 使用difflib对比两者的相似度
similarity = difflib.SequenceMatcher(None, pyPDF2_text, pdfplumber_text).ratio()
print(f"两个文件的相似度为: {similarity:.2f}")

     difflib常用于文本比对,可以通过计算序列的相似度来判断两个文本的相似度。SequenceMatcher 的 ratio() 方法返回0 到 1 之间的浮动值,值越接近 1,说明文本越相似;值越接近 0,说明文本差异越大。表示两个文本之间的相似度。None 默认参数,表示不使用自定义的比较函数。

5.检查段落分隔或格式化差异

# 检查文本是否有段落分隔
print(pyPDF2_text[:1000])  # 查看PyPDF2提取的文本开头部分
print(pdfplumber_text[:1000])  # 查看pdfplumber提取文本开头部分

     段落分隔检查,PyPDF2 和 pdfplumber 提取文本可能会因为解析方式不同而产生格式差异。例如,某些段落在一个方法中可能被正确分隔,而另一个方法可能没有分隔符,导致文本连续。可以通过查看输出的开头部分,检查是否有段落之间的空行,或者是否存在一些特殊字符(如换行符 \n)来判断文本是否正确分段。

     文本内容对比,打印文本前1000个字符可以快速了解提取文本内容是否有格式错误或提取不完全的问题。例如,某些词语可能会缺失,或某些格式可能被错误地解析为一行连续文本。

6.检查乱码或错误字符

# 输出两种方法中是否有乱码或错误字符
print(pyPDF2_text[:2000])  # 查看PyPDF2提取的前2000个字符
print(pdfplumber_text[:2000]) #查看pdfplumber提取前2000个字符

     检查乱码或编码错误,PDF 提取过程中,文本的字符编码可能会出现问题,导致某些字符无法正确显示,或者出现乱码。通过查看前2000个字符,可以帮助快速发现这些问题。

    检查是否有不正确格式或符号,某些提取工具可能会在提取过程引入额外符号或格式问题,例如多余的换行符、特殊符号或不可见字符。通过对比两者的输出,可以验证是否存在格式错误。

7.测量运行时间

import time

# 测量PyPDF2的运行时间
start_time = time.time()
# PyPDF2提取代码
end_time = time.time()
print(f"PyPDF2提取时间: {end_time - start_time:.2f}秒")

# 测量pdfplumber的运行时间
start_time = time.time()
# pdfplumber提取代码
end_time = time.time()
print(f"pdfplumber提取时间: {end_time - start_time:.2f}秒")

     time模块提供了许多与时间相关的功能,其中time.time() 用来获取当前的时间戳(单位为秒)。通过记录代码执行前后的时间戳,可以计算出代码执行的时间差,比较不同方法的性能。

8.计算余弦相似度

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# 读取提取的TXT文件
with open('D:/program-OCR/data-PDF-TXT/output-book-pdfplumber.txt', 'r', encoding='utf-8') as f:
    pdfplumber_text = f.read()

with open('D:/program-OCR/data-PDF-TXT/output-book-PyPDF2.txt', 'r', encoding='utf-8') as f:
    pyPDF2_text = f.read()

# 创建TF-IDF向量化器
vectorizer = TfidfVectorizer()

# 将两个文本转化为TF-IDF向量
tfidf_matrix = vectorizer.fit_transform([pdfplumber_text, pyPDF2_text])

# 计算余弦相似度
cosine_sim = cosine_similarity(tfidf_matrix[0:1], tfidf_matrix[1:2])
print(f"两种提取方式的余弦相似度为: {cosine_sim[0][0]:.4f}")

    余弦相似度用于衡量两个文本在向量空间中的相似度,值的范围是 [0, 1],值越大表示两个文本越相似。TfidfVectorizer用于将文本数据转换为 TF-IDF(词频-逆文档频率)特征矩阵,TF-IDF 是评估单词在文档集合重要性的统计方法。cosine_similarity用于计算两个文本之间的余弦相似度。fit_transform() 方法将文本数据转化为 TF-IDF 向量,返回稀疏矩阵,表示每个文档中每个词的 TF-IDF 值。

9.计算Jaccard 相似度

def jaccard_similarity(text1, text2):
    set1 = set(text1.split())
    set2 = set(text2.split())
    intersection = len(set1.intersection(set2))
    union = len(set1.union(set2))
    return intersection / union
jaccard_sim = jaccard_similarity(pdfplumber_text, pyPDF2_text)
print(f"两种提取方式的Jaccard相似度为: {jaccard_sim:.4f}")

     Jaccard 相似度是衡量两个集合相似度常用指标,通过计算两个集合交集与并集的比值来衡量它们的相似性,intersection / union是返回交集大小与并集大小之比。Jaccard 相似度的值范围是 [0, 1]:值为 1 表示两个文本完全相同,所有单词都相同。值为 0 表示两个文本完全不同,没有任何相同的单词。

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

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

相关文章

如何在手机上玩电脑pc游戏,通过termux安装mobox教程说明

如何在手机上玩电脑pc游戏,通过termux安装mobox教程说明 所需软件 1.Termux 或改版 zeroTermux 2.Termux:X11 3.Inputbridge 以下为网盘链接 https://pan.baidu.com/s/1foEY0djqJTCrtYES9nE66g?pwd2ji2 提取码:2ji2 123 网盘 https://www.123pan.com/s/l5mlV…

create-react-app react19 搭建项目报错

报错截图 此时运行会报错: 解决方法: 1.根据提示安装依赖法 执行npm i web-vitals然后重新允许 2.删除文件法 在index.js中删除对报错文件的引入,删除报错文件

【Qt移植LVGL】QWidget手搓LVGL软件仿真模拟器(非直接运行图形库)

【Qt移植LVGL】QWidget手搓LVGL软件仿真模拟器(非直接运行图形库) 打包开源地址: Qt函数库gitee地址 更新以gitee为准 移植后的demo工程: gitee 有些没实现的 后续我会继续优化 文章目录 别碰瓷看清楚:是移植&#…

Python、R循环神经网络RNN、指数平滑ETS、ARIMA模型预测网络流量、ATM机取款、旅游需求时间序列数据...

全文链接:https://tecdat.cn/?p38496 分析师:Pengyuan Wen 在当今经济研究与商业决策领域,精准的时间序列预测具有极为关键的意义。社会消费品零售总额作为反映人民消费水平以及国民经济状况的核心指标,其发展趋势的精准把握对中…

甘肃美食之选:食家巷方形饼

甘肃食家巷方形饼,顾名思义,其形状呈规整的方形。这种独特的外形并非偶然,而是源于当地传统的制作工艺。制作方形饼的师傅们,精心挑选优质的面粉,加入适量的水和其他配料,揉成光滑的面团。经过一段时间的发…

linux——挂载nfs网络硬盘

(一)安装nfs服务 1、查看系统是否已经安装nfs rpm -qa | grep nfs rpm -qa | grep rpcbind 2、安装nfs 服务 yum -y install nfs-utils yum -y install rpcbind nfs 固定端口号 2049 rpc 固定端口号 111 (二)centos中服务…

网络安全中大数据和人工智能应用实践

传统的网络安全防护手段主要是通过单点的网络安全设备,随着网络攻击的方式和手段不断的变化,大数据和人工智能技术也在最近十年飞速地发展,网络安全防护也逐渐开始拥抱大数据和人工智能。传统的安全设备和防护手段容易形成数据孤岛&#xff0…

共筑数字安全防线,2024开源和软件安全沙龙即将启幕

随着数字化转型进程的加快以及开源代码的广泛应用,开源凭借平等、开放、协作、共享的优秀创作模式,逐渐成为推动数字技术创新、加速传统行业转型升级的重要模式。但随着软件供应链日趋复杂多元,使得其安全风险不断加剧,针对软件供…

4K高清壁纸网站推荐

1. Awesome Wallpapers 官网: https://4kwallpapers.com/ 主题: 创意、摄影、人物、动漫、绘画、视觉 分辨率: 4K Awesome Wallpapers 提供了丰富的高质量图片,分为通用、动漫、人物三大类,可以按屏幕比例和分辨率检索,满足你对壁纸的各种…

Java阶段三06

第3章-第6节 一、知识点 理解MVC三层模型、理解什么是SpringMVC、理解SpringMVC的工作流程、了解springMVC和Struts2的区别、学会使用SpringMVC封装不同请求、接收参数 二、目标 理解MVC三层模型 理解什么是SpringMVC 理解SpringMVC的工作流程 学会使用SpringMVC封装请求…

qt-C++语法笔记之mapToGlobal将组件(控件)中的本地坐标系(局部坐标)映射到全局坐标系

qt-C语法笔记之mapToGlobal将组件(控件)中的本地坐标系(局部坐标)映射到全局坐标系 code review! 文章目录 qt-C语法笔记之mapToGlobal将组件(控件)中的本地坐标系(局部坐标)映射到…

使用Kimi开发自己的问答应用

概述 Kimi是大家常用的一个人工智能助手,本文使用Kimi开发文档,以node作为后端,开发与一个问答系统 实现效果 Kimi简介 Kimi是由Moonshot AI开发的人工智能助手,擅长中文和英文对话。目标是帮助用户解决问题、提供信息和执行任…

从零开始:Linux 环境下的 C/C++ 编译教程

个人主页:chian-ocean 文章专栏 前言: GCC(GNU Compiler Collection)是一个功能强大的编译器集合,支持多种语言,包括 C 和 C。其中 gcc 用于 C 语言编译,g 专用于 C 编译。 Linux GCC or G的安…

ElasticSearch如何做性能优化?

大家好,我是锋哥。今天分享关于【ElasticSearch如何做性能优化?】面试题。希望对大家有帮助; ElasticSearch如何做性能优化? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Elasticsearch 中,性能优化是…

Flask 是什么?

近期开发chatbot 程序,过程中要使用Flask,所以收集资料记录这个套件的信息: Flask 是什么? Flask 是一个轻量级、模块化的 Python Web 框架,用于构建 Web 应用程序和 API。它被设计为简单、灵活且可扩展,…

北京大学《操作系统原理》(陈向群主讲)课堂笔记(一)

北京大学《操作系统原理》&#xff08;陈向群主讲&#xff09;课堂笔记&#xff08;一&#xff09; 一、操作系统概述 1.1、操作系统做了什么&#xff1f; 以c语言helloworld为例子&#xff1a; #include<stdio.h> int main(int argc, char *argv[]) {puts("hello…

计算c++11 lambada表达式的大小

lambada表达式是什么? 详解&#xff1a;lambada表达式详解 我们知道lambada其实是一个匿名函数 &#xff0c; 它属于 可调用对象 类型。在 C 中&#xff0c;lambda 表达式会生成一个隐式定义的类&#xff0c;这个类重载了 operator()&#xff0c;使得该对象可以像函数一样被…

【unity小技巧】分享vscode如何进行unity开发,且如何开启unity断点调试模式,并进行unity断点调试(2024年最新的方法,实测有效)

文章目录 前言一、前置条件1、已安装Visual Studio Code&#xff0c;并且unity首选项>外部工具>外部脚本编辑器选择为Visual Studio Code [版本号]&#xff0c;2、在Visual Studio Code扩展中搜索Unity&#xff0c;并安装3、同时注意这个插件下面的描述&#xff0c;需要根…

亚马逊云科技 re:Invent 2024!Amazon Aurora DSQL 闪亮登场,跨区域提供强一致性,带来全新突破!

在 AWS re:Invent 2024 的主题演讲中&#xff0c;Amazon 正式发布了支持多区域 Active/Active 架构的关系型数据库 Aurora DSQL&#xff0c;目前已开放预览。 我正在拉斯维加斯现场观看 Keynote&#xff0c;刚刚听到这一令人振奋的消息。Aurora DSQL 的亮点在于能够跨区域写入…

计算机视觉在科学研究(数字化)中的实际应用

计算机视觉是一种利用计算机技术来解析和理解图像和视频的方法。.随着计算机技术的不断发展&#xff0c;计算机视觉被广泛应用于科学研究领域&#xff0c;为科学家提供了无限的可能。 一、生命科学领域 在生命科学领域&#xff0c;计算机视觉被广泛用于图像识别、分类和测量等…