如何匹配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
相关产品推荐
相关产品推荐

