python科研向论文检索篇——提取PDF文字以供全文信息检索

本文介绍如何使用Python库pdfplumber从PDF文件中提取文本,实现本地论文全文检索,以提高科研效率。通过实例展示了工具安装、基本用法及一个实际操作流程,包括关键词输入、检索模式选择和结果保存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python科研向论文检索篇——提取PDF文字以供全文信息检索

作者:ruierx

项目背景

写论文期间,下载了很多论文,但是很多读过一次就忘记了,隐约有印象在某篇论文里见过一个现象,但就是想不起来在哪里看的,这个时候如果有一个本地可以根据关键词检索所有论文全文的工具就好了。刚好,嘿嘿,咱会python,那就干吧!

流程图

流程图

工具包安装

本文使用pdfplumber实现PDF文件的文本提取,注意此包无法识别扫描生成的图片PDF。
安装 ------ pip install pdfplumber
另外为了复制拷贝文件方便,引入了python自带包shutil。

pdfplumber基本用法
import pdfplumber

with pdfplumber.open("path/to/file.pdf") as pdf:
    first_page = pdf.pages[0]
    print(first_page.chars[0])

pdfpliumber.open()用于打开pdf文件,此时该PDF文件生成一个类,可以使用它的属性调用它的内容,比如:

.pages为每个页面组成的列表,可用列表的方式调用每一页pdf,每一页又是一个.page的类,有属性.page_number表示页码,.width/.height表示页宽和页高等
一些常用的方法有:
page.extract_text()------提取页面中的文本,存储为一个字符串。
page.extract_words()------返回所有的单词及相关信息
page.extract_tables()------提取页面的表格

加亿点点细节
import pdfplumber
import shutil
from os import listdir, chdir, getcwd, system, path, mkdir

chdir("./1/")
raw_list = listdir()
print('文件总数:', len(raw_list))

while 1:
    keyword = input("请输入搜索关键字:").strip()
    insure = input("y/n")
    if insure == 'y':
        break

while 1:
    print("请选择检索模式:")
    print("1. 重新检索")
    print("2. 继续上次的检索")
    print("3. 将上次检索的结果存至关键词文件夹")
    choice = input("--->").strip()
    if choice == '1':
        filelist = listdir()
        with open("process.txt", 'w') as pro:
            pro.truncate()
        break
    elif choice == '2':
        with open("../process.txt", 'r') as pro:
            filelist = pro.read().strip().split('\n')
            for f in filelist:
                raw_list.remove(f)
        filelist = raw_list
        break
    elif choice == '3':
        with open("../process.txt", 'r') as pro:
            filelist = pro.read().strip().split('\n')
            for f in filelist:
                raw_list.remove(f)
        filelist = raw_list

        isExists = path.exists(f'../{keyword}')
        if not isExists:
            mkdir(f'../{keyword}')
        for file in filelist:
            shutil.copyfile(file, f'../{keyword}/{file}')
        system("pause")
        exit(f"{keyword}--相关文件已存储至相应文件夹!")
    else:
        print('输入错误,重新输入!')

print("剩余文件数:", len(filelist))

n = 0
ns = len(filelist)
for file in filelist:
    n += 1
    print(f"正在检索({n}/{ns})中是否含有{keyword}------>" + file)
    with pdfplumber.open(file) as pdf:
        # firstpage = pdf.pages[0]
        # print(type(firstpage.extract_text()))
        sign = 0
        for page in pdf.pages:
            text = page.extract_text()
            if keyword in text:
                with open("../result.txt", 'a+') as res:
                    res.write(keyword + '--->\n' + file +
                              '----->页数:' + str(page.page_number) + '\n\n')
                print(keyword + '--->\n' + file +
                      '----->页数:' + str(page.page_number) + '\n\n')
                sign = 1
                break
    if sign == 0:
        with open("../process.txt", 'a+') as pro:
            pro.write(file + '\n')
        print("无相关信息!")

system("pause")

管你看没看懂,干就完事了!
哈哈哈,开玩笑啦,以后有时间补充一下细节吧,最近实在太忙了,毕业再说啦!

参考资料

pdfplumber ·PyPI

### 设计一个用于教师确认年度及聘期教学工作量系统的原型图 为了实现一个高效的系统来帮助教师确认其年度及聘期的教学工作量,可以考虑以下几个方面: #### 功能模块划分 1. **登录身份验证** 教师可以通过唯一的工号或邮箱地址进行登录认证[^1]。此功能确保只有授权人员能够访问敏感数据。 2. **个人信息管理** 提供界面让教师更新他们的基本信息,如联系方式、所属院系等。这有助于保持记录的准确性并便于后续通知发送。 3. **教学活动录入** 创建表单允许教师输入不同类型的教育活动详情,比如课程名称、授课对象(本科/硕士),以及具体的课时数量等信息。这些字段应支持批量导入导出操作以便于大规模处理。 4. **自动计算机制** 基于预设的标准公式(例如每节课对应多少标准学时),系统会自动生成每位老师的总教学当量学时数,并显示给用户查看。 5. **审核流程集成** 设置多级审批过程,在提交之后由相关部门负责人逐层审查所填写的内容是否属实合理。一旦批准,则正式计入该名教职员工的工作档案之中。 6. **反馈渠道建立** 开通在线留言板或者邮件提醒服务,方便师生之间就任何疑问展开交流沟通而不必依赖第三方通讯工具像钉钉那样单独发消息。 7. **报表生成功能** 定义多种格式选项可供下载打印最终版本的结果文件,满足不同场合下的需求展示要求。 以下是基于上述描述的一个简单Python脚本示例,它模拟了一个基本的数据收集和初步核算逻辑: ```python class TeacherWorkloadSystem: def __init__(self, teacher_id): self.teacher_id = teacher_id self.activities = [] def add_activity(self, activity_type, hours_spent): """Add a new teaching activity.""" self.activities.append({"type": activity_type, "hours": hours_spent}) def calculate_workload(self): """Calculate total workload based on predefined standards.""" standard_hours_per_class = 10 # Example value; adjust as needed. total_standard_hours = sum([act["hours"] * (standard_hours_per_class / act["hours"]) for act in self.activities]) return round(total_standard_hours) # Usage example teacher_system = TeacherWorkloadSystem("TCH123") teacher_system.add_activity("Undergraduate Lecture", 40) teacher_system.add_activity("Graduate Seminar", 20) print(f"Total Workload: {teacher_system.calculate_workload()} Standard Hours.") ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值