一、结果对比
1、jieba的分词效果
2、训练模型的分词效果
3、自训练模型原因
如上所述,jieba分词在一般分词中效果还可以,但是在法律领域则不是那么准确,比如
下面展示一些 内联代码片
。
中级 人民法院
将中级人民法院拆开了,但是这不进行拆开应该会更好,法言法语中常常并不会“中级–停顿–人民法院,而是中级人民法院、基层人民法院、高级人民法院、最高人民法院”,这一修饰词并不会分开。当然也不是没有“人民法院”这样的词语,但这是在前面并没有“中级”这种修饰词的时候
中华人民共和国 刑事诉讼法
这也是一样的,”中华人民共和国刑事诉讼法“属于专有名词,两者不能进行切分
二、自训练模型难点
技术上没有什么问题,问题在于数据集,没有标准的数据集作为训练数据。
常用的数据集:PKU和MSRA的数据集
1、专业名词
这些常用的数据集无法关注一些专业的法律名词,比如
认罪认罚从宽制度、投放危险物质罪等
如
2、姓名隐去
裁判文书中的姓名常常会被隐去,当然也存在没有隐去的。
没有隐去的如上述展示,这些姓名并没有被隐去
郭俊国、周凤啟 、 吴跃军 、 王贵安
但是大多数会隐去,形成下面这种样子
其 妻子 林 某某 与 被害人 卢 某某
或者
其 妻子 林 某甲 与 被害人 卢 某丙
而这在jieba分词中会被切开“林 /某某”,从而使得分词失准。
例如
3、模糊词语
有些词语的切分不好精确划分,受限于个人阅读习惯。例如
定罪量刑,在词语标注时,有些人会更喜欢定罪 量刑
事实清楚、证据确实、充分,有些人的阅读习惯会喜欢 事实 清楚、证据 确实、充分;但也有的人会喜欢 事实清楚、证据确实充分,将之作为专业名词对待
4、解决办法
针对1,2主要利用词典进行;
针对3则需要进行自行标注
三、自训练模型核心代码
# 初始化keras中的Embedding层权重
embedding = Embedding(input_dim=len(embeddings_matrix),
output_dim=Embedding_dim,
weights=[embeddings_matrix], # 预训练参数
trainable=False)
MAX_LEN = 60
VOCAB_SIZE = 4323#5029
EMBEDDING_OUT_DIM = 64
HIDDEN_UNITS = 64#隐藏层好像也是维度的一种
DROPOUT_RATE = 0.4
NUM_CLASS = 5
def bigru_crf_model():
model = Sequential()
model.add(embedding) # Random embedding;加载word2vec
model.add(Dropout(DROPOUT_RATE))
model.add(Bidirectional(GRU(HIDDEN_UNITS//2, return_sequences=True, kernel_initializer='glorot_uniform', recurrent_dropout=0.5)))
model.add(LeakyReLU(alpha=0.3)) # 有激活函数速度变快,但是也容易nan
model.add(TimeDistributed(Dense(NUM_CLASS,activation="softmax")))
#crf = CRF(NUM_CLASS, sparse_target=True,activation="softmax")#要用crf learn_mode='marginal',crf_loss需要sparse_target=False,sparse_target=True,则learn_mode没有
#keras contrib的CRF层期望在学习模式下使用时CRF_丢失(默认模式)。如果你想使用任何其他的正态损失函数,比如crossentry,你应该在实例化时设置learn_mode='marginal'。
#model.add(crf)
model.summary()#crf_loss, metrics=['accuracy',crf_accuracy]
model.compile(optimizer=Adam(lr=0.0001), loss='categorical_crossentropy', metrics=['accuracy'])
return model
此处没有用crf层
最终效果上,虽然比jieba分词相对好一点,毕竟进行了微调,但是仍然不太合适;可能进一步进行语料标注会好一些。