基于正则与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
相关产品推荐
相关产品推荐

