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

基于正则与spaCy规则匹配器提取法律引用的案件标题、卷号及页码

法律文档案件引用提取spaCy规则调整方案

原规则匹配失败的核心原因

  • 规则属性使用错误:IS_TITLE是布尔类型属性,用于判断词首字母是否大写,不可赋值为词性标记'NN';匹配实体标签需使用ENT_TYPE字段,而非label字段
  • 锚点匹配错误:法律引用中的连接词为带点的v.格式,原规则仅匹配小写v,无法命中目标
  • 规则覆盖范围不足:原规则仅匹配了当事人名称片段,未包含后续卷号、页码、括号包裹的年份/说明内容,无法获取完整引用
  • 冗余规则过多:未使用量词匹配不定长度的当事人名称,逐个写固定长度的规则既繁琐又容易遗漏场景
  • 基础代码错误:未导入spacy模块就调用spacy.load,且重复加载了语言模型,正则匹配部分还存在未定义contents变量的问题

调整后可运行的完整代码

import re
import spacy
nlp = spacy.load('en_core_web_sm')

from spacy.matcher import Matcher
m_tool = Matcher(nlp.vocab)

# 定义匹配规则:以v.为锚点,匹配前后的专有名词,直到右括号结束
case_pattern = [
    # 匹配原告方:1个及以上首字母大写的专有名词/缩写
    {'IS_TITLE': True, 'POS': {'IN': ['NNP', 'PROPN']}, 'OP': '+'},
    # 匹配连接词v.
    {'TEXT': 'v.'},
    # 匹配被告方:1个及以上首字母大写的专有名词/缩写
    {'IS_TITLE': True, 'POS': {'IN': ['NNP', 'PROPN']}, 'OP': '+'},
    # 匹配当事人后的逗号分隔符
    {'IS_PUNCT': True, 'TEXT': ','},
    # 匹配卷号、页码等中间内容
    {'OP': '*'},
    # 匹配右括号作为引用结束标记
    {'IS_PUNCT': True, 'TEXT': ')'}
]

m_tool.add('CASE_CITATION', [case_pattern])

# 读取文本
with open('text1.txt', 'r', encoding='utf-8') as f:
    text = f.read()
doc = nlp(text)

# 提取spaCy匹配结果
matches = m_tool(doc)
for match_id, start, end in matches:
    span = doc[start:end]
    # 替换换行符输出规整结果
    print(span.text.replace('\n', ' '))

# 修正后的正则匹配代码
matches = re.findall(r'(?:[A-Z]\w*\.? )+v\. .*?\)', text, re.DOTALL)
for match in matches:
    print(match.replace('\n', ' '))

匹配效果说明

调整后的规则可以完全命中你预期的4条引用结果:

  • "Brill v. Guardian Life Ins. Co. of America, 142 N.J. 520, 529 (1995)"
  • "Della v. Guard Lifal Ins. Co. of SA, 142 N.J. 420, 549 (2011)"
  • "Heljon Mgmt. Corp. v. DiLeo, 55 N.J. Super. 306, 312-13 (No Citations. This was extracted from NJ Sup..)"
  • "Ocean Cape Hotel Corp. v. Masefield Corp., 63 N.J. Super. 369, 383 (App. Div. 1960)"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:57:00