Open Mryangkaitong opened 5 years ago
请问在ChineseNRE/data/people-relation/data_util.py的54行 set_ids = range(1, len(set_words)+1) 那么“所有单词”列表的id索引是从1开始的,而在使用nn.Embedding时,取某个单词的vec索引是从索引0开始的,不就混乱了吗? 为什么不直接这样set_ids = range(len(set_words))写呢? 谢谢
0应该是用来给unknown word了,在后面找一下
请问在ChineseNRE/data/people-relation/data_util.py的54行 set_ids = range(1, len(set_words)+1) 那么“所有单词”列表的id索引是从1开始的,而在使用nn.Embedding时,取某个单词的vec索引是从索引0开始的,不就混乱了吗? 为什么不直接这样set_ids = range(len(set_words))写呢? 谢谢
0应该是用来给unknown word了,在后面找一下
第61行程序 id2word[len(id2word)+1]="UNKNOW" 不是将最后一个id号设为unknown word了吗?
请问在ChineseNRE/data/people-relation/data_util.py的54行 set_ids = range(1, len(set_words)+1) 那么“所有单词”列表的id索引是从1开始的,而在使用nn.Embedding时,取某个单词的vec索引是从索引0开始的,不就混乱了吗? 为什么不直接这样set_ids = range(len(set_words))写呢? 谢谢
0应该是用来给unknown word了,在后面找一下
第61行程序 id2word[len(id2word)+1]="UNKNOW" 不是将最后一个id号设为unknown word了吗?
那就是给一些非word了?太久忘记了
请问在ChineseNRE/data/people-relation/data_util.py的54行 set_ids = range(1, len(set_words)+1) 那么“所有单词”列表的id索引是从1开始的,而在使用nn.Embedding时,取某个单词的vec索引是从索引0开始的,不就混乱了吗? 为什么不直接这样set_ids = range(len(set_words))写呢? 谢谢
0应该是用来给unknown word了,在后面找一下
第61行程序 id2word[len(id2word)+1]="UNKNOW" 不是将最后一个id号设为unknown word了吗?
那就是给一些非word了?太久忘记了
恩恩,非word和unknown word有什么区别呢?在代码上两者好像没有区分?
应该是ChineseNRE/data/people-relation/data_util.py的第68-72行
for i in words: if i in word2id: ids.append(word2id[i]) else: ids.append(word2id["UNKNOW"])
这里的逻辑最后实现的效果是:语料库中所有的词的id都是大于等于1的,并没有词对应的索引是0这种情况出现,那么是怎么区分“非word”和unknown word的呢?
再者与其有关的是ChineseNRE/train.py第75-82行,
unknow_pre = [] unknow_pre.extend([1]*100) embedding_pre.append(unknow_pre) #wordvec id 0 for word in word2id: if word2vec.has_key(word): embedding_pre.append(word2vec[word]) else: embedding_pre.append(unknow_pre)
embedding_pre.append(unknow_pre) #wordvec id 0
即如果是采用载入已有的word2vec这种方式,那么看代码逻辑应该是:统一将0索引设为了[1]100,这里是对应的非word?那么对于语料库中的"UNKNOW"词这里也不是进行了 embedding_pre.append(unknow_pre)吗?也是[1]100,也就是说词向量矩阵的0索引和最后一个索引都是[1]*100?
二 : 如果不采用“加入预训练的词向量”方式,那么词向量矩阵应该是ChineseNRE/BiLSTM_ATT.py下第26行 self.word_embeds = nn.Embedding(self.embedding_size,self.embedding_dim)
self.embedding_size = len(word2id)+1([0,len(word2id)]) ,可是语料库中所有词的索引范围是[1,len(word2id)],压根就没有0
除此之外,ChineseNRE/train.py的第78行觉得应该改为:
for word in id2word:
原因如下:
不知道对不对?
非word应该是为了凑batch在后面添加的padding吧。
代码你可以改一改试一下效果,我实在不记得代码细节了。 @Mryangkaitong
非word应该是为了凑batch在后面添加的padding吧。
代码你可以改一改试一下效果,我实在不记得代码细节了。 @Mryangkaitong
好的,谢谢
请问在ChineseNRE/data/people-relation/data_util.py的54行 set_ids = range(1, len(set_words)+1) 那么“所有单词”列表的id索引是从1开始的,而在使用nn.Embedding时,取某个单词的vec索引是从索引0开始的,不就混乱了吗? 为什么不直接这样set_ids = range(len(set_words))写呢? 谢谢