如何从Pandas DataFrame文本中匹配双词表并提取冒号分隔的配对结果
实现方案
核心逻辑
- 先预编译两个词表的正则表达式,避免重复编译提升效率,可添加单词边界避免子串误匹配
- 复用你已完成的spaCy分句结果,逐句分别匹配两个词表的所有命中元素
- 按最大长度对齐两个词表的命中结果,生成对应配对,空值位置保留冒号空位
- 所有配对结果用逗号拼接后存入DataFrame新列
完整可运行代码
import pandas as pd import re import spacy # 1. 初始化spacy分句器,如果你已经完成分句可跳过这部分 nlp = spacy.load("en_core_web_sm", disable=["ner", "tagger", "parser"]) nlp.add_pipe('sentencizer') # 2. 预编译正则匹配规则,可根据需求调整是否忽略大小写、是否加单词边界 ANATOMY_PATTERN = r'\b(oesophagus|stomach|duodenum)\b' EVENT_PATTERN = r'\b(clip|RFA|balloon|biopsy)\b' anatomy_re = re.compile(ANATOMY_PATTERN, flags=re.IGNORECASE) event_re = re.compile(EVENT_PATTERN, flags=re.IGNORECASE) # 3. 单条文本处理函数 def match_term_pairs(text): doc = nlp(text) pairs = [] for sent in doc.sents: sent_content = sent.text # 提取当前句所有命中的解剖词、事件词 hit_anatomies = [m.group(1).lower() for m in anatomy_re.finditer(sent_content)] hit_events = [m.group(1).lower() for m in event_re.finditer(sent_content)] # 对齐长度生成配对 max_length = max(len(hit_anatomies), len(hit_events)) for idx in range(max_length): anatomy = hit_anatomies[idx] if idx < len(hit_anatomies) else "" event = hit_events[idx] if idx < len(hit_events) else "" pairs.append(f"{anatomy}:{event}") return ",".join(pairs) # 4. 批量处理DataFrame的文本列 # 替换为你的DataFrame名称、文本列名称 df['pair_result'] = df['your_text_column'].apply(match_term_pairs)
常见问题修复
你之前正则运行失败大概率是以下原因:
- 没有逐句处理,导致跨句的两个词被误判定为同句配对
- 没有同时提取两个词表的匹配结果,仅处理了单个词表
- 未做长度对齐逻辑,无法生成带空位的配对结果
测试验证
拿示例文本测试:
输入文本:"The patient had oesophagus clip placement, then biopsy was performed. Stomach balloon was used, duodenum was checked without operation."
输出结果:oesophagus:clip,:biopsy,stomach:balloon,duodenum:,符合需求要求。
内容的提问来源于stack exchange,提问作者Sebastian Zeki
相关产品推荐
相关产品推荐

