罪名预测
今天成功运行了罪名预测的代码
下面是功能介绍
罪名预测
1, 问题类型: 罪名一共包括202种罪名,文件放在dict/crime.txt中, 详细内容举例如下:
妨害公务
寻衅滋事
盗窃、侮辱尸体
危险物品肇事
非法采矿
组织、强迫、引诱、容留、介绍卖淫
开设赌场
聚众斗殴
绑架
非法持有毒品
销售假冒注册商标的商品
容留他人吸毒
假冒注册商标
交通肇事
破坏电力设备
组织卖淫
合同诈骗
走私武器、弹药
抢劫
非法处置查封、扣押、冻结的财产
2, 问题模型: 罪刑数据库一共有288万条训练数据,要做的是202类型的罪名多分类问题.本项目采用的方式为:
训练数据规模 | 数据向量表示 | 模型 | 训练时长 | 准确率 |
---|---|---|---|---|
20W | doc embedding | svm | 0.5h | 0.83352184 |
288W | doc embedding | svm | 12h | 0.9203119 |
3, 效果: 执行 python crime_classify.py
crime desc:这宗案情凶残的案件中,受害人樊敏仪是一名夜总会舞女,1997年因筹措祖母的医药费,偷取任职皮条客的首被告陈文乐数千元港币及其他财物(另一说是指毒品债)。首被告陈文乐于是吩咐次被告梁胜祖及第三被告梁伟伦向女受害人追债。女受害人为求还清债项,怀孕后仍继续接客,3名被告将欠款不断提高,受害人因无力偿还,因而触怒三人。1999年3月17日梁胜祖及梁伟伦按照首被告要求,将受害人从葵涌丽瑶邨富瑶楼一单位押走,禁锢于尖沙咀加连威老道31号3楼一单位。当回到单位后,梁伟伦质问受害人为何不还钱、为何不肯回电话,连踢受害人超过50次。3名被告用木板封着该单位的玻璃窗,以滚油泼向受害人的口腔,在伤口上涂上辣椒油,逼她吞吃粪便及喝尿。被告之后把烧溶的塑胶吸管滴在她的腿上,并命令受害人发出笑声。受害人开始神志不清,并不时挑起伤口上的焦疤,被告于是以电线紧紧捆缠受害人双手多个小时,之后又用铁棍殴打她双手。
crime label: 非法拘禁
*********************************************************
crime desc:有很多人相信是莉齐进行了这次谋杀,虽然她始终没有承认,陪审团也得出了她无罪的结论。莉齐·鲍顿是一个32岁的老姑娘,她被指控用刀杀死了自己的父亲和继母。虽然她最后无罪获释,但人们知道,她对继母一直怀恨在心,而在谋杀发生的前一天,她曾预言了将要发生的事。凶杀案发生时她已30岁。1892年8月4日中午,莉齐·鲍顿叫唤她的邻居说,她的父亲被杀了,警察到来时,发现她的母亲也死了。母亲被斧子砍了18下,父亲被砍了10下。消息立即被传开了,媒体认为莉齐本人极有谋杀嫌疑。然而次年六月,法庭宣判莉齐无罪。此后,她的故事广为流传,被写成了小说,芭蕾,百老汇,歌剧。最后是日本的教科书将她的童谣作为鹅妈妈童话收录的。
crime label: 故意杀人
*********************************************************
crime desc:017年5月26日11时许,被告人陈某、李某林与一同前去的王某,在信阳市羊山新区中级人民法院工地南大门门口,拦住被害人张某军,对其进行殴打,致其右手受伤,损伤程度属轻伤一级。2017年7月22日,李某林主动到信阳市公安局羊山分局投案。在审理过程中,被告人陈某、李某林与被害人张某军自愿达成赔偿协议,由陈某、李某林赔偿张祖军全部经济损失共计10万元,张某军对二被告人予以谅解。
crime label: 故意伤害
*********************************************************
crime desc:被告人赵某某于1999年5月起在某医院眼科开展医师执业活动,2010年11月其与医院签订事业单位聘用合同,从事专业技术工作,并于2011年取得临床医学主任医师职称。2014年3月起其担任眼科主任,在院长、分管院长和医务科领导下负责本科医疗、教学、科研和行政管理等工作。赵某某担任眼科主任期间,利用职务之便,收受人工晶体供货商给付的回扣共计37万元。赵某某作为眼科主任,在医院向供货商订购进口人工晶体过程中,参与了询价、谈判、合同签订和采购的过程。2015年4月12日,赵某某接受检察院调查,如实供述了收受人工晶体销售商回扣的事实。
crime label: 受贿
*********************************************************
crime desc:金陵晚报报道 到人家家里偷东西,却没发现可偷之物,丧尽天良的小偷为了报复竟将屋内熟睡的老太太强奸。日前,卢勇(化名) 在潜逃了一年后因再次出手被抓获。 31岁的卢勇是安徽枞阳县人,因家境贫寒,到现在仍是单身。今年6月份,他从老家来到南京,连续作案多起。7月1日凌晨,当他窜至莫愁新村再次作案时,当场被房主抓获。 经审讯又查明,去年8月30日清晨4时许,卢勇来宁行窃未遂后,贼心不死。又到附近的另一户人家行窃。他在房内找了一圈都没找到任何值钱的东西,只有个女人在床上睡觉。卢勇觉得没偷到东西亏了,想报复一下这户人家,就走到床边捂住女人的嘴,不顾反抗将其强奸后逃跑。 据卢勇供述,他当时并没注意女人的年纪,直到事后他才发现对方竟然是个早已上了年纪的老太太。日前,卢勇因涉嫌盗窃和强奸被检方审查起诉。
crime label: 强奸
代码部分:
#!/usr/bin/env python3
# coding: utf-8
# File: crime_classify.py.py
# Author: lhy<lhy_in_blcu@126.com,https://huangyong.github.io>
# Date: 18-11-11
import os
import sys
import numpy as np
import jieba.posseg as pseg
from sklearn.externals import joblib
#import joblib
#sys.modules['sklearn.externals.joblib'] = joblib
class CrimeClassify(object):
def __init__(self):
cur = '/'.join(os.path.abspath(__file__).split('/')[:-1])
crime_file = os.path.join(cur, 'dict/crime.txt')
self.label_dict = self.build_crime_dict(crime_file)
self.id_dict = {j:i for i,j in self.label_dict.items()}
self.embedding_path = os.path.join(cur, 'embedding/word_vec_300.bin')
self.embdding_dict = self.load_embedding(self.embedding_path)
self.embedding_size = 300
self.model_path = 'model/crime_predict.model'
return
'''构建罪名词类型'''
def build_crime_dict(self, crimefile):
label_dict = {}
i = 0
for line in open(crimefile,encoding='utf-8'):
crime = line.strip()
if not crime:
continue
label_dict[crime] = i
i +=1
return label_dict
'''加载词向量'''
def load_embedding(self, embedding_path):
embedding_dict = {}
count = 0
for line in open(embedding_path,encoding='utf-8'):
line = line.strip().split(' ')
if len(line) < 300:
continue
wd = line[0]
vector = np.array([float(i) for i in line[1:]])
embedding_dict[wd] = vector
count += 1
if count%10000 == 0:
print(count, 'loaded')
print('loaded %s word embedding, finished'%count, )
return embedding_dict
'''对文本进行分词处理'''
def seg_sent(self, s):
wds = [i.word for i in pseg.cut(s) if i.flag[0] not in ['x', 'u', 'c', 'p', 'm', 't']]
return wds
'''基于wordvector,通过lookup table的方式找到句子的wordvector的表示'''
def rep_sentencevector(self, sentence, flag='seg'):
if flag == 'seg':
word_list = [i for i in sentence.split(' ') if i]
else:
word_list = self.seg_sent(sentence)
embedding = np.zeros(self.embedding_size)
sent_len = 0
for index, wd in enumerate(word_list):
if wd in self.embdding_dict:
embedding += self.embdding_dict.get(wd)
sent_len += 1
else:
continue
return embedding/sent_len
'''对数据进行onehot映射操作'''
def label_onehot(self, label):
one_hot = [0]*len(self.label_dict)
one_hot[int(label)] = 1
return one_hot
'''使用svm模型进行预测'''
def predict(self, sent):
model = joblib.load(self.model_path)
represent_sent = self.rep_sentencevector(sent, flag='noseg')
text_vector = np.array(represent_sent).reshape(1, -1)
res = model.predict(text_vector)[0]
label = self.id_dict.get(res)
return label
def test():
handler = CrimeClassify()
while(1):
sent = input('crime desc:')
label = handler.predict(sent)
print('crime label:', label)
if __name__ == '__main__':
test()
成果展示: