『Re』知识工程作业_主体识别
作业要求
环境路径
类似于这样的,一共50篇文档,
均为中文文档,是法院判决书的合集。
程序
程序如下,我完全使用正则表达式来实现功能,
import re
import glob
import copy name_list = glob.glob('./*.txt') date_totul = []
indictee_totul = []
court_totul = []
procuratorate_totul = []
with open('./result.txt','a',encoding='utf-8') as f_r:
for name in name_list:
f_r.write('<{0}>\n\n'.format(name.split('\\')[-1]))
with open(name,encoding='utf-8') as f:
lines = f.read() # 时间匹配
#xxxx年xx月xx日;同年xx月xx日;xxxx年xx月x旬;xxxx年xx月底;xxxx年xx月;xx月xxx日
# |优先匹配前面的,无符合才匹配后面的
pattern_t = re.compile(
'[0-9〇一二三四五六七八九]{4}年.{1,2}月.{1,3}日'
'|同年.{1,2}月.{1,3}日'
'|[0-9〇一二三四五六七八九]{4}年.{1,2}月.{1}旬'
'|[0-9〇一二三四五六七八九]{4}年.{1,2}月底'
'|[0-9〇一二三四五六七八九]{4}年.{1,2}月'
'|[0-9〇一二三四五六七八九十]{1,2}月.{1,3}日')
date_step = [date for date in pattern_t.findall(lines)]
# print(date_step)
for i in date_step:
f_r.write('<time>{0}</time>\n\n'.format(i))
date_totul.extend(date_step) # 被告匹配
pattern_i = re.compile('被告人(.{2,4}?)[,,]|被上诉人:(.+?)。|被执行人:(.+?)。')
pattern_i2 = re.compile('被申诉人\(.+\):(.+)。|被申请人\(.+\):(.+)。')
defendant = list(set([item[0] for item in re.findall(pattern_i,lines) + pattern_i2.findall(lines) if '死刑' not in item[0]])) if defendant != [] and defendant != ['']:
print(defendant) # indictee_totul.append(indictee_step)
for item in defendant:
f_r.write('<defendant>{0}</defendant>\n\n'.format(item)) # 法院匹配
pattern_c = re.compile('[\n。,,《;](.{,15}?人民法院)')
_court_list = [name.group(1) for name in pattern_c.finditer(lines)]
_court_step = []
# print(_court_list)
for _court in _court_list:
_court_step.append(_court.split('。')[-1]
.split(',')[-1]
.split('《')[-1]
.split('、')[-1]
.split(';')[-1])
_court_step = list(set(_court_step))
for court_name in _court_step:
if '由' in court_name or\
'向' in court_name or \
'受' in court_name or \
'和' in court_name:
# print(name)
_court_step.append(court_name.split('由')[-1].
split('向')[-1].
split('受')[-1].
split('和')[-1])
_court_step.remove(court_name)
# print(_court_step)
if '不服' in court_name or \
'后被' in court_name or \
'报请' in court_name or \
'书证' in court_name or \
'核准' in court_name or \
'指令' in court_name or \
'维持' in court_name or \
'撤销' in court_name or \
'参照' in court_name:
_court_step.append(copy.deepcopy(court_name[2::]))
_court_step.remove(court_name) _court_step = list(set(_court_step))
if '人民法院' in _court_step:
_court_step.remove('人民法院') for i in _court_step:
f_r.write('<court>{0}</court>\n\n'.format(i))
# print(name,_court_step) # 检察院匹配
pattern_p = re.compile('审理(.+)指控')
procuratorate_step = list(set([name.group(1) for name in pattern_p.finditer(lines)]))
procuratorate_totul.extend(procuratorate_step)
# print(name,procuratorate_step)
for i in procuratorate_step:
f_r.write('<procuratorate>{0}</procuratorate>\n\n'.format(i)) # 地点匹配
pattern_pl_1 = re.compile('(.{2}省.+?县)')
pattern_pl_2 = re.compile('.{2}省.{2}市')
pattern_pl_3 = re.compile('.{2}省.+?自治州')
pattern_pl_4 = re.compile('.{2}省.+?乡')
pattern_pl_5 = re.compile('.{2}市.{2}区')
pattern_pl_6 = re.compile('.{2}市.{2}镇')
pattern_pl_7 = re.compile('.{2}市.+?开发区')
place_step = list(set([name.group(0) for name in pattern_pl_1.finditer(lines)]))
place_step.extend(list(set([name.group(0) for name in pattern_pl_2.finditer(lines)])))
place_step.extend(list(set([name.group(0) for name in pattern_pl_3.finditer(lines)])))
place_step.extend(list(set([name.group(0) for name in pattern_pl_4.finditer(lines)])))
place_step.extend(list(set([name.group(0) for name in pattern_pl_5.finditer(lines)])))
place_step.extend(list(set([name.group(0) for name in pattern_pl_6.finditer(lines)])))
place_step.extend(list(set([name.group(0) for name in pattern_pl_7.finditer(lines)])))
place_step_n = []
for place_name in place_step:
if len(place_name)<=15:
# print(name,place_name)
place_step_n.append(place_name)
if '××' in place_name:
if place_name in place_step_n:
place_step_n.append(place_name.split('××')[0])
place_step_n.remove(place_name)
if 'XX' in place_name:
if place_name in place_step_n:
place_step_n.append(place_name.split('XX')[0])
place_step_n.remove(place_name)
# print(name, [(len(item)) for item in place_step_n])
# print(name,place_step,len(place_step))
# print(name,place_step_n,len(place_step_n))
for i in place_step_n:
f_r.write('<location>{0}</location>\n\n'.format(i))
f_r.write('</{0}>\n\n'.format(name.split('\\')[-1]))
截取结果文档中某一文件的结果贴出来,展示如下,
<11273.txt> <time>1991年7月3日</time> <time>2008年8月7日</time> <time>2008年9月16日</time> <time>2009年3月18日</time> <time>2011年2月6日</time> <time>2012年2月2日</time> <time>2013年3月28日</time> <time>2013年6月14日</time> <time>2014年4月14日</time> <time>2014年10月27日</time> <time>2013年5月8日</time> <time>5月10日</time> <time>二〇一五年二月二十七日</time> <defendant>杨飞程</defendant> <court>云南省丽江市中级人民法院</court> <court>云南省高级人民法院</court> <court>最高人民法院</court> <procuratorate>丽江市人民检察院</procuratorate> <location>云南省丽江市</location> <location>云南省大理市</location> <location>丽江市古城区</location> <location>大理市</location> </11273.txt>
re总结
这次使用了不少这则表达式,虽然不怎么高深,不过还是略有心得,特此总结一下。
这里给出一个比较完备的正则表达式介绍,但是自己的使用还是有一些自己的理解重点,所以这篇文章还要继续233
几个基础函数
- re.compile(pattern, flags=0)
-
将正则表达式模式编译成一个正则表达式对象,它可以用于匹配使用它的match ()和search ()等方法。
实际有两种使用方式:
pattern.匹配方法(string) 或者 re.匹配方法(pattern,string)
使用或|来强化匹配规则:
pattern_t = re.compile(
'[0-9〇一二三四五六七八九]{4}年.{1,2}月.{1,3}日'
'|同年.{1,2}月.{1,3}日'
'|[0-9〇一二三四五六七八九]{4}年.{1,2}月.{1}旬'
'|[0-9〇一二三四五六七八九]{4}年.{1,2}月底'
'|[0-9〇一二三四五六七八九]{4}年.{1,2}月'
'|[0-9〇一二三四五六七八九十]{1,2}月.{1,3}日')
- re.findall(pattern, string, flags=0)
-
返回字符串
- re.finditer(pattern, string, flags=0)
-
返回一个迭代器符合
正则表达式迭代器对象
之所以单提出来,是因为迭代器在匹配组groups的时候真的好用,
pattern_c = re.compile('[\n。,,《;](.{,15}?人民法院)')
_court_list = [name.group(1) for name in pattern_c.finditer(lines)]
group(1)表示匹配到的符合第一组的部分,2、3……类推,而0表示包含全部匹配的各个组结果的元组。
贪婪匹配
比如正则表达式:
'审理(.+)指控'
我希望不去贪婪匹配,那么应该是
'审理(.+)指控?'
而非
'审理(.+?)指控'
『Re』知识工程作业_主体识别的更多相关文章
- 『Re』正则表达式模块_常用方法记录
『Re』知识工程作业_主体识别 一个比较完备的正则表达式介绍 几个基础函数 re.compile(pattern, flags=0) 将正则表达式模式编译成一个正则表达式对象,它可以用于匹配使用它的m ...
- 『TensorFlow』分布式训练_其三_多机分布式
本节中的代码大量使用『TensorFlow』分布式训练_其一_逻辑梳理中介绍的概念,是成熟的多机分布式训练样例 一.基本概念 Cluster.Job.task概念:三者可以简单的看成是层次关系,tas ...
- 『PyTorch』第九弹_前馈网络简化写法
『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上 『PyTorch』第四弹_通过LeNet初识pytorch神经网络_下 在前面的例子中,基本上都是将每一层的输出直接作为下一层的 ...
- 『TensorFlow』读书笔记_降噪自编码器
『TensorFlow』降噪自编码器设计 之前学习过的代码,又敲了一遍,新的收获也还是有的,因为这次注释写的比较详尽,所以再次记录一下,具体的相关知识查阅之前写的文章即可(见上面链接). # Aut ...
- 『TensorFlow』分布式训练_其二_单机多GPU并行&GPU模式设定
建议比对『MXNet』第七弹_多GPU并行程序设计 一.tensorflow GPU设置 GPU指定占用 gpu_options = tf.GPUOptions(per_process_gpu_mem ...
- 『Numpy』内存分析_高级切片和内存数据解析
在计算机中,没有任何数据类型是固定的,完全取决于如何看待这片数据的内存区域. 在numpy.ndarray.view中,提供对内存区域不同的切割方式,来完成数据类型的转换,而无须要对数据进行额外的co ...
- 『TensorFlow』读书笔记_进阶卷积神经网络_分类cifar10_上
完整项目见:Github 完整项目中最终使用了ResNet进行分类,而卷积版本较本篇中结构为了提升训练效果也略有改动 本节主要介绍进阶的卷积神经网络设计相关,数据读入以及增强在下一节再与介绍 网络相关 ...
- 『TensorFlow』读书笔记_进阶卷积神经网络_分类cifar10_下
数据读取部分实现 文中采用了tensorflow的从文件直接读取数据的方式,逻辑流程如下, 实现如下, # Author : Hellcat # Time : 2017/12/9 import os ...
- 『TensorFlow』第九弹_图像预处理_不爱红妆爱武装
部分代码单独测试: 这里实践了图像大小调整的代码,值得注意的是格式问题: 输入输出图像时一定要使用uint8编码, 但是数据处理过程中TF会自动把编码方式调整为float32,所以输入时没问题,输出时 ...
随机推荐
- python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍
python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...
- 怎么归档老日志的shell脚本
本脚本来自有学习阿铭的博文学习:工作中,需要用到日志切割logrotate,按照各自的需要切割.定义保留日志.提示:本文中的S全部都$符,不要问为什么,马云爸爸的社区就这样. #用途:日志切割归档.按 ...
- SNMP学习笔记之SNMP报文以及不同版本(SNMPv1、v2c、v3)的区别
本篇文章将重点分析SNMP报文,并对不同版本(SNMPv1.v2c.v3)进行区别! 四.SNMP协议数据单元 在SNMP管理中,管理站(NMS)和代理(Agent)之间交换的管理信息构成了SNMP报 ...
- Tomcat上发布webservices的war工程,访问异常404
Tomcat上发布webservices的war工程,访问异常404 Tomcat部署正常.war导出工程正常.Tomcat自带的工程可以正常访问: 问题: webservices工程访问异常404 ...
- mysql jdbc性能优化之mybatis/callablestatement调用存储过程mysql jdbc产生不必要的元数据查询(已解决,cpu负载减少20%)
INFO | jvm 1 | 2016/08/25 15:17:01 | 16-08-25 15:17:01 DEBUG pool-1-thread-371dao.ITaskDao.callProce ...
- 20145301 赵嘉鑫 《网络对抗》Exp5 MSF基础应用
20145301 赵嘉鑫 <网络对抗>Exp5 MSF基础应用 一 实验链接 渗透实验一:MS08_067渗透实验 渗透实验二:MS14_064渗透实验 (首用) 渗透实验三:Adobe ...
- 20145303刘俊谦 Exp7 网络欺诈技术防范
20145303刘俊谦 Exp7 网络欺诈技术防范 1.实验后回答问题 (1)通常在什么场景下容易受到DNS spoof攻击 局域网内的攻击,arp入侵攻击和DNS欺骗攻击 公共wifi点上的攻击. ...
- 20145335郝昊《网络攻防》Exp9 Web安全基础实践
20145335郝昊<网络攻防>Exp9 Web安全基础实践 实验内容 理解常用网络攻击技术的基本原理. 完成WebGoat实践下相关实验 实验步骤 XSS注入攻击 Phishing wi ...
- python循环和布尔表达式总结
1.Python的for循环是循环遍历序列的有限循环. 2.Python的while语句是一个不定循环的例子.只要循环条件保持为真,它就继续迭代.使用不定循环时,程序员必须注意,以免不小心写成无限循环 ...
- 骁龙820和KryoCPU:异构计算与定制计算的作用 【转】
本文转载自:https://www.douban.com/group/topic/89037625/ Qualcomm骁龙820处理器专为提供创新用户体验的顶级移动终端而设计.为实现消费者所期望的创新 ...