前言
一切都得从三天想法开始说起,一张带有部分信息需要填入的表格,当这些填过很多次的东西再一次的出现在我的面前,实在是填烦了。于是我打开了另一张的表格开始,ctrl c,ctrl v。但是这玩意容易烦。
填这干嘛,练字。。
这时我就想如果能将第二张上的信息迁移到第一张上面,那该有多好。我去写点真正需要新写进的内容就玩了呀。所以一点奇怪的想法就此诞生。
day 1
复现了两个ocr相关的程序E:\2024\下载文件scr2txt-master另一个在一点奇怪的想法——paddleocr复现使用-CSDN博客
有讲到,现阶段的作用不大,如果后期需要写软件可以参考,作为一个没有审美的人,更喜欢copy之后在改改能用就行,最后就是将paddleocr做了复现
在下午认识到了paddleocr识别的应用——ppstructure下的关键信息抽取
一点奇怪的想法——paddleocr识别的应用——ppstructure下的关键信息抽取-CSDN博客
当时就被这个图片一下震慑到了,就是这个,就是这个。
对要用到的工具确定后就开始了复现,确实在百度飞桨的平台里又很多好的想法和项目,在我觉得和无从下手的时候这个大佬给了我一点信心 我看完了他的1和5简历信息提取(五):用VI-LayoutXLM提升关键信息抽取效果 - 飞桨AI Studio星河社区 (baidu.com)
1提供的信息,5提供的行动力,在我的博客里讲到了用到的函数。
一点奇怪的想法——PDFPlumber和PP-Structure——大佬给予的灵感-CSDN博客
这个时关键信息提取后生成的图像,后面的时对关键信息提取后的一些需要的信息保存为infer.txt文件
那么在这里对第一张图片的处理就已经结束了 ,剩下的就是如何将第一张存在的信息放入第二张。
#关于一点为啥不直接用ocr+nlp----->很简单,不咋会。
我本以为第二张用同样的方式提取就好了,但是效果不佳,或者是没啥用
后面用上祖传手艺opencv的特征匹配,那就是瞎子画谱,乱来。
day 2
对第二张图开始新的尝试
一点奇怪的想法 ——ppstructure中关键信息的提取和表格识别的结合---->我以为的结束,其实是折磨的开始-CSDN博客n
在这个上面开启了鼓捣
框也还行,xlsx文件也还行,但是保存的信息我不咋知道怎么处理,所以就对predict_table.py中的大多参数进行输出,顺便研究下代码,然后就是,它是由两个画框体系构成的,有的是保存四个数,有的保存8个数,在对这些分别输出然后调用这两个去画图
因为要做区分所以重新定义了一下draw_rectangle---这个画红色框,draw_boxes----这个画蓝色框
if len(pred_res['cell_bbox']) > 0 and len(pred_res['cell_bbox'][
0]) == 4:
img = predict_strture.draw_rectangle(image_file,
pred_res['cell_bbox'])
else:
img = utility.draw_boxes(img, pred_res['cell_bbox'])
img_save_path = os.path.join(args.output, os.path.basename(image_file))
cv2.imwrite(img_save_path, img)
我在晚上对着这三张图看了半天,也不知道咋来的。代码还是的下点功夫
就在这种情况下我想到能否将信息直接填入word中,上代码
from docx import Document
# 加载Word文档
doc = Document('E:/2024/PaddleOCR-release-2.6/mytest/test2.docx')
table_data = {
"姓 名":"张三",
"出生年月":"20010101",
"联系电话":"1234567890",
"性别":"男", "民族":"汉",
"政治面貌":"群众",
"所在院校":"汉语言",
"年纪专业":"19级"}
# 获取文档中的第一个表格
table = doc.tables[0]
for row_index, row in enumerate(table.rows[1:], start=1): # 从第二行开始填充数据(假设第一行是标题行)
for key, value in table_data.items():
# 查找键对应的列标题
column_index = None
for cell_index, cell in enumerate(table.rows[0].cells): # 遍历标题行来找到列索引
if cell.text == key:
column_index = cell_index
break
# 如果找到了列标题,则填写数据到对应的单元格中
if column_index is not None:
cell = row.cells[column_index]
cell.text = value
else:
print(f"Column header '{key}' not found in the table. Skipping...")
doc.save('E:/2024/PaddleOCR-release-2.6/mytest/cesi2.docx')
不笑好吧,跑是能跑的。但是跑的结果------难绷。。。属于是小🔪拉屁眼,开眼了就写进去了一个,果然群众的力量是强大的
day3---today
使用ocr识别做测试,但用ocr对分散的文字,或者不在同一直线上,识别的效果很差,可能不,肯定加文字处理后的表格识别会更好一点
最后的方案是将infer文件中信息提取出来作为table_data = {
"姓 名":"张三",
"出生年月":"20010101",
"联系电话":"1234567890",
"性别":"男", "民族":"汉",
"政治面貌":"群众",
"所在院校":"汉语言",
"年纪专业":"19级"}
还有一些写过来,在表格识别中图片二会生成一个testas005.xlsx的表格文件,
将表格中的信息提取出来,与table_data进行对比写入
from openpyxl import load_workbook
import openpyxl
table_data = {
"姓名": "张三",
"出生年月": "20010101",
"联系电话": "1234567890",
"性别": "男",
"民族": "汉",
"政治面貌": "群众",
"所在院校": "汉语言",
"年纪专业": "19级"
}
# 加载现有的Excel文件
wb = load_workbook('E:/2024/PaddleOCR-release-2.6/mytest/output/testyu.xlsx')
ws = wb.active # 获取活动工作表
keys_list = list(table_data.keys())
values_list = list(table_data.values())
# ----->获取表格中的信息
location_info_dict = {} #--------> 将张三放到位置
def xlsx_to_set(ws):
cell_data = {}
for row in ws.iter_rows():
for cell in row:
# 跳过空单元格
if cell.value is not None:
# 获取单元格的行、列和值
row_idx = cell.row
col_idx = cell.column
value = cell.value
# 将单元格的值和位置以字典形式存储
# 使用行号和列号作为键,值作为值
cell_data[(row_idx, col_idx+1)] = value #------->往后一格
return cell_data
# print(cell_data)
# 遍历工作表中的单元格
def set_to_dict(table_data,cell_data):
global location_name_dict
location_name_dict = {}
for location, tag in cell_data.items():
for loc, name in table_data.items():
# print (location,tag)
# location, tag = (1,2):姓名
# loc, name ="姓名",“张三”
if loc== tag:
location_name_dict[location] =name
continue
# 从标签到名称的字典中获取名称
return location_name_dict
def dict_to_xlsx(ws,wb):
global location_name_dict
for coord, value in location_name_dict.items():
lo_row, lo_col = coord # 解包坐标
# print(row)
# print(coord)
# print(value)
if 1 <= lo_row <= ws.max_row and 1 <= lo_col <= ws.max_column:
ws.cell(row=lo_row, column=lo_col, value=value)
print (value)
key_word ="完了"
ws.cell(row= ws.max_row,column=ws.max_column, value=key_word)
else:
print(f"坐标({lo_row}, {lo_col})超出工作表边界,未写入数据。")
wb.save('E:/2024/PaddleOCR-release-2.6/mytest/output/testyu.xlsx')
if __name__ == '__main__':
# 打印结果
xlsx_to_set(ws)
# print (cell_data)
set_to_dict(table_data,xlsx_to_set(ws))
dict_to_xlsx(ws,wb)
# print (table_data.items())
# print (set_to_dict(table_data,xlsx_to_set(ws)))
#输出(2,2)张三
最后的结果就是写了五个进去了。
还是太垃圾了我。
over总结+规划
1 想法永远都是想法,只有做出来的才叫产品。多动手,多尝试。
2提高自己的信息收集能力,有些东西不是没有,只是自己找不到。Ai很好,但是你和他沟通的表述不对他就是个笨蛋。
3 pdf word,excel这三种的表格,今年吧争取在空闲时间做出来,不埋坑。
4 peddleocr C++进行一次复现
5 后面看看有没有相似的数据集,加一些自己的数据做些训练。
over
看到的朋友,好运。。。