Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于set_ids 索引的疑问 #18

Open
Mryangkaitong opened this issue Jun 27, 2019 · 6 comments
Open

关于set_ids 索引的疑问 #18

Mryangkaitong opened this issue Jun 27, 2019 · 6 comments

Comments

@Mryangkaitong
Copy link

请问在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
Copy link
Owner

buppt commented Jun 29, 2019

请问在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
Copy link
Author

请问在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
Copy link
Owner

buppt commented Jun 30, 2019

请问在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
Copy link
Author

Mryangkaitong commented Jul 1, 2019

请问在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
Copy link
Owner

buppt commented Jul 1, 2019

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

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

@Mryangkaitong
Copy link
Author

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

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

好的,谢谢

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants