crownpku / Information-Extraction-Chinese

Chinese Named Entity Recognition with IDCNN/biLSTM+CRF, and Relation Extraction with biGRU+2ATT 中文实体识别与关系提取
2.22k stars 813 forks source link

请问关于NER_IDCNN_CRF中处理不定长句子manx_length的疑问 #124

Closed LittleSJL closed 3 years ago

LittleSJL commented 3 years ago

您好作者,首先感谢您提供的这些研究和代码,其中NER部分关于处理不定长句子代码我有如下疑问: 通常来说,需要给出定长max_length,长截断,短补齐;但我看到您关于此处的处理是:选择训练/测试集中最长的句子作为max_length:max_length = max([len(sentence[0]) for sentence in data])

1、但是您对于这个长度貌似没有记录下来,也就是模型训练完了,如果有新的测试数据进来,您怎么知道最长长度是多少? 2、您提供了一个evaluate_line的接口,允许实时输入句子做NER的测试,但这里您貌似对输入又没有做定长的补齐和截断,但模型和代码却是正常工作的

我想请问一下是我有那里没读懂吗,我有点不清楚里面的逻辑,希望您能解答!

LittleSJL commented 3 years ago

我明白了: (1)程序中通过self.num_steps = tf.shape(self.char_inputs)[-1]获取每个batch中句子的长度,而每个batch中句子已经做过了padding (2)由于是使用了bidirectional_dynamic_rnn,所以只需每个batch内部做padding即可,不同batch之间可以拥有不同的长度,这也就是为什么不用设置全局max_length的原因 (3)同理,evaluate_line实时处理输入数据的时候也就不用做padding了,因为网络需要保证每个batch内部句子长度相同,但是这个batch就一个数据,符合网络输入

因为之前没用过bidirectional_dynamic_rnn,这次学习了之后觉得还蛮神奇的,居然可以动态接受不同句子长度的输入 self.char_inputs = tf.placeholder(dtype=tf.int32, shape=[None, None], name="ChatInputs") 这也就是为什么这里设置占位符的时候shape只需要是二维,无需指定具体大小

至于内部的原理之后有时间再去看看吧!