- AI 应用
- 大模型
- 人工智能
【免费下载链接】ChatPaper
Use ChatGPT to summarize the arXiv papers. 全流程加速科研,利用chatgpt进行论文全文总结+专业翻译+润色+审稿+审稿回复
本篇技术指南以仓库内 scipdf_parser-master/README.md 为骨架,结合其源码,系统讲解 ChatPaper 项目中的科学论文 PDF 解析组件 SciPDF Parser:如何安装依赖、启动 GROBID 服务、调用parse_pdf_to_dict/parse_pdf/parse_figures三个核心 API,并深入剖析其底层实现与在 ChatPaper「任意 PDF 全文翻译」流程中的实际调用链。读完本文,你将掌握从 PDF 到结构化字典、再到喂给 ChatGPT 进行翻译/总结的完整技术方案。
一、SciPDF Parser 是什么:ChatPaper 的"论文理解前哨"
ChatPaper 的定位是"用 ChatGPT 总结 arXiv 论文,全流程加速科研",覆盖论文全文总结、专业翻译、润色、审稿与审稿回复。而这一切的起点,是把一份二进制 PDF 变成机器可读的结构化文本——这正是 SciPDF Parser 的职责。
SciPDF Parser 是一个基于 GROBID 的 Python 科学 PDF 解析器。GROBID(GeneRation Of BIbliographic Data)是一个成熟的学术文档结构化抽取引擎,负责把论文的版式信息(作者、标题、摘要、章节、参考文献、图表、公式)还原为 TEI XML;SciPDF Parser 则在其上做了一层 Python 封装,将 XML 进一步转换为易于下游程序消费的 Python 字典。仓库中scipdf_parser-master/setup.py的keywords字段("PDF parser","GROBID","Python PDF parser")与描述 "Python parser for scientific PDF based on GROBID" 准确概括了它的技术定位。
从源码结构看(scipdf_parser-master/scipdf/pdf/parse_pdf.py),整个包分为两个子模块:pdf(负责 GROBID 调用与结构化解析)和features(负责文本统计特征抽取),二者统一通过 scipdf_parser-master/scipdf/init.py 导出,__all__ = ["pdf", "features"]。
二、安装:从 pip 安装到依赖模型
2.1 标准安装方式
按 README 说明,从仓库安装(当前scipdf包的版本号为0.1dev,见 setup.py 的version字段):
pip install git+https://github.com/titipata/scipdf_parser需要注意的是,setup.py中声明的核心运行依赖是install_requires=['lxml', 'requests', 'spacy', 'pandas', 'textstat'],其中lxml用于解析 GROBID 返回的 XML,requests用于与 GROBID 服务通信,spacy与textstat服务于文本统计特征模块。
2.2 必须额外下载的 spaCy 模型
README 特别强调,还需要为 spaCy 下载en_core_web_sm英文小模型,否则 text_utils.py 第 9 行的nlp = spacy.load("en_core_web_sm")在模块导入时就会失败:
python -m spacy download en_core_web_sm仓库根目录的 requirements.txt 中已经锁定了spacy==3.5.3以及对应的en-core-web-sm3.5.0 版本依赖,可直接沿用。
2.3 Java 运行环境(被 README 隐含、但 ChatPaper 教程显式要求的依赖)
SciPDF Parser 本身是纯 Python,但两个关键环节依赖 JVM:GROBID 服务端是 Java 项目,图解析工具 pdffigures2 也是 Java 打包(scipdf_parser-master/scipdf/pdf/pdffigures2/pdffigures2-assembly-0.0.12-SNAPSHOT.jar)。ChatPaper 主仓库 README.md 的"任意 PDF 全文翻译配置教程"显式给出了 Java 安装步骤(适用于 Ubuntu/MacOS):
sudo apt-get update sudo apt-get install openjdk-11-jdk java -version # 确认 Java 版本教程推荐 OpenJDK 11(如 11.0.19),这是运行 GROBID 与 pdffigures2 的前提条件。
三、启动 GROBID 服务:解析一切的前提
3.1 serve_grobid.sh 做了什么
README 给出的第一步是运行 serve_grobid.sh:
bash serve_grobid.sh打开该脚本可以看到它只做了两件事:
- 按需下载 GROBID:脚本顶部声明
declare -r GROBID_VERSION="0.6.2"(注释明确提示"or change to current stable version",即可通过修改这个版本号来测试新版 GROBID),若本地不存在grobid-0.6.2目录,则用wget下载官方 zip 包并解压; - 启动服务:
cd grobid-${GROBID_VERSION} && ./gradlew run,默认监听8070 端口。
由于./gradlew run会占用终端,ChatPaper 主仓库 README.md 的教程提供了两种实际部署方式:
# 方式一:保持前台运行(服务启动后可新开终端继续操作) bash serve_grobid.sh # 方式二:后台守护进程运行 nohup bash serve_grobid.sh仓库根目录的 start.sh 也采用了nohup后台启动方式。若使用 Docker 部署,Dockerfile 会先设置WORKDIR /app/scipdf_parser-master再安装该目录下的依赖,确保解析组件在容器内可用。
3.2 服务端点的源码级确认
在 parse_pdf.py 中,与 GROBID 的通信地址硬编码为:
GROBID_URL = "http://localhost:8070"当fulltext=True时请求%s/api/processFulltextDocument,否则请求%s/api/processHeaderDocument(仅解析头部信息)。这意味着只要本地 8070 端口上有 GROBID 服务,parse_pdf_to_dict就能工作;同时它也支持通过grobid_url参数切换为 GROBID 官方云服务https://cloud.science-miner.com/grobid/,这是文档与源码双重确认的合法用法。
四、核心 API 之一:parse_pdf_to_dict 与结构化输出
4.1 基本调用
README 给出的最典型用法:
import scipdf article_dict = scipdf.parse_pdf_to_dict('example_data/futoma2017improved.pdf') # 本地 PDF article_dict = scipdf.parse_pdf_to_dict('https://www.biorxiv.org/.../463760.full.pdf', as_list=False) # 直接解析 URL两点需要结合源码说明:
- URL 输入有严格校验。
parse_pdf内部先调用validate_url()(parse_pdf.py 第 26-39 行)判断输入是否为合法 http/https 链接,且op.splitext(pdf_path)[-1].lower() == ".pdf",若 URL 不以.pdf结尾会打印 "The input URL has to end with.pdf" 并返回None; - 输入还支持 bytes。除字符串路径外,
parse_pdf接受 PDF 字节串直接 POST 给 GROBID(第 102-104 行),这在需要自行下载 PDF 再解析的场景中很有用; - 仓库当前版本并未包含 README 中提到的
example_data目录与示例 PDF(futoma2017improved.pdf),读者可用自己的本地 PDF 或任一以.pdf结尾的在线论文链接替代。
4.2 完整输出字典结构(原样继承自 README)
{ 'title': 'Proceedings of Machine Learning for Healthcare', 'abstract': '...', 'sections': [ {'heading': '...', 'text': '...'}, {'heading': '...', 'text': '...'}, ... ], 'references': [ {'title': '...', 'year': '...', 'journal': '...', 'author': '...'}, ... ], 'figures': [ {'figure_label': '...', 'figure_type': '...', 'figure_id': '...', 'figure_caption': '...', 'figure_data': '...'}, ... ], 'doi': '...' }4.3 输出字典的源码级扩展说明
对照convert_article_soup_to_dict(parse_pdf.py 第 315-366 行),实际返回的字典字段比 README 列出的更丰富,共 9 个键:
| 字段 | 来源函数 | 说明 |
|---|---|---|
title | 直接解析 | 取 TEI 中type="main"的 title 节点 |
authors | parse_authors | 由 forename/middle/surname 拼接,分号分隔 |
pub_date | parse_date | 取publicationStmt中 date 节点的when属性 |
abstract | parse_abstract | 遍历 abstract 下所有段落文本拼接 |
sections | parse_sections | 每节含heading、text,以及源码额外加入的n_publication_ref(本节约稿引用数)与n_figure_ref(本节约图引用数),由calculate_number_of_references统计 |
references | parse_references | 每条含title、journal(无期刊时回退到publisher)、year、authors |
figures | parse_figure_caption | 每条含figure_label、figure_type(figure/table)、figure_id、figure_caption、figure_data(表格时为表格文本) |
formulas | parse_formulas | 公式的formula_id、formula_text、formula_coordinates(坐标转 float 列表) |
doi | 直接解析 | 取type="DOI"的 idno 节点 |
也就是说,README 中展示的结构是"简化示意",真实输出还包含作者、发表时间、公式坐标与每节引用计数等额外字段,这在二次开发(如生成论文综述、统计引用密度)时都是现成的特征。
4.4 参数说明(源自函数签名与 docstring)
parse_pdf_to_dict与底层parse_pdf共享以下关键参数:
fulltext: bool = True:是否解析全文;设为False只解析论文头部(对应 GROBID 的processHeaderDocument端点);soup: bool = True:内部以 BeautifulSoup 对象传递(parse_pdf_to_dict固定为 True,parse_pdf可切换为返回原始 XML 文本);as_list: bool = False:为True时sections中每个text由"整段拼接字符串"变为"段落字符串列表",便于按段落粒度做翻译或摘要切分;return_coordinates: bool = True:是否向 GROBID 请求坐标信息,对应请求表单中的 5 个teiCoordinates字段(persName、figure、ref、formula、biblStruct);grobid_url: str = GROBID_URL:GROBID 服务地址,默认http://localhost:8070。
五、核心 API 之二:parse_pdf 返回原生 XML
当需要绕过结构化转换、直接拿原始标注结果时,README 给出了:
xml = scipdf.parse_pdf('example_data/futoma2017improved.pdf', soup=True)parse_pdf返回两种形态:soup=False时返回 GROBID 返回的 TEI XML 文本;soup=True时用BeautifulSoup(parsed_article, "lxml")包装为可遍历对象。它是parse_pdf_to_dict的底层基础——后者拿到 soup 后再经convert_article_soup_to_dict完成字段抽取。需要自定义解析规则(比如抽取参考文献的 DOI、抽取脚注)时,直接使用parse_pdf(soup=True)更为灵活。
六、核心 API 之三:parse_figures 用 pdffigures2 提取图表
README 中图解析用法:
scipdf.parse_figures('example_data', output_folder='figures') # 文件夹内只能放 PDFparse_figures(parse_pdf.py 第 404-455 行)的实现在底层调用了 AllenAI 的pdffigures2工具,仓库已内置其打包产物scipdf_parser-master/scipdf/pdf/pdffigures2/pdffigures2-assembly-0.0.12-SNAPSHOT.jar(setup.py中通过package_data保证该 jar 随包分发)。执行流程:
- 自动创建
output_folder/data(解析出的图表元数据 JSON)与output_folder/figures(裁剪出的图片)两个子目录; - 通过
subprocess.run执行java -jar <jar_path> <pdf_folder> -i <resolution> -d <data_path> -m <figure_path>; - 输出目录结构为
output_folder/data/与output_folder/figures/。
函数签名中的默认参数值得注意:resolution: int = 300(输出图片分辨率 DPI)、jar_path默认指向内置 jar、output_folder: str = "figures"。该功能强依赖 Java 环境,与 2.3 节的 Java 安装要求直接对应。
七、深入底层:GROBID 通信与请求构造细节
为了更透彻地理解该组件,我们可以拆解parse_pdf的请求链路(parse_pdf.py 第 42-110 行):
if fulltext: url = "%s/api/processFulltextDocument" % grobid_url else: url = "%s/api/processHeaderDocument" % grobid_url files = [] if return_coordinates: files += [ ("teiCoordinates", (None, "persName")), ("teiCoordinates", (None, "figure")), ("teiCoordinates", (None, "ref")), ("teiCoordinates", (None, "formula")), ("teiCoordinates", (None, "biblStruct")), ]随后根据输入类型(URL / 本地文件 / bytes)分别构造requests.post(url, files={"input": ...}),将 PDF 内容作为 multipart 表单字段input上传。因此整个解析链路是:
PDF (本地路径 / .pdf 结尾的 URL / bytes) → 校验输入类型 (validate_url / os.path.exists) → HTTP POST 到 GROBID 的 processFulltextDocument 或 processHeaderDocument 端点 → 返回 TEI XML(可选附带坐标标注) → BeautifulSoup(lxml) 解析 → convert_article_soup_to_dict 抽取 9 类结构化字段八、features 模块:解析结果之上的统计特征
scipdf_parser-master/scipdf/features/text_utils.py 是 README 未展开、但属于scipdf包官方导出能力(from scipdf.features.text_utils import *)的配套模块,提供四类文本统计工具:
compute_readability_stats(text):基于textstat计算 13 项可读性指标,如flesch_reading_ease、smog、flesch_kincaid_grade、coleman_liau_index、automated_readability_index、dale_chall、difficult_words、gunning_fog、n_syllable等;compute_text_stats(text):基于 spaCy 抽取词性分布(pos/pos_tag)、词形(word_shape)、词数、句数、动词数、数字占比、平均句长等;compute_journal_features(article):直接消费第 4.3 节的结构化字典,统计引用总数、唯一期刊数、引用年份的均值/中位数/最小/最大(年份被过滤在 1800-2100 范围内以剔除异常值);merge_section_list(section_list):利用内置的SECTIONS_MAPS字典(含INTRODUCTION→Introduction、MATERIALS AND METHODS→Methods、RESULTS→Results等 20 余条映射)把自由格式的章节标题归一化为标准章节名,可用于跨论文的章节对齐分析。
该模块暗示了 SciPDF Parser 的设计意图:它不仅服务于"读 PDF",还能为论文质量的自动评估(如摘要可读性、引用规范度)提供特征输入。
九、在 ChatPaper 中的实际应用:任意 PDF 全文翻译链路
SciPDF Parser 在 ChatPaper 中并非孤立组件,而是"PDF 翻译/总结"流水线的第一环。主仓库 README.md 的"任意 PDF 全文翻译配置教程"给出了完整落地步骤(适用于 Ubuntu/MacOS,以 Ubuntu 18.04/20.04 为例):
- 安装 ChatPaper 默认依赖并激活虚拟环境;
- 进入
scipdf_parser-master目录,安装该目录下 requirements.txt 中的依赖(含lxml、beautifulsoup4、spacy、PyMuPDF、openai、tenacity、tiktoken等); - 安装 Java 环境(OpenJDK 11,
sudo apt-get install openjdk-11-jdk,java -version验证); - 启动 GROBID 服务:
bash serve_grobid.sh(或nohup bash serve_grobid.sh后台运行); - 新开终端运行
python chat_summary.py(README 原文标注,对应翻译/总结入口脚本)。
代码层面的调用证据在 chat_translate.py 中清晰可见。其parse_pdf(path)函数直接复用本文第 4 节的 API:
import scipdf def parse_pdf(path): try: pdf = scipdf.parse_pdf_to_dict(path, as_list=False) pdf['authors'] = pdf['authors'].split('; ') pdf['section_names'] = [it['heading'] for it in pdf['sections']] pdf['section_texts'] = [it['text'] for it in pdf['sections']] except Exception as e: print("parse_pdf_to_dict(path:", e) return pdf随后main()依次执行"领域判断(chat_check_domain)→ 标题翻译 → 摘要翻译 → 逐章节翻译",并在写 Markdown 时用正则([^\\n])##([^\\n]{1,18}\W+)修正标题换行格式。整个过程消耗的 token 会被累计并打印。这就是 ChatPaper「输入一篇 PDF,输出一份双语 Markdown」的核心链路:
本地/在线 PDF → GROBID 服务(8070) → scipdf.parse_pdf_to_dict() → 标题+摘要定领域 → ChatGPT 逐节翻译/总结 → 生成 .md 文件十、常见问题与使用注意事项
- GROBID 未启动:
parse_pdf_to_dict会因连接localhost:8070失败而异常,务必先执行bash serve_grobid.sh并等待服务就绪(首次运行需要下载 GROBID 0.6.2 与大量依赖,耗时较长); - spaCy 模型缺失:导入
scipdf包即触发spacy.load("en_core_web_sm"),未下载模型会直接报错,需先执行python -m spacy download en_core_web_sm; - URL 必须以 .pdf 结尾:
validate_url会拒绝不带.pdf后缀的在线链接,返回None; - 解析不了时检查输入类型:
parse_pdf对非字符串、非 bytes、且op.exists为 False 的输入一律返回None,parse_pdf_to_dict随之返回None,调用方需自行判空(ChatPaper 的parse_pdf已用 try/except 包裹); - 换 GROBID 版本:修改 serve_grobid.sh 顶部的
GROBID_VERSION常量即可测试新版解析效果; - 图解析强依赖 Java:
parse_figures需要可用的java命令,且输入目录内应只放 PDF 文件,输出会写入output_folder/data与output_folder/figures两个子目录; - 解析失败可降级为只解析头部:将
fulltext=False传给parse_pdf_to_dict可仅请求头部端点,作为快速元数据提取方案。
结语
SciPDF Parser 是 ChatPaper 科研自动化流水线的地基:GROBID 负责"读懂版式",parse_pdf.py负责"抽出结构",text_utils.py负责"量化文本",最终由chat_translate.py把结构化论文交给 ChatGPT 完成翻译、总结与审稿。无论你是想复现 ChatPaper 的整条翻译链路,还是需要为自己的科研工具链接入一个可靠的 PDF 结构化解析组件,本文覆盖的安装步骤、三个核心 API、输出字典字段与源码调用关系,都可以直接作为上手与二次开发的依据。进一步的实现细节,可继续阅读 parse_pdf.py、serve_grobid.sh 与 text_utils.py 的完整源码。
- AI 应用
- 大模型
- 人工智能
【免费下载链接】ChatPaper
Use ChatGPT to summarize the arXiv papers. 全流程加速科研,利用chatgpt进行论文全文总结+专业翻译+润色+审稿+审稿回复
相关推荐
YouTube.js Parser 命名空间深度解析:InnerTube 响应解析引擎的 API 全景与源码级原理
YouTube.js Parser 命名空间深度解析:InnerTube 响应解析引擎的 API 全景与源码级原理 导读 本文围绕 YouTube.js 中 P
后端AWX 开源项目全解析:基于 Ansible 的 Web UI、REST API 与任务引擎
AWX 开源项目全解析:基于 Ansible 的 Web UI、REST API 与任务引擎 AWX 是构建在 Ansible 之上的开源自动化管理平台,为 R
后端运维任务调度CC Switch Codex 接 Claude 模型实战:Anthropic Messages 上游本地路由详解
CC Switch Codex 接 Claude 模型实战:Anthropic Messages 上游本地路由详解 本篇指南面向 CC Switch 3.17.
后端前端企业应用运维网络安全
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考