【python】基于深度学习的中英文文献PDF中参考文献提取

一、灵感

在看中英文文献的时候,有时候想要这篇文献的参考文献的情况,作为人类,很容易知道一遍文章的参考文献位于什么位置,每一条参考文献的具体内容。然而对于计算机来说,提取高质量的PDF内容并非易事。

其一,仅通过文字识别OCR的方式很难准确高质量的提取参考文献的,参考博客:【python实战】获取英文文献pdf中参考文献信息 - 简书

其二,不同的文献的布局方式不同,有的单栏,有的双栏,通过OCR方式提取的参考文献可能在这篇文献有效,而在另外一篇文献中可能就无法有效提取。

二、解决办法

既然通过传统方法行不通,那就采用人工智能的方法进行pdf的识别。

文本采用端到端的PDF解析工具MinerU:https://github.com/opendatalab/MinerU/blob/master/README_zh-CN.md

  • 布局检测:使用LayoutLMv3模型进行区域检测,如图像表格,标题,文本等;
  • 公式检测:使用YOLOv8进行公式检测,包含行内公式行间公式
  • 公式识别:使用UniMERNet进行公式识别;
  • 表格识别:使用StructEqTable进行表格识别;
  • 光学字符识别:使用PaddleOCR进行文本识别;

根据说明配置好Magic-PDF,有N卡的建议根据说明开启CUDA加速,开和不开提取时间差别蛮大的 ,命令行输入:

magic-pdf pdf-command --pdf "1.pdf" --inside_model true

1.pdf为我的pdf文件名,根据自己的进行修改,开启GPU加速后1分钟左右即可出结果,此时会自动生成一个文件夹:

打开layout.pdf ,可以看到文献的布局被正确识别,而且能够自动删去页眉页脚。

无论中英文文献、单栏还是双栏都能够被正确提取。 

Magic-PDF还有包括公式提取等功能,有兴趣的可以自行探索,本文用于提取参考文献内容,打开提取结果中的.md文件:

可以看到参考文献部分的布局、内容都是正确的,这是通过OCR方式很难做到的,接下来就是写一个函数从md中获取参考文献部分的内容了,主要思路如下:

  • 读取文件:首先,函数读取指定文件路径的内容,并将其按行存储为一个列表 markdown_text

  • 定义关键词:函数定义了三个关键词列表:

    • start_keywords: 包含可能标识参考文献部分开始的关键词,如 "References"、"参考文献" 等。
    • end_keywords: 包含可能标识参考文献部分结束的关键词,如 "Notes"、"附录" 等。
    • content_keywords: 包含可能标识目录部分的关键词,如 "目录"、"CONTENTS" 等。
  • 查找参考文献的起始位置

    • 首先检查文件中是否存在与 content_keywords 相关的目录关键词,如果存在,则从目录部分后的第50行开始查找参考文献的开始位置。
    • 如果找到了 content_keywords 中的目录关键词,则继续从该位置开始查找 start_keywords 中的关键词,以确定参考文献部分的开始。
    • 如果没有找到目录关键词或结论关键词,则直接在整个文本中查找 start_keywords 以确定参考文献部分的开始。
  • 查找参考文献的结束位置

    • 从确定的开始位置继续查找,直到找到 end_keywords 中的某个关键词,来确定参考文献部分的结束位置。
    • 如果没有找到结束关键词,则参考文献部分的结束位置被设置为文本的末尾。
  • 提取并清理参考文献内容

    • 提取从开始位置到结束位置之间的文本内容。
    • 对每一行内容进行清理,删除多余的空格,保留英文或数字字符之间的空格。
  • 过滤参考文献内容

    • 仅保留以 [ 或数字开头的行,这些行通常是参考文献的具体条目。
    • 最后将过滤后的内容返回。

 完整代码如下:

 def extract_references_content(self, file_path):
        """
        提取参考文献内容。
        """
        with open(file_path, 'r', encoding='utf-8') as file:
            markdown_text = file.readlines()

        start_keywords = ['References', 'REFERENCES', 'referenCes', '参考文献', 'R EFERENCES']
        end_keywords = ['Notes', '附录', '致谢', '注释', 'APPENDIX']
        content_keywords = ['目录', 'CONTENTS', 'C ONTENTS']
        start_pos = None
        end_pos = None

        # 检查目录或CONTENTS等关键词
        for idx, line in enumerate(markdown_text):
            if any(keyword in line for keyword in content_keywords):
                start_pos = min(idx + 50, len(markdown_text))
                break

        # 如果检查到了目录关键词,从目录后的第50行开始查找结论关键词
        if start_pos is not None:
            for idx in range(start_pos, len(markdown_text)):
                if any(keyword in markdown_text[idx] for keyword in start_keywords):
                    start_pos = idx + 1
                    break

        # 如果没有找到目录关键词或结论关键词,则查找参考文献关键词
        if start_pos is None:
            for idx, line in enumerate(markdown_text):
                if any(keyword in line for keyword in start_keywords):
                    start_pos = idx + 1
                    break

        # 查找结束关键词
        if start_pos is not None:
            for idx in range(start_pos, len(markdown_text)):
                if any(keyword in markdown_text[idx] for keyword in end_keywords):
                    end_pos = idx
                    break
            if end_pos is None:
                end_pos = len(markdown_text)

            references_content = ''.join(markdown_text[start_pos:end_pos]).strip()
        else:
            references_content = ""

        def clean_line(line):
            line = line.lstrip()
            new_line = []
            for i in range(len(line)):
                if line[i] == ' ':
                    if (i > 0 and i < len(line) - 1 and
                            re.match(r'[a-zA-Z0-9]', line[i - 1]) and
                            re.match(r'[a-zA-Z0-9]', line[i + 1])):
                        new_line.append(' ')
                    else:
                        continue
                else:
                    new_line.append(line[i])
            return ''.join(new_line)

        references_content = '\n'.join(clean_line(line) for line in references_content.split('\n'))

        filtered_lines = []
        for line in references_content.split('\n'):
            if line.startswith('[') or (line and line[0].isdigit()):
                filtered_lines.append(line)
        references_content = '\n'.join(filtered_lines)
        return references_content

<think>好的,我现在需要帮用户解决如何高效进行英文文献阅读以及推荐相关工具的问题。首先,用户可能是在学术研究或者学习中遇到困难,尤其是面对大量英文文献时,阅读效率低下,理解有障碍。他们可能希望得到一些实用的方法和工具来提高阅读速度和理解能力。 我应该先分解问题,用户的需求分为两个部分:方法和工具。对于方法部分,需要涵盖阅读策略、技巧以及可能的练习方式。而工具部分则需要推荐一些实用的软件或在线工具,帮助用户更好地处理文献。 首先,关于方法,可能需要提到预读和扫读技巧,比如先浏览摘要、引言和结论,抓住主要观点。然后,主动阅读,做笔记和总结,使用标记和注释。另外,积累学术词汇和常见表达也很重要,特别是高频词汇。定期练习和复习也是不可少的,比如每天设定阅读目标,使用间隔重复法巩固知识。 接下来是工具推荐。翻译工具如DeepL和谷歌翻译,可以辅助理解复杂句子。PDF阅读器如Adobe Acrobat和Foxit PDF Editor,支持注释和高亮。文献管理工具如Zotero和Mendeley,帮助整理和做笔记。术语库工具比如Academic Phrasebank和Linggle,提供学术表达参考。还有文本转语音工具NaturalReader,适合听觉学习者。 需要注意用户可能的不同需求,比如有的更关注速度,有的更关注理解深度。还要确保推荐的工具是当前流行且评价较高的,避免过时或不好用的工具。另外,是否需要提到浏览器插件,比如沙拉查词这样的划词翻译工具?可能有用,可以加入。 在整合信息时,要分点列出方法和工具,每个部分用清晰的标题,方法部分分步骤,工具部分分类别。同时,按照用户的要求,避免使用第一人称和步骤词汇,每个方法或工具之间换行,保持结构清晰。 最后,生成相关问题时要基于用户的原问题和回答内容,比如如何选择适合自己的工具,如何快速提取文献重点,学术写作相关的资源等。这些问题需要具体且有针对性,帮助用户进一步解决可能遇到的后续问题。 现在需要检查是否符合所有要求,特别是格式方面,比如代码和公式的格式(虽然这里可能用不上),相关问题的标题和格式是否正确。确保没有使用Markdown,用纯文本,正确换行和标号。还要避免引用堆砌在末尾,所有引用内容整合到回答中。例如提到某个工具时直接说明,而不是在最后列出来源。</think>针对英文文献阅读效率提升,综合网络检索结果整理以下方法及工具推荐: **方法论实践** 预读文献结构快速定位核心内容 浏览摘要、引言和结论部分,标记研究问题、假设和主要结论。图表数据作为重点突破对象,通过标题和注释快速理解数据呈现逻辑 建立个人术语库与学术表达模板 创建Excel表格或使用Anki记忆卡,记录高频学科术语及其应用场景。收集文献中常用句式如"This study demonstrates..."、"The results indicate...",分类整理至文档模板 分层精读与批判性思考 第一遍速读标注关键段落,第二遍精读时针对方法论和数据分析部分绘制思维导图。使用SQ3R阅读法(Survey, Question, Read, Recite, Review)建立主动阅读模式 **工具生态链** 翻译辅助组合: ```python # 浏览器插件自动翻译 import webbrowser webbrowser.open('https://www.deepl.com/translator') ``` 推荐Deepl学术版(每月5.99美元)配合浏览器插件Immersive Translate,实现段落级对照翻译。沙拉查词插件支持PDF划词翻译与术语高亮 文献管理矩阵: - Zotero(免费开源)配合Zotfile插件实现PDF自动重命名与云同步 - ReadCube Papers(年费$35)提供增强型PDF阅读界面与智能引文推荐 语义解析工具: Connected Papers(https://www.connectedpapers.com)生成文献关联图谱,ResearchRabbit(https://www.researchrabbit.ai)通过AI推荐相关文献 **效率公式** 阅读速度提升模型:$$T = \frac{N}{(WPM \times C)} + S$$ 其中$T$为总耗时,$N$为单词总量,$WPM$为每分钟阅读词数,$C$为理解系数(0.6-1.0),$S$为笔记整理时间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值