裁判文书解析代码
文本解析的目标
上诉人: 陕西雄风新能源有限公司
上诉人: 晋能控股山西电力股份有限公司
被上诉人: 中铁十七局集团第一工程有限公司
介入结果的自定义标签
开发者可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。 虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率。 用法: jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
area: 地区(吴家窑乡)
areaend: 地区的结尾(**村)
address: 住址
birth: 出生
jianname: 以下简称
link: 连接关系的关键词(因与,对)
nation: 民族(汉族)
orgcode: 社会信用代码、注册号
other: 软件与服务
personcod: 身份证号码
hehuoorgan: 有限合伙
organ: 机构结尾词(**学校)
partorgan: 分公司分厂
standardorgan: 有限公司
judgement: 审判长
role: 一般角色
roledefendant: 被告
roleplaintiff: 原告
rolethird: 第三人
sintype: 案由
paddle模式词性和专名类别标签集合如下表,其中词性标签 24 个(小写字母),专名类别标签 4 个(大写字母)
标签 含义 标签 含义 标签 含义 标签 含义
n 普通名词 f 方位名词 s 处所名词 t 时间
nr 人名 ns 地名 nt 机构名 nw 作品名
nz 其他专名 v 普通动词 vd 动副词 vn 名动词
a 形容词 ad 副形词 an 名形词 d 副词
m 数量词 q 量词 r 代词 p 介词
c 连词 u 助词 xc 其他虚词 w 标点符号
PER 人名 LOC 地名 ORG 机构名 TIME 时间
init_cut()
TC: 字典树:识别每一段文本的大概内容,利于缩小切词分析范围 JBC: 结巴分词的初始化 ACTIONC:字典树:识别案由 --> CASE_RESION_TREE lac: 飞桨解析初始化 ORGANC: 字典树:识别机构
load_lexicon() --> load_province_code_lexicon/load_province_code_tree
字典树:识别机构的具体省份和地区码
court_name:陕西省高级人民法院
area_info:{'province_code': '610000', 'province': '陕西省'}
WenshuParser.structural_content
part1_list: 文书的审理法院、文书的类型、案号
part2_list: 涉及的的所有角色罗列
part3_list: 涉及的的主要角色案件概要
WenshuParser.get_parties
parse_result = OrgPerParser(line).parse_content()
cut_word_with_flag
[
'上诉人:roleplaintiff', '(:x', '原审被告:roledefendant', '):x', '::x', '陕西:area', '雄风:n', '新能源:n',
'有限公司:standardorgan', ',:x', '住所地:address', '陕西省:area', '榆林市:area', '定边县:area', '砖井镇:area', '西:f',
'高:a', '圈:q', '村:areaend', '。:x'
]
merge_same_flag:
[
'上诉人:roleplaintiff', '(:x', '原审被告:roledefendant', '):x', '::x', '陕西:area', '雄风:n', '新能源:n',
'有限公司:standardorgan', ',:x', '住所地:address', '陕西省榆林市定边县砖井镇:area', '西:f', '高:a', '圈:q', '村:areaend',
'。:x'
]
merge_bracket_part
[
'上诉人:roleplaintiff', '(原审被告):bracket,roledefendant,bracket', '::x', '陕西:area', '雄风:n', '新能源:n',
'有限公司:standardorgan', ',:x', '住所地:address', '陕西省榆林市定边县砖井镇:area', '西:f', '高:a', '圈:q', '村:areaend',
'。:x'
]
_merge_company_initial:(精彩的合并) tmp_word_list = [] 是合并结束的再次归零
[
'上诉人:roleplaintiff', '(原审被告):bracket,roledefendant,bracket', '::x', '陕西雄风新能源有限公司:ORG', ',:x',
'住所地:address', '陕西省榆林市定边县砖井镇:area', '西:f', '高:a', '圈:q', '村:areaend', '。:x'
]
备注:Lexical Analysis of Chinese,简称 LAC,是一个联合的词法分析模型,能整体性地完成中文分词、词性标注、专名识别任务。
在百度自建数据集上评测,LAC效果:Precision=88.0%,Recall=88.7%,F1-Score=88.4%。该PaddleHub Module支持预测
_merge_company_again
[
'上诉人:roleplaintiff', '(原审被告):bracket,roledefendant,bracket', '::x', '陕西雄风新能源有限公司:ORG', ',:x',
'住所地:address', '陕西省榆林市定边县砖井镇:area', '西:f', '高:a', '圈:q', '村:areaend', '。:x'
]
tag_aim_flag:
aim_flag = ["sintype", "link", "role", "roleplaintiff", "rolethird", "roledefendant", "ORG", "bracket"]
初次意外的标签不再需要,还原文本。
wenshu_parser.parse_person() 280:
利用飞桨对结巴自定义解析进行了补充
parse_result:
[
('上诉人', 'roleplaintiff'), ('(原审被告)', 'bracket,roledefendant,bracket'), ':', ('陕西雄风新能源有限公司', 'ORG'), ',',
'住所地陕西省榆林市定边县砖井镇西高圈村', '。'
]
WenshuParser.get_parties
CaseParser(case_content).get_parties(need_person=False)
代码与技术演进
项目所用的基本分词代码:
>>> jieba.posseg.cut(content, HMM=False)
>>> paddlehub.Module(name='lac').lexical_analysis(texts=texts, use_gpu=self.use_gpu) # 该接口将会在未来版本被废弃,请使用cut接口预测
项目可以升级的基本分词代码:
>>> jieba.enable_paddle() #启动paddle模式。 0.40版之后开始支持,早期版本不支持
>>> jieba.posseg.cut("我爱北京天安门",use_paddle=True) #paddle模式'
>>> cut(text, use_gpu=False, batch_size=1, return_tag=True)
>>> lexical_analysis(texts=[], data={}, use_gpu=False, batch_size=1, return_tag=True)
优点
1.结合分词工具进行二次开发,基本上达到了业务上的解析要求
2.将共性代码提取到wenshu_parse,并以类封装,可供其他业务借鉴。
缺点
1.二次开发应该以模型的方式单独成项,不断迭代优化
2.wenshu_parse内部的类应该单独成文件,并将每个字典树的应用单拎出来,利于其他人员单独使用某一个功能
3.jieba和飞桨的关系处理没有很好的结合,各自分裂。
4.跟随最新的发展框架和API
官方手册
https://www.paddlepaddle.org.cn/hub/scene/lexical
https://github.com/fxsjy/jieba