NLP————在神经网络中CRF的使用

最近在做bi_lstm_crf时使用了CRF的一些库函数,是tensorflow官方库提供的。

在我的项目中有两处用到了CRF:

1.在双向LSTM进行输出之后计算loss时,要使用到 crf_log_likelihood 函数。这个函数是 tensorflow.contrib.crf 提供的。下面举个例子说明函数的参数和函数输出。

crf_log_likelihood(inputs,tag_indices,sequence_lengths,transition_params=None)

参数

  • inputs:形状为[batch_size,max_seq_len,num_tags]的tensor,通常为biLSTM的输出结果。
  • tag_indices:形状为[batch_size,max_seq_len]的tensor,就是原始数据的真实标签。
  • sequence_lengths:形状为[batch_size]的tensor,代表每句话(序列)的真实长度。
  • transition_params:形状为[num_tags,num_tags]的转移矩阵。

返回

  • log_likelihood:一个标量,代表计算得到的loss误差。
  • transition_params:形状为[num_tags,num_tags]的转移矩阵。

2.在predict_one_batch进行预测的时候要将biLSTM的到的结果进行viterbi解码,从而得到最优序列。使用到的函数是viterbi_decode 函数,这个函数也是 tensorflow.contrib.crf 提供的。下面举例说明函数的参数和输出。

viterbi_decode(score,transition_params) 

参数

  • socre:形状为[seq_len,num_tags]的tensor,biLSTM的输出得分。
  • transition_params:形状为[num_tags,num_tags]的转移矩阵。

返回

  • viterbi:形状为[seq_len]的tensor,显示了最高得分的标签的索引的列表。
  • viterbi_score:A float containing the score for the Viterbi sequence.

举个我在使用时的一个例子

        if self.CRF:
            logits, transition_params = sess.run([self.logits, self.transition_params],
                                                 feed_dict=feed_dict)
            label_list = []
            for logit, seq_len in zip(logits, seq_len_list):
                viterbi_seq, _ = viterbi_decode(logit[:seq_len], transition_params)
                label_list.append(viterbi_seq)
            return label_list, seq_len_list

整个项目是进行人名地名组织名的中文命名实体识别,完整例子在我的github

你可能感兴趣的:(DeepLearning,NLP)