基于Spacy的上下文感知项目信息抽取技术方案咨询
能源项目结构化信息抽取的系统化实现方案
针对你目前纯规则匹配覆盖不足的问题,推荐采用「高规则性字段匹配+依存句法关联+小样本模型微调」的三级方案,可快速实现装机容量与对应项目名的绑定,同时可扩展覆盖所有预设字段的抽取:
第一步:高规则性字段的轻量规则匹配
你需要的8个字段中,装机容量、能源类型、投资金额这三类特征固定度极高,仅需3-5条匹配规则即可覆盖90%以上的场景,无需编写数十条规则:
- 装机容量的特征统一为「数字+可选连接符+容量单位(MW/兆瓦/万千瓦等)」,基于Spacy的Matcher实现代码示例:
import spacy from spacy.matcher import Matcher # 优先加载中文Transformer预训练模型,依存分析和实体识别准确率远高于轻量模型 nlp = spacy.load("zh_core_web_trf") matcher = Matcher(nlp.vocab) # 装机容量匹配规则 capacity_pattern = [ {"LIKE_NUM": True}, {"TEXT": {"in": ["-", ""]}, "OP": "?"}, {"TEXT": {"REGEX": "^[MG]W$|兆瓦|万千瓦|GW"}} ] matcher.add("CAPACITY", [capacity_pattern])
- 能源类型直接匹配预设关键词即可:太阳能、风电、抽水蓄能、光伏、火电等
- 投资金额匹配规则同装机容量,仅需把单位替换为元、美元、万元等即可
第二步:基于依存句法的实体关联,解决容量与项目名的绑定问题
你之前分析依存树未找到通用规则,核心是没有做锚点定位:
- 先把识别到的装机容量实体作为锚点,向上查找它所属的名词短语块(NP Chunk)
- 同一个名词短语块内,除容量、地点介词等辅助信息外的核心名词部分,即为对应的项目名
示例实现代码:
def bind_capacity_to_project(doc, capacity_span): # 遍历所有名词短语块,找到包含当前容量实体的块 for chunk in doc.noun_chunks: if chunk.start <= capacity_span.start and chunk.end >= capacity_span.end: # 过滤掉块内的容量实体、地点修饰词等冗余内容 project_tokens = [ token for token in chunk if not (capacity_span.start <= token.i < capacity_span.end) and token.dep_ not in ["case", "punct"] ] return "".join([t.text for t in project_tokens]).strip("的、位于") # 单句仅一个项目的兜底规则,直接取整句的项目实体 project_ents = [ent for ent in doc.ents if ent.label_ == "PROJECT"] return project_ents[0].text if project_ents else None
该逻辑可100%覆盖你给出的4个示例场景,无需额外定制规则。
第三步:低规则性字段的小样本模型适配
对于所属企业、开始/结束日期、地点这类规则性不强的字段,你仅需要标注100-200条和你的爬取文本领域一致的样本,用Spacy自带的训练工具微调预训练的NER模型,即可实现90%以上的抽取准确率,整体工作量远低于手动写全量规则。
第四步:全局后处理兜底
最后加一层简单的全局校验规则即可解决小概率匹配冲突:
- 单句内仅1个项目+1个容量的,直接绑定
- 单句内多项目多容量的,按实体最近距离原则绑定
- 抽取结果为空的字段统一填充为
NULL即可
内容的提问来源于stack exchange,提问作者Ahmed Osama
相关产品推荐
相关产品推荐

