stephen-v/zh-NER-keras

why x = [[word2idx.get(w[0].lower(), 1) for w in s] for s in data]?

Opened this issue · 6 comments

请问一下 _process_data(data, vocab, chunk_tags, maxlen=None, onehot=False)这个定义里面,x = [[word2idx.get(w[0].lower(), 1) for w in s] for s in data],为什么要把不在vocab里面的词设置为1?原本的1不是应该有个字对应的吗?

我也挺納悶這點的,但我想應該是,只要妳默認的數值對應到的文字不是NE就可以吧?

@LylmGuo @luvensaitory 这样写应该是不合理的。

对y_chunk的处理:索引从0开始(不会遇到词典中Value不存在),pad时候补**-1**;

目前代码对x的处理:索引从0开始(会遇到词典中Value不存在),当词典中Value不存在的时候,代码中用1作为Value,这是不合理之一;pad的时候默认补0,这是不合理之二。

其实对最后的模型影响不是很大。再次感谢作者分享的代码。

可以将它改一下:word2idx = dict((w, i) for i, w in enumerate(vocab)) 

替换成: word2idx = dict((w, i+2) for i, w in enumerate(vocab))
这样就是将字典从2开始编号,把0和1空出来。0作为padding的元素,1作为不在字典中的字符编号

补充 @SummerRaining 的改善方法

记得也要改bilsm_crf_model.py里面的Embedding层。
model.add(Embedding(len(vocab), EMBED_DIM, mask_zero=True))
model.add(Embedding(len(vocab)+2, EMBED_DIM, mask_zero=True))
len(vocab) 是词典里的词的数量,+2是为了把0跟1也算进去。

vocab = [w for w, f in iter(word_counts.items()) if f >= 2] 代码中这里通过字频来给字所对应的ID,这里直接就空出来了0和1啊 。

补充@SummerRaining的改善方法

记得也要改bilsm_crf_model.py里面的嵌入层。
model.add(Embedding(len(vocab), EMBED_DIM, mask_zero=True))
model.add(Embedding(len(vocab)+2, EMBED_DIM, mask_zero=True))
LEN(词汇)是词典里的词的数量,+ 2是为了把0跟1也算进去。

训练效果如何 调学习率了吗