You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python从无固定模板PDF中提取投资策略板块文本?

从无固定模板PDF中提取投资策略板块的Python方案

推荐的Python工具库

针对你遇到的无统一模板、板块位置不固定的问题,以下几个库能帮到你:

  • PyMuPDF(fitz):相比pdfminer,它的文本提取效率更高,还能获取文本的布局元数据(如字体大小、加粗状态、位置坐标)。可以通过识别标题的格式特征(比如更大字号、加粗)来定位投资策略板块的起始点。
  • spaCy:成熟的NLP库,支持文本分类、语义匹配。你可以用它训练一个简单的分类模型,识别属于投资策略的文本块,即使板块标题有变体(比如"Investment Approach")也能精准匹配。
  • Hugging Face Transformers:借助预训练语言模型(如BERT)进行语义理解,能更好地处理模糊的板块边界和标题变体,适合复杂文档的内容提取。
  • pdfplumber:专注于PDF文本的精准提取,能细致获取每个文本元素的位置、字体等信息,方便基于格式特征筛选标题和内容。

优化现有代码的方向

你当前的代码仅完成了PDF转文本的基础工作,缺少板块提取的核心逻辑。可以从以下几点优化:

  1. 定位板块标题:

    • 利用PDF的格式信息,遍历文本块时筛选出符合标题特征(字号大、加粗)的内容,再用正则匹配"Investment Strategy"及其变体(如r"Investment (Strategy|Approach|Philosophy)",忽略大小写)。
    • 对于无明显格式的文档,直接用正则扫描全文,找到目标标题的位置。
  2. 提取板块内容:

    • 找到标题后,继续收集后续文本,直到遇到下一个同级别标题(通过格式或语义判断),或者出现明显的板块结束标志(如"Risk Factors"这类常见的后续板块标题)。
  3. 语义校验:

    • 用spaCy或Transformers对提取的内容进行校验,确保提取的文本确实属于投资策略范畴,过滤掉误匹配的内容。

基于PyMuPDF的示例代码

import fitz
import re

def extract_investment_strategy(pdf_path):
    doc = fitz.open(pdf_path)
    strategy_content = []
    in_target_section = False
    # 根据实际文档调整标题的字体阈值(示例:字号>=14且加粗)
    min_title_size = 14
    # 匹配投资策略相关标题的正则
    title_regex = re.compile(r"Investment (Strategy|Approach|Philosophy|Objective)", re.IGNORECASE)
    
    for page in doc:
        # 获取页面的文本块字典
        text_blocks = page.get_text("dict")["blocks"]
        for block in text_blocks:
            if "lines" not in block:
                continue
            for line in block["lines"]:
                for span in line["spans"]:
                    # 检查是否是目标标题
                    if span["size"] >= min_title_size and (span["flags"] & 2):  # flags&2表示文本加粗
                        if title_regex.search(span["text"]):
                            in_target_section = True
                            strategy_content.append(span["text"].strip())
                        else:
                            # 遇到其他同级标题,结束当前板块提取
                            if in_target_section:
                                in_target_section = False
                    # 收集目标板块内的文本
                    if in_target_section:
                        strategy_content.append(span["text"].strip())
    return "\n".join(strategy_content)

# 使用示例
strategy_text = extract_investment_strategy("sample_offer.pdf")
print(strategy_text)

关键提示

  • 不同文档的格式差异较大,需要根据实际样本调整字体大小、加粗判断等参数。
  • 对于格式不规范的文档,优先考虑NLP语义匹配的方法,用已标注的投资策略文本训练模型,提升提取准确率。
  • 可以结合正则和NLP的优势:先用正则快速定位候选区域,再用NLP验证内容有效性,平衡效率和准确性。

内容的提问来源于stack exchange,提问作者Ujwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:14:53