ner计算准召的坑

1、踩了个大坑,记录一下

声明:不喜欢写estimator所以才踩的坑

1、from tensorflow.contrib import crf 如果想使用这个函数,tensorflow的版本号要在1.14以下,1.12就可以,不要相信那些乱七八糟要求各种版本的

2、

log_likelihood, trans = tf.contrib.crf.crf_log_likelihood(
    inputs=logits,
    tag_indices=self.labels,
    sequence_lengths=self.lengths,
    transition_params=trans)
return tf.reduce_mean(-log_likelihood)=loss, trans
pred_ids, _ = crf.crf_decode(potentials=logits, transition_params=trans, sequence_length=self.lengths)

crf函数可以返回函数的损失,转移矩阵,最有路径的结果,我们要根据最有路径的结果与原始标签来计算acc和recall

3、input_label是真实标签(?*100)?表示batch_size的大小;pred_ids是预测标签(?*100)?表示batch_size的大小

acc = a(预测为实体且真实为实体的个数)/b(预测为实体的个数)

recall = a(预测为实体且真实为实体的个数)/c(实际实体的个数)

首先你要知道你实体的标签id是什么,如["O", "B-person", "CLS", "Seq"],那么你的标签id就是1

先计算a,思路步骤:

         1、input_label中元素为1,2,3的位置置true,其余位置false,并转换成float。mid_1_1 = tf.cast(tf.equal(self.input_label, 1),tf.float32)

         2、input_label和pred_ids中相同位置元素相同置true,否则置false,与转换成flaot。mid_1 = tf.cast(tf.equal(self.input_label, self.pred_ids),tf.float32)

        3、两个相乘得到的结果就是a。mid_1_1_1 = tf.reduce_sum(tf.multiply(mid_1_1, mid_1))

计算b,思路步骤:

        1、计算pred_ids中为实体的元素位置:mid_2_1 = tf.equal(self.pred_ids, 1)

        2、recall_ner = tf.reduce_sum(tf.cast(mid_2_1, tf.float32))

计算c,思路步骤:true_ner = tf.reduce_sum(tf.cast(mid_1_1, tf.float32))

acc还是precision我记不清了

acc = a/b

recall = a/c

 

 

 

 

 

 

 

 

你可能感兴趣的:(自然语言处理,nlp,实体识别,自然语言处理,tensorflow,深度学习)