当前位置: 首页 > news >正文

pdf图片识别分类

文章目录

    • 解析pdf数据
    • ocr识别
    • 分类方法
      • 正则匹配
      • 词频统计
      • 分类模型
    • 分类完提示

解析pdf数据

试了几种方法
fitz-get_image后面方法不适用,用pixmap分辨率低
用pypdf2版本低方法用不了
用pdf2image还要下依赖工具
用spire.pdf的SaveAsImage分辨率低,ExtractImages可以但运行慢
先用spire.pdf的ExtractImages吧

from spire.pdf.common import ImageFormat
from spire.pdf import PdfDocument# 从PDF文档提取图片,PDF文档的路径,存放图片的文件夹路径
def extract_images_from_pdf(file_path, output_folder):# 创建PdfDocument类的实例doc = PdfDocument()# 加载PDF文档doc.LoadFromFile(file_path)# 创建list来存储提取的图片images = []# 遍历文档的页面for i in range(doc.Pages.Count):# 获取当前页page = doc.Pages.get_Item(i)# 从页面提取图片并存储到listfor img in page.ExtractImages():# print(img)images.append(img)# 将图片保存到指定文件夹for i, image in enumerate(images):image.Save(f"{output_folder}Image-{i+1}.jpg", ImageFormat.get_Jpeg())doc.Close()# 调用函数实现从PDF提取图片
file_path = "副本.pdf"
output_folder = "tup/"
extract_images_from_pdf(file_path, output_folder)

ocr识别

试验几种方法paddleocr umiocr cnocr 微信截图等
识别效果都差不多 最先进的也就这样了,就用cnocr 运行效率高 其他更慢
调了调一些参数,发现不调还好一些
cnocr也和opencv一样不支持中文路径,直接用PIL读取传对象给cnocr就可以

from cnocr import CnOcr # 识别
from PIL import Image
def ocr_cn(path): # 输入图片pathimg=Image.open(path)# print(img)r = ocr.ocr(img)t = []  # 文本for each in r:# print(each['text'])t.append(each['text'])# print(t)return t

分类方法

分类方法有基于规则、基于词频统计、nlp算法-朴素贝叶斯 textcnn什么的
一般数据量小就规则,一般数据量大也先用规则看看 一些能看到的共性可以直接提出来,剩下的再用AI学习

正则匹配

.所有 \d数字 \D非数字 \s空格 \S非空格 \w字母数字汉字下划线  \W非\w
*匹配0-无限次,+匹配1-无限次,?匹配0-1次,{n}匹配n次,{m,n}匹配m-n次
(19|20)  [1-9]
[^\d]  [^https://]  取非
'^www.*com$'  www开头com结尾
'[a-zA-Z0-9_]{4,20}@(163|126|qq|sina|yahoo)\.com' 邮件
'\d{3}-\d{8}|\d{4}-\d{7,8}' 电话号
re.match("<[a-zA-Z]+>(.*)</[a-zA-Z]+>", "<html>zzz</div>").group(1) 提取html内容
re.sub(r'[0-9]', '*', s)  # 把数字替换为*
re.sub(r'[0-9]+', "*", s) # 多个数字替换为1个*
re.sub(r'[^0-9]+', "*", s)# 匹配非数字提取年月
a,b,c='2023-1-12', '2024.2.23','24年1月'
d="(\d{2})[- /.]([1-9]|1[0-2])[- /.]"  # 日期中间4种分隔 - / . 空格
line=re.search(d,b)  # 匹配不到就是None,match是从第一个开始匹配
print(line) # <re.Match object; span=(2, 6), match='24.2'>
print(line.span())   # (2, 6)
print(line.group()) # 24.2.
print(line.group(1)) # 24 小括号是分组
print(line.group(2)) # 2  小括号是分组
print(re.findall(d,a)) # [('23','1')] 返回所有匹配结果,没匹配为空[]
print(re.split('[-年.]',line.group()))  # ['24', '2']

词频统计

worddict = {}
for i in words:print(i)if i in worddict:worddict[i] += 1else:worddict[i] = 1
print(worddict)
highest_key = max(worddict, key=worddict.get) if worddict!={} else None
print(highest_key)  # 输出: 分类
# 自定义分类
worddict = {'a':0,'b':0,'c':0}
if 'xxx' in worddict or 'xcc' in worddict:worddict['x'] += 1
highest_key = max(worddict, key=worddict.get) if max(worddict.values())!=0 else None
print(highest_key)  # 输出: 分类

分类模型


分类完提示

用Tkinter或pyqt做窗口提示和交互

## 分类完提示
import tkinter as tk
from tkinter import messagebox
root = tk.Tk()
root.withdraw()
messagebox.showinfo("提示", "程序运行完成!")
messagebox.showinfo("提示", "分类完成!"+'\n'+'分类成功 条'+'\n'+'分类失败 条')
http://www.lryc.cn/news/335056.html

相关文章:

  • 24双非考研哈尔滨工程大学计算机(@程程笔记)
  • IO流(2.其他流)
  • PyTorch之计算模型推理时间
  • layui后台框架,将左侧功能栏目 集中到一个页面,通过上面的tab切换 在iframe加载对应页面
  • 【网络原理】使用Java基于TCP搭建简单客户端与服务器通信
  • Hadoop生态系统主要是什么?
  • GlusterFS分布式文件系统
  • spark本地模拟多个task时如何启动多个Excutor
  • RocketMQ笔记(八)SpringBoot整合RocketMQ广播消费消息
  • Appium如何自动判断浏览器驱动
  • MVCC-多版本并发控制
  • c++找最高成绩
  • 前端saas化部署
  • [Java基础揉碎]Math类
  • MyBatis输入映射
  • 金三银四,程序员求职季
  • [react优化] 避免组件或数据多次渲染/计算
  • 「意」起出发 丨意大利OXO城市展厅盛大启幕,成都设计圈共襄盛举
  • 你不知道的JavaScript---深入理解 JavaScript 作用域
  • FPGA(Verilog)实现按键消抖
  • 第十二届蓝桥杯大赛软件赛省赛C/C++大学B组
  • 面了钉钉搜广增算法岗(暑期实习),秒挂。。。。
  • 前端实现流文件下载的完整指南
  • Kotlin:常用标准库函数(let、run、with、apply、also)
  • 雷军给年轻人的五点建议
  • Unity DOTS物理引擎的核心分析与详解
  • C++ //练习 12.4 在我们的check函数中,没有检查i是否大于0。为什么可以忽略这个检查?
  • 达梦备份与恢复
  • iOS App Store审核要求与Flutter应用的兼容性分析
  • javaScript常见对象方法总结