写在前面
一个学法学的同学要我帮忙写一个处理程序,我也是编程小白,奈何是相关专业的,还是答应了帮忙。
写的很丑陋,但毕竟花了不少时间写,敝帚自珍,放在这里记录一下
代码实现
数字转换部分
from cn2an import cn2an # 用于中文数字转换
import re
# 提取罚款内容中的数字部分
def keep_specific_chars(RE_list):
# 未匹配到
if len(RE_list) == 0:
return "0"
else:
string = RE_list[len(RE_list)-1] # 将列表中的字符串取出
pattern = re.compile(r'[0-9一二两三四五六七八九十百千万零壹贰叁肆伍陆柒捌玖拾佰仟萬\.]*')
results = re.findall(pattern, string)
return ''.join(results) # 将识别到的数字连接起来
# 将数字内容转换为阿拉伯数字,并转换为数值型
def trans(string):
try:
# 将中文数字转换为阿拉伯数字,并储存为浮点数类型
return int(cn2an(string, mode = 'smart'))
except:
# 无法识别则返回-1
return -1
def to_number(list):
return trans(keep_specific_chars(list))
提取各种罪行
import re
from to_number import to_number
#一个比较大的问题是我们不知道文书中哪一段判决是最终判决,需要自己设置一下
def filter_text(text):
strs=['并罚','决定执行']
for str in strs:
if str in text:
text=text[text.index(str):]
return text
def fine_money(text):
text=filter_text(text)
if '处罚金' in text:
text=text[text.index('处罚金'):]
else:
return 0
strs=[',','。',';','(','【']
for str in strs:
if str in text:
text=text[:text.index(str)]
if '元' in text:
text=text[:text.index('元')]
list=[text]
return to_number(list)
#有关时间的刑罚,包括有期,缓刑,拘役,均可通过传入string进行匹配
def time_limit_prison(text,string):
text=filter_text(text)
if string in text:
text=text[text.index(string):]
else:
return 0
strs=[',','。',';','(','【']
for str in strs:
if str in text:
text=text[:text.index(str)]
if string!='缓刑' and '缓刑' in text:
text=text[:text.index('缓刑')]
#取第一个匹配到的
string1 = string
string2 = "年"
string3 ='月'
string4 ='日'
day=0
pattern_year = re.compile(f'{re.escape(string1)}(.*?){re.escape(string2)}')
if '年' in text:
pattern_month = re.compile(f'{re.escape(string2)}(.*?){re.escape(string3)}')
else:
pattern_month=re.compile(f'{re.escape(string1)}(.*?){re.escape(string3)}')
if '月' in text:
pattern_day=re.compile(f'{re.escape(string3)}(.*?){re.escape(string4)}')
match_day=pattern_day.findall(text)
day=to_number(match_day)
match_year=pattern_year.findall(text)
match_month=pattern_month.findall(text)
year=to_number(match_year)
month=to_number(match_month)
if day>0:
return 12*year+month+day/30
else:
return 12*year+month
if __name__ == "__main__":
text="""被告人胡有志犯偷越国(边)境罪,判处有期徒刑六个月(刑期从判决执行之日起计算。判决执行以前先行羁押的,羁押一日折抵刑期一日,即自2023年9月2日起至2024年3月1日止),并处罚金人民币一万元(已预缴)"""
print(f'罚金:{fine_money(text)}')
print(f"有期徒刑:{time_limit_prison(text,'有期徒刑')}")
多个被告人,分割文本和处理函数
#定义了拆解被告人的函数
import pandas as pd
import re
import judge_crime
def judge_wanzheng(text):
if '如不服本判决' in text:
return 1
else:
return 0
# 通过数被告人...犯出现次数来判断有多少个被告人,返回的为list
def peoplelist(string):
string1 = "被告人"
string2 = "犯"
if not isinstance(string, str):
print(string)
pattern = re.compile(f'{re.escape(string1)}(.*?){re.escape(string2)}')
matches = pattern.findall(string)
if not matches:
string3='被告'
pattern = re.compile(f'{re.escape(string3)}(.*?){re.escape(string2)}')
matches = pattern.findall(string)
# 过滤掉汉字字数大于10并且不包含"否认指控的"的匹配
filtered_matches = [match for match in matches if len(re.findall('[\u4e00-\u9fff]', match)) <= 10 and ('否认指控的' not in match) and ('的行为不构成' not in match)]
unique_matches = list(set(filtered_matches))
return unique_matches
def countpeople(text):
return len(peoplelist(text))
def slice_text(text):
#用作分隔符拆分,将如不服从本判决之后的删除
delimiter_list=peoplelist(text)
if '如不服本判决' in text:
text=text[:text.index('如不服本判决')]
# 使用re.split()根据列表中的字符串进行沿左边拆分
pattern = '|'.join(f'(?={re.escape(delimiter)})' for delimiter in delimiter_list)
result = re.split(pattern, text)
list1 = delimiter_list
list2 = result[1:]
matches = []
for item1 in list1:
for item2 in list2:
if item1 in item2 :
matches.append((item1, item2))
break
return matches
#将返回一个元素为['姓名','死刑','无期','有期','拘役','缓刑''罚金']的list,并转换成dataFrame形式
def dataF(text):
#划分
slice_list=slice_text(text)
#创建一个空list
final_list=[]
for i in range(len(slice_list)):
#先把名字放在元素中
element=[slice_list[i][0],0,0,0,0,0,0]
wenshu=slice_list[i][1]
element[3]=judge_crime.time_limit_prison(wenshu,'有期徒刑')
element[4]=judge_crime.time_limit_prison(wenshu,'拘役')
element[5]=judge_crime.time_limit_prison(wenshu,'缓刑')
element[6]=judge_crime.fine_money(wenshu)
#死刑和无期是特殊情况
if '判处死刑' in wenshu:
element[1]=1
if '无期徒刑' in wenshu:
element[2]=1
#添加这个元素
final_list.append(element)
data=pd.DataFrame(final_list,columns=['姓名','死刑','无期','有期','拘役','缓刑','罚金'])
return data.sort_values(by='姓名')
def choose(text,string):
result=dataF(text)[string]
if len(result)==1:
return result[0]
else:
result=','.join(result.astype(str))
return result
if __name__ == "__main__":
text=""" 将罪犯樊冬林暂予监外执行。
曲靖市马龙区人民法院
二〇二四年一月二十七日"""
print(countpeople(text))
主函数
import pandas as pd
import re
import slice
import os
from openpyxl import load_workbook
def chunlisheet(dat):
dat['人数']=dat['裁判结果'].apply(slice.countpeople)
new_columns=['姓名','死刑','无期','有期','拘役','缓刑','罚金']
for column_name in new_columns:
args=(column_name,)
dat[column_name]= dat['裁判结果'].apply(slice.choose,args=args)
dat['是否完整']=dat['裁判结果'].apply(slice.judge_wanzheng)
return dat
def delete_dir(directory):
file_list = os.listdir(directory)
for file in file_list:
file_path = os.path.join(directory, file)
if os.path.isfile(file_path):
os.remove(file_path)
os.rmdir(directory)
#指定输出文件夹
output_dir='处理后'
#如果存在删除,再建立一个
if os.path.exists(output_dir):
delete_dir(output_dir)
os.makedirs(output_dir)
else:
os.makedirs(output_dir)
# 指定数据文件夹路径
folder_path = './data'
# 使用 os.listdir 获取文件夹中的所有元素(文件和文件夹)
all_elements = os.listdir(folder_path)
# 过滤出文件名
file_names = [element for element in all_elements if os.path.isfile(os.path.join(folder_path, element))]
for file in file_names:
input_excel_file_path = folder_path+'/'+file
# 读取 Excel 文件中的所有 sheet
all_sheets = pd.read_excel(input_excel_file_path, sheet_name=None)
output_excel_file_path=output_dir+'/'+file[:-len('xls')]+'xlsx'
# 创建 ExcelWriter 对象,设置 mode='w' 表示写入模式
with pd.ExcelWriter(output_excel_file_path, engine='openpyxl', mode='w') as writer:
#先建立一个空sheet
pd.DataFrame().to_excel(writer, sheet_name='EmptySheet', index=False)
# 遍历所有 sheet,并应用处理函数
for sheet_name, df in all_sheets.items():
#先将空的数据填充为“error”
df_filled = df.fillna("error")
processed_df = chunlisheet(df_filled)
# 将处理后的 DataFrame 写入 ExcelWriter 对象的指定 sheet,并指定 sheet 名称
processed_df.to_excel(writer, sheet_name=sheet_name, index=False)
#删除空sheet
book = load_workbook(output_excel_file_path)
book.remove(book['EmptySheet'])
# 保存修改后的 Excel 文件
book.save(output_excel_file_path)