基于Python的学术论文核心文本提取与过滤方法咨询
学术论文核心文本提取与过滤方案
针对你需要提取学术论文核心正文、生成干净TXT供语言模型使用的需求,以下是实用的过滤方法,以及优化后的代码实现:
一、核心过滤方法
1. 格式维度筛选(字号、位置、字体)
- 字号过滤:学术论文正文字号通常稳定在10-12pt,标题、脚注、图表标注字号差异明显。可以用PyMuPDF提取文本时附带字体元数据,过滤掉不符合字号范围的内容。
- 区域过滤:正文集中在页面中间区域,页眉、页脚、侧边栏内容可通过页面坐标范围排除(比如只保留页面垂直方向20%-80%的内容)。
- 字体过滤:正文多采用标准衬线/无衬线字体(如Times New Roman、Arial),加粗、特殊字体的内容大概率是标题或标注,可针对性排除。
2. 文本规则过滤
- 正则清除冗余:用正则表达式匹配并移除邮箱、网址、表格标记:
- 邮箱:
r'[\w\.-]+@[\w\.-]+' - 网址:
r'https?://\S+' - 表格相关:
r'(\|.*\|)+'(匹配带竖线的表格行)
- 邮箱:
- 段落长度过滤:过滤掉长度小于15字符的零散文本(比如孤立的数字、图表编号)。
- 结构关键词定位:利用学术论文固定结构(摘要、引言、方法、结果、讨论)的关键词,锁定核心段落,排除参考文献、致谢、附录等非正文部分。
3. NLP工具辅助过滤
- Spacy实体识别:用Spacy识别“表X”“图X”等实体,删除其前后的说明文本;同时可通过分句功能,过滤掉不符合正文语义的短句子。
- 语义分类:用预训练的文本分类模型(比如基于BERT的轻量模型)区分正文段落和非正文内容,适合批量处理大量论文。
4. 专业工具简化流程
- Grobid:专门面向学术论文的解析工具,能自动识别并提取正文、标题、参考文献等结构,直接输出干净的正文文本,无需手动写过滤逻辑。
- PyMuPDF:相比PyPDFLoader,能提取更精准的文本格式信息,是格式筛选的首选工具。
二、优化后的代码实现
以下代码集成了正则过滤、段落长度过滤,并用PyMuPDF替代原工具,提升提取精度:
import glob import os import re import fitz # PyMuPDF # 配置路径 文件夹路径 = "C:/Users/faenkaya/Desktop/Language Models/documents/Scientific Data eng" 输出文件路径 = "C:/Users/faenkaya/Desktop/Language Models/documents/Scientific Data eng/纯净正文.txt" # 正则匹配规则 正则规则 = [ (r'https?://\S+', ''), # 移除网址 (r'[\w\.-]+@[\w\.-]+', ''), # 移除邮箱 (r'(\|.*\|)+', ''), # 移除表格行 (r'\s+', ' ') # 替换多个空白为单个空格 ] def 过滤文本(原始文本): # 应用正则规则 for 模式, 替换内容 in 正则规则: 原始文本 = re.sub(模式, 替换内容, 原始文本) # 按段落分割,过滤短段落 段落列表 = [段落.strip() for 段落 in 原始文本.split('\n') if len(段落.strip()) > 15] return '\n'.join(段落列表) def 提取PDF正文(pdf路径): 文档 = fitz.open(pdf路径) 正文内容 = "" for 页码 in range(文档.page_count): 页面 = 文档.load_page(页码) # 若要加字号过滤,可遍历页面的文本块:for block in page.get_text("dict")["blocks"]: 页面文本 = 页面.get_text() 正文内容 += 页面文本 + '\n' 文档.close() return 过滤文本(正文内容) # 批量处理并写入文件 with open(输出文件路径, "w", encoding="utf-8") as 输出文件: for pdf文件路径 in glob.glob(os.path.join(文件夹路径, "*.pdf")): print(f"处理文件: {pdf文件路径}") 纯净正文 = 提取PDF正文(pdf文件路径) 输出文件.write(纯净正文 + '\n\n')
三、进阶优化建议
- 如果需要更精准的格式过滤,可以在
提取PDF正文函数中遍历页面的文本块,通过block["fontsize"]判断是否为正文字号,只保留符合条件的文本块内容。 - 对于结构化强的论文,可以用关键词匹配定位正文起始(比如“摘要”“Abstract”)和结束(比如“参考文献”“References”)的位置,截取中间内容。
内容的提问来源于stack exchange,提问作者Enes Kayacan
相关产品推荐
相关产品推荐

