PDF提取文本

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 表示两个文本完全不同,没有任何相同的单词。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

Leetcode经典题5--轮转数组

题目描述 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 输入输出示例 : 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右…

【LeetCode】每日一题 2024_12_9 判断国际象棋棋盘中一个格子的颜色(找规律)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动! 题目:判断国际象棋棋盘中一个格子的颜色 最近力扣一直在出棋盘类的题目,这个月已经出了 9 天了,我倒要看看他是不是真能出一个月 代码与解题思路 先读题:题…

VRRP的知识点总结及实验

1、VRRP VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)既能够实现网关的备份,又能解决多个网关之间互相冲突的问题,从而提高网络可靠性。 2、VRRP技术概述: 通过把几台路由设备联合组成一台虚拟的“路由设备”…

PostgreSQL 安装部署系列:使用YUM 方式在Centos 7.9 安装指定 PostgreSQL -15版本数据库

一、前言 千里之行始于足下,想学习一门数据库,首先要从安装部署开始,先拥有一套属于自己的学习测试库。为了更好的学习该数据库,可以选择一个在企业界使用率比较普及的操作系统,选择稳定版本的操作系统;如果…

Kafka Stream实战教程

Kafka Stream实战教程 1. Kafka Streams 基础入门 1.1 什么是 Kafka Streams Kafka Streams 是 Kafka 生态中用于 处理实时流数据 的一款轻量级流处理库。它利用 Kafka 作为数据来源和数据输出,可以让开发者轻松地对实时数据进行处理,比如计数、聚合、…

Flink:入门介绍

目录 一、Flink简介 2.1 Flink 架构 2.2 Flink 应用程序 运行模式 二、Flink 集群 部署 2.1 本地集群模式 2.1.1 安装JDK​编辑 2.1.2 下载、解压 Flink 2.1.3 启动集群 2.1.4 停止集群 2.2 Standalone 模式 2.2.0 集群规划 2.2.1 安装JDK 2.2.2 设置免密登录 2…

重生之我在异世界学编程之C语言:深入结构体篇(上)

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文《1》 结构体的两种声明一、结构…

移动充电服务如何打破传统的新能源汽车充电难、找桩难问题?

中国新能源汽车在全球市场中占据重要地位,2024年上半年,中国新能源汽车销量达到494.4万辆,占全球新能源市场的68%。新能源汽车作为国家实现“碳中和”的重要途径之一,国家陆续出台各项产业政策,推动新能源汽车行业往标…

AI大模型ollama结合Open-webui

AI大模型Ollama结合Open-webui 作者:行癫(盗版必究) 一:认识 Ollama 1.什么是Ollama ​ Ollama是一个开源的 LLM(大型语言模型)服务工具,用于简化在本地运行大语言模型,降低使用大语言模型的门槛,使得大模型的开发者、研究人员和爱好者能够在本地环境快速实验、管理和…

Ubuntu Linux 图形界面工具管理磁盘分区和文件系统(八)

本文为Ubuntu Linux操作系统- 第八弹~~ 今天接着上文的内容,讲Linux磁盘分区存储的相关知识~ 上期回顾:命令行-管理磁盘分区和文件系统 今天看酷酷的雪獒铠甲!!雪獒铠甲合体~ 文章目录 磁盘管理器GNOME Disks主要功能安装命令 磁盘…

AI大模型的实践应用-探索智能科技的未来(附学习教程资源)

第一章:AI大模型技术概览 1.1 AI大模型的定义与特点 AI大模型,通常指的是参数数量达到数亿甚至数千亿的深度学习模型。这些模型因其庞大的参数量而得名,能够捕捉和学习数据中的复杂模式和关系。与传统模型相比,AI大模型具有更强的…

AI 数字人模型 Hallo2:让图片开口说话,一键修复模糊人脸

Hallo2 是由复旦大学 (Fudan University)、百度公司 (Baidu Inc) 和南京大学 (Nanjing University) 于 2024 年联合开发的一项先进技术,旨在生成长时间、高质量的唇形视频。该技术在原有的 Hallo 模型基础上进行了多项创新和改进,使其能够应对长时间视频…

反向代理-缓存篇

文章目录 强缓存一、Expires(http1.0 规范)二、cache-control(http1.1 出现的 header 信息)Cache-Control 的常用选项Cache-Control 常用选项的选择三、弊端协商缓存一、ETag二、If-None-Match三、Last-modified四、If-Modified-Since浏览器的三种刷新方式静态资源部署策略…

uniapp扭蛋机组件

做了一个uniapp的扭蛋机组件,可以前往下载地址下载 仅测试了vue2、3、h5页面微信小程序,理论支持全平台 使用方法简单,具有待机动效、抽奖中动效、掉落奖品动效,可以替换奖品图片,足以满足大部分抽奖页面需求。 示例图…

QT实战--QTreeWidget实现两种行颜色+QListWidget样式

本文主要介绍了QTreeWidget实现两种行颜色、点击打开父节点以及设置父子节点之间距离,同时附带介绍了QListWidget样式 树效果图: 列表效果图: 1.树样式的实现 1)使用代码: m_pLeftTreeWidget = new QTreeWidget(this);m_pLeftTreeWidget->setObjectName("suolue_t…

React - useActionState、useFormStatus与表单处理

参考文档:react18.3.1官方文档 一些概念: React 的 Canary 和 Experimental 频道是 React 团队用于发布和测试新功能的渠道。 useActionState useActionState 是一个可以根据某个表单动作的结果更新 state 的 Hook。 const [state, formAction, isPe…

Oracle之表空间迁移

问题背景:一个数据表随着时间的累积,导致所在表空间占用很高,里面历史数据可以清除,保留近2个月数据即可 首先通过delete删除了2个月以前的数据。 按网上的教程进行空间压缩,以下sql在表所在用户执行: -- 允许表重新…

如何在UI自动化测试中创建稳定的定位器?

如何在UI自动化测试中创建稳定的定位器? 前言1. 避免使用绝对路径2. 避免在定位器中使用索引3. 避免多个类名的定位器4. 避免动态和自动生成的ID5. 确保定位器唯一6. 处理隐藏元素的策略7. 谨慎使用基于文本的定位器8. 使用AI创建稳定的定位器 总结 前言 在自动化测…

从一条慢sql优化,深入探讨mysql的优化器优化机制

在某环境发现一个前端请求报错,经查为一条复杂的sql耗时约70s,最终导致前端响应超时。下面叙述下本次问题排查及根因分析过程,供其他同学参考。 本文中使用到的数据库是mariadb,对于mysql也是基本适用。 一,连接算法…