首页 > 解决方案 > 提取文档中法律引用的算法

问题描述

我想训练一个机器学习模型来学习和提取文本文档中的法律引用模式。我可以使用的最佳算法是什么?我的法律引用训练数据样本集看起来像,

    sample set: 
    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)

引文训练样本是使用正则表达式代码从文档中提取的,

r'(?:[A-Z]\w*\.? )+v\. .*?\d{4}\)'

我已经尝试过 spaCy 实体匹配,但这不起作用(我敢打赌我的代码并不完美)。我的代码

import re
import en_core_web_sm
nlp = en_core_web_sm.load()

nlp = spacy.load('en_core_web_sm')

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

doc = open(file='text1.txt', mode='r', encoding='utf-8').read()
#print(text)

doc = nlp(doc)
#print([(ent.text, ent.label_) for ent in doc.ents])


p1 = [{'IS_TITLE': 'NN'}, {'LOWER': 'v'}, {'IS_PUNCT': True}, {'IS_TITLE': 'NN'}]
p2 = [{'IS_TITLE': 'NN'}, {'IS_TITLE': 'NN'}, {'LOWER': 'v'}, {'IS_PUNCT': True}, 
{'IS_TITLE': 'NN'}]
p3 = [{'IS_TITLE': 'NN'}, {'LOWER': 'v'}, {'IS_PUNCT': True}, {'IS_TITLE': 'NN'}, 
{'IS_TITLE': 'NN'},]
p4 = [{'IS_TITLE': 'NN'}, {'IS_TITLE': 'NN'}, {'LOWER': 'v'}, {'IS_PUNCT': True}, 
{'IS_TITLE': 'NN'}, {'IS_TITLE': 'NN'}]
p5 = [{'IS_TITLE': 'NN'}, {'IS_TITLE': 'NN'}, {'IS_TITLE': 'NN'}, {'LOWER': 'v'}, 
{'IS_PUNCT': True}, {'IS_TITLE': 'NN'}, {'IS_TITLE': 'NN'}, {'IS_TITLE': 'NN'}]
p6 = [{'IS_TITLE': 'NN'}, {'IS_TITLE': 'NN'}, {'LOWER': 'v'}, {'IS_PUNCT': True}, 
{'IS_TITLE': 'NN'}, {'IS_TITLE': 'NN'}, {'IS_TITLE': 'NN'}]
p7 = [{'IS_TITLE': 'NN'}, {'LOWER': 'v'}, {'IS_PUNCT': True}, {'IS_TITLE': 'NN'}, 
{'IS_TITLE': 'NN'}, {'IS_TITLE': 'NN'}]
p8 = [{'IS_TITLE': 'NN'}, {'IS_TITLE': 'NN'}, {'IS_TITLE': 'NN'}, {'LOWER': 'v'}, 
{'IS_PUNCT': True}, {'IS_TITLE': 'NN'}]
p9 = [{'IS_TITLE': 'NN'}, {'IS_TITLE': 'NN'}, {'IS_TITLE': 'NN'}, {'LOWER': 'v'}, 
{'IS_PUNCT': True}, {'IS_TITLE': 'NN'}, {'IS_TITLE': 'NN'}]
p10 = [{'label': 'PERSON'}]
P11 = [{'label': 'ORG'}, {'label': 'PERSON'}]
p12 = [{'label': 'PERSON'}, {'label': 'ORG'}]
p13 = [{'label': 'ORG'}, {'label': 'ORG'}, {'label': 'ORG'}, {'label': 'ORG'}]

m_tool.add('QBF', None, p1, p2, p3, p4, p5, p6, p6, p7, p8, p9, p10, p11, p12, p13)

phrase_matches = m_tool(doc)
print(phrase_matches)

标签: pythonregexnlpspacyspacy-3

解决方案


菲利普,我会着眼于分类,为您提供一种更强大的提取方法,超出您从模式匹配中获得的方法。我真的很喜欢 Prodigy(创建 spaCy 的爆炸的一部分)现在支持的流程,用于开发主动学习流程以支持数据提取经常需要的持续改进。

  • 构建模式规则并将这些规则与 Sense2Vec 一起使用来生成一组良好的工作模式/注释。
  • 使用模式规则生成模型,该模型可用于学习所提供模式的上下文。
  • 使用 prodigy(或 core spaCy)创建额外的标签并更新模型结果以微调和优化提取。

使用 NLTK 的附加地址示例:这与您的情况类似。 https://onethinglab.com/2018/03/05/extracting-addresses-from-text/

模式和正则表达式对于您的用例来说不够健壮。


推荐阅读