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

如何匹配PDF提取的名词与XML子节点并输出对应信息

问题场景与代码问题

我已经实现了从PDF指定段落提取名词并保存的代码,同时有一个包含相关名词的XML文件(带根节点和子节点)。但尝试编写匹配提取名词与XML对应项、输出名词及其所属子节点的代码时,未得到预期结果。


PDF名词提取代码

! pip install -U textblob
! python -m textblob.download_corpora
! pip install pdfplumber

# 导入所需库
import pdfplumber
from textblob import TextBlob

# 打开PDF文件并创建对象
pdf = pdfplumber.open("Sample_Medical_Report.pdf")
# 获取总页数
numPages = len(pdf.pages)
# 遍历每页,提取文本保存到文件
for number, pageText in enumerate(pdf.pages):
    with open('output.txt', 'w') as f:
        print(pageText.extract_text(), file=f)

# 提取以"Diagnosis"开头到下一个"Diagnosis"之间的文本块
buff = []
i = 1
with open('output.txt', "r") as f:
    for line in f:
        if line.startswith("Diagnosis"):
            # 仅当缓冲区非空时写入文件(避免第一个Diagnosis时写入空内容)
            if buff:
                output = open(f'file{i}.txt', 'w')
                output.write(''.join(buff))
                output.close()
                i += 1
                buff = []  # 重置缓冲区
        if line.strip():
            buff.append(line)

# 写入最后一段文本
if buff:
    output = open(f'file{i}.txt', 'w')
    output.write(''.join(buff))
    output.close()

# 从提取的文本文件中提取名词短语
blob = TextBlob(open("file2.txt").read())
for nouns in blob.noun_phrases:
    with open('output1.txt', 'a') as f:
        f.write(nouns + '\n')

XML匹配代码(未得到预期结果)

import xml.tree.ElementTree as ET
import csv

# 加载XML文件
tree = ET.parse('hospital.xml')
root = tree.getroot()

# 加载提取的名词列表
with open('output1.txt', 'r') as f:
    nouns = f.read().splitlines()

# 创建CSV文件保存输出
with open('file_name.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)

    # 遍历每个名词
    for noun in nouns:
        # 查找包含该名词的disease节点
        child_root = root.find(f'disease[@name="{noun}"]')

        # 如果找到节点,获取对应的clinic值
        if child_root is not None:
            clinic_name = child_root.find('clinic').text
        else:
            clinic_name = None

        # 将结果写入CSV
        writer.writerow([noun, clinic_name])

常见问题排查与修正方向

1. XML节点路径与属性匹配问题

  • 确认XML结构是否符合预期:比如根节点下的子节点是否确实是<disease name="XXX">,而非嵌套在其他节点下(比如<diseases><disease>...</disease></diseases>)。如果是嵌套结构,需要调整find路径,比如root.find('.//disease[@name="{noun}"]')(使用.递归查找所有子节点)。
  • 检查属性名是否正确:XML中的属性是否是name,还是其他如disease_name?

2. 字符串匹配精度问题

TextBlob提取的名词短语可能存在大小写、空格、复数形式等差异,导致严格匹配失败,可修改为预处理后匹配:

# 修正后的匹配逻辑:统一转小写、去除首尾空格
for noun in nouns:
    # 预处理名词:转小写、去首尾空格
    processed_noun = noun.strip().lower()
    clinic_name = None
    # 递归查找所有disease节点,匹配时同样预处理属性值
    for disease in root.findall('.//disease'):
        disease_name = disease.get('name').strip().lower()
        if processed_noun == disease_name:
            clinic_name = disease.find('clinic').text
            break
    writer.writerow([noun, clinic_name])

3. PDF文本提取问题

原PDF提取代码中,循环里用open('output.txt', 'w')会每次覆盖文件,最终只保留最后一页的文本。应改为一次性合并所有页面文本:

# 修正PDF文本提取逻辑,避免覆盖
with open('output.txt', 'w') as f:
    for page in pdf.pages:
        text = page.extract_text()
        if text:
            f.write(text + '\n')

4. 名词提取准确性问题

TextBlob的noun_phrases可能提取到无关短语,或者拆分了完整的疾病名称。可以:

  • 手动过滤提取的名词列表,去除无关项
  • 调整TextBlob的提取逻辑,或改用更专业的医学名词提取工具

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 10:03:21