提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
本文的目的是做一个深度学习模型,可以对PDF论文、期刊(现只限英文)进行总结。在科研和生活中,假如需要长期关注某个课题组的论文;或者有大量的文献,一篇篇的去看又太耗费时间,那么可以使用这个模型,让模型对大量的论文进行初步的总结,再从中有侧重的挑取自己感兴趣或者研究方向相符的论文进行精读。
本文的相关代码和思路来自于github上的chatpaper,只不过chatpaper是将pdf的读取内容通过ChatGPT的api传递给ChatGPT,让gpt来进行总结,假如我们没有gpt账户,或者账户下没有余额,或者觉得成本过高,可以使用huggingface上开源的模型,即博主使用的这个方法。
一、PDF如何读取
这是一个比较复杂的问题,如果想要准确的对一篇文章进行一个总结,那么对文章的“摘要”部分的提取就要相对精准一些。但是文章PDF的内容和排版是不同的,不同期刊使用的格式也是千差万别。仅使用一种方法很难对“摘要”部分进行准确的提取。比如:
文章出自nature communition。这类文章没有明确的标注“Abstract”和“Introduction”,但是我们人自己去读,一眼就能知道第一段是文章的摘要部分。但是通过相关的api去读取,怎么用一个通用的方法去读就是一个问题。
再比如:
文章出自IEEE。这类文章有相关描述性的文字,告知读者这部分的内容是什么,那么提取的难度就会小一些。
二、具体的PDF读取方法
1.通过fitz库读取PDF标题
本方法是通过chatpaper的源码学习到的思路。即是对PDF进行分块处理。通过读取相关的关键字来将论文所需要内容提取出来。
首先是
def chat_paper_main(args):
# 创建一个Reader对象,并调用show_info方法
if args.sort == 'Relevance':
sort = arxiv.SortCriterion.Relevance
elif args.sort == 'LastUpdatedDate':
sort = arxiv.SortCriterion.LastUpdatedDate
else:
sort = arxiv.SortCriterion.Relevance
这里因为我们不需要使用ChatGPT的API因此我将reader对象部分就删去了。
if args.pdf_path:
# 开始判断是路径还是文件:
paper_list = []
if args.pdf_path.endswith(".pdf"):
paper_list.append(Paper(path=args.pdf_path))
else:
for root, dirs, files in os.walk(args.pdf_path):
print("root:", root, "dirs:", dirs, 'files:', files) # 当前目录路径
for filename in files:
# 如果找到PDF文件,则将其复制到目标文件夹中
if filename.endswith(".pdf"):
paper_list.append(Paper(path=os.path.join(root, filename)))
print("------------------paper_num: {}------------------".format(len(paper_list)))
首先是根据传入的参数是否是一个pdf文件,因为这个项目是允许传入单独的pdf,或者是总结一个文件夹下所有的pdf。因此这段代码得逻辑就非常好理解了,判断args参数的结尾字符是不是pdf,如果不是,那说明用户给的是一个文件夹路径,则读取文件夹下所有结尾是pdf的文件,并使用Paper类来处理这些文件,显然这个Paper类就是处理PDF数据的关键了。
class Paper:
def __init__(self, path, title='', url='', abs='', authers=[]):
# 初始化函数,根据pdf路径初始化Paper对象
self.url = url # 文章链接
self.path = path # pdf路径
self.section_names = [] # 段落标题
self.section_texts = {
} # 段落内容
self.abs = abs
self.title_page = 0