buppt / ChineseNRE

中文实体关系抽取,pytorch,bilstm+attention
753 stars 178 forks source link

关于set_ids 索引的疑问 #18

Open Mryangkaitong opened 5 years ago

Mryangkaitong commented 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))写呢? 谢谢

buppt commented 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了,在后面找一下

Mryangkaitong commented 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了,在后面找一下

第61行程序 id2word[len(id2word)+1]="UNKNOW" 不是将最后一个id号设为unknown word了吗?

buppt commented 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了,在后面找一下

第61行程序 id2word[len(id2word)+1]="UNKNOW" 不是将最后一个id号设为unknown word了吗?

那就是给一些非word了?太久忘记了

Mryangkaitong commented 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了,在后面找一下

第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

综上,其实我还是不太懂非word和unknown word?看大佬代码好像也没有对两者在语料库上有什么区别处理,所以有这么个疑惑?

除此之外,ChineseNRE/train.py的第78行觉得应该改为: for word in id2word: 原因如下: image 不知道对不对?

buppt commented 5 years ago

非word应该是为了凑batch在后面添加的padding吧。

代码你可以改一改试一下效果,我实在不记得代码细节了。 @Mryangkaitong

Mryangkaitong commented 5 years ago

非word应该是为了凑batch在后面添加的padding吧。

代码你可以改一改试一下效果,我实在不记得代码细节了。 @Mryangkaitong

好的,谢谢