bert4keras icon indicating copy to clipboard operation
bert4keras copied to clipboard

词典中不存在词的词嵌入

Open xiaochang129 opened this issue 4 years ago • 13 comments

位置:bert4keras/bert4keras/tokenizers.py ---- 第199行

问题:对字典中没有的词进行编码时,把该词等同于self._token_unk_id,但这个局部变量未定义。

建议:直接设定为self._token_unk_id=10

xiaochang129 avatar Nov 12 '21 03:11 xiaochang129

如果你的词表没有[UNK],那就没定义,那就是词表的问题,不是软件的问题。

bojone avatar Nov 12 '21 15:11 bojone

如果你的词表没有[UNK],那就没定义,那就是词表的问题,不是软件的问题。

我的意思是 类中定义了self._token_unk=‘[UNK]‘,但是没定义self._token_unk_id。 所以词表中有[unk]也是不够的。

xiaochang129 avatar Nov 16 '21 01:11 xiaochang129

如果你的词表没有[UNK],那就没定义,那就是词表的问题,不是软件的问题。

我的意思是 类中定义了self._token_unk=‘[UNK]‘,但是没定义self._token_unk_id。 所以词表中有[unk]也是不够的。

没证没据不要乱说,我只是没有写self._token_unk_id = xxx这句代码,跟没有定义是两回事。我很好奇你这么肯定,是实际中跑出了错误,还是纯粹自己想象?

bojone avatar Nov 16 '21 06:11 bojone

如果你的词表没有[UNK],那就没定义,那就是词表的问题,不是软件的问题。

我的意思是 类中定义了self._token_unk=‘[UNK]‘,但是没定义self._token_unk_id。 所以词表中有[unk]也是不够的。

没证没据不要乱说,我只是没有写self._token_unk_id = xxx这句代码,跟没有定义是两回事。我很好奇你这么肯定,是实际中跑出了错误,还是纯粹自己想象?

嗯,我就是这个意思:要加一句 self._token_unk_id = self._token_dict.get(self._token_unk)。没有别的意思。

xiaochang129 avatar Nov 16 '21 08:11 xiaochang129

如果你的词表没有[UNK],那就没定义,那就是词表的问题,不是软件的问题。

我的意思是 类中定义了self._token_unk=‘[UNK]‘,但是没定义self._token_unk_id。 所以词表中有[unk]也是不够的。

没证没据不要乱说,我只是没有写self._token_unk_id = xxx这句代码,跟没有定义是两回事。我很好奇你这么肯定,是实际中跑出了错误,还是纯粹自己想象?

嗯,我就是这个意思:要加一句 self._token_unk_id = self._token_dict.get(self._token_unk)。没有别的意思。

我的意思是,如果有错误信息欢迎提出来,但是如果没有的话就不要靠幻想来提一些不存在的“错误”。我没有写self._token_unk_id = xxx,不代表tokenizer._token_unk_id就会报错。

bojone avatar Nov 16 '21 08:11 bojone

如果你的词表没有[UNK],那就没定义,那就是词表的问题,不是软件的问题。

我的意思是 类中定义了self._token_unk=‘[UNK]‘,但是没定义self._token_unk_id。 所以词表中有[unk]也是不够的。

没证没据不要乱说,我只是没有写self._token_unk_id = xxx这句代码,跟没有定义是两回事。我很好奇你这么肯定,是实际中跑出了错误,还是纯粹自己想象?

嗯,我就是这个意思:要加一句 self._token_unk_id = self._token_dict.get(self._token_unk)。没有别的意思。

我的意思是,如果有错误信息欢迎提出来,但是如果没有的话就不要靠幻想来提一些不存在的“错误”。我没有写self._token_unk_id = xxx,不代表tokenizer._token_unk_id就会报错。

我只是觉得补全了,会更完备。常用bert4keras,帮助很大,所以想贡献点自己实际遇到的一些情况。

xiaochang129 avatar Nov 16 '21 08:11 xiaochang129

我只是觉得补全了,会更完备。常用bert4keras,帮助很大,所以想贡献点自己实际遇到的一些情况。

谢谢。但正如我一开始所说,不是每一份词表都必须有[UNK]、[MASK]等token的,所以直接明确定义self._token_unk_id = xxxself._token_mask_id = xxx反而会降低了灵活性。

况且,当前这种写法,除了ide不会有这个变量的提示外,没有任何使用上的损失。而我的建议是“珍惜生命,远离ide”,所以当前的写法可以说百利无害。

bojone avatar Nov 16 '21 08:11 bojone

我只是觉得补全了,会更完备。常用bert4keras,帮助很大,所以想贡献点自己实际遇到的一些情况。

谢谢。但正如我一开始所说,不是每一份词表都必须有[UNK]、[MASK]等token的,所以直接明确定义self._token_unk_id = xxxself._token_mask_id = xxx反而会降低了灵活性。

况且,当前这种写法,除了ide不会有这个变量的提示外,没有任何使用上的损失。而我的建议是“珍惜生命,远离ide”,所以当前的写法可以说百利无害。

如果出现了词表中不存在的词Z, 将Z转换成id的 tokenizers.py 第199行self._token_dict.get(“Z”, self._token_unk_id) 会等于self._token_unk_id,而这个没定义。

xiaochang129 avatar Nov 16 '21 08:11 xiaochang129

你说的灵活性确实非常有必要,特别是做p-tunning的时候。看你介绍的p-tunning,后续如果要构建模板字段时,我们确实要防止和这些重复。

xiaochang129 avatar Nov 16 '21 08:11 xiaochang129

如果出现了词表中不存在的词Z, 将Z转换成id的 tokenizers.py 第199行self._token_dict.get(“Z”, self._token_unk_id) 会等于self._token_unk_id,而这个没定义。

你究竟能不能理解一下我前面说的话?

只要你的词表有[UNK],那么这个self._token_unk_id就不会报错,也就是有定义,这个定义不是通过self._token_unk_id = xxx来定义,是通过setattr来定义。

我真不知道你在纠结什么...

bojone avatar Nov 16 '21 08:11 bojone

如果出现了词表中不存在的词Z, 将Z转换成id的 tokenizers.py 第199行self._token_dict.get(“Z”, self._token_unk_id) 会等于self._token_unk_id,而这个没定义。

你究竟能不能理解一下我前面说的话?

只要你的词表有[UNK],那么这个self._token_unk_id就不会报错,也就是有定义,这个定义不是通过self._token_unk_id = xxx来定义,是通过setattr来定义。

我真不知道你在纠结什么...

感觉是我的表达问题。。 我说的是对于不在词表中的新词,要从token转id的时候。 跟词表里有没有[UNK]没关系。

xiaochang129 avatar Nov 16 '21 09:11 xiaochang129

如果出现了词表中不存在的词Z, 将Z转换成id的 tokenizers.py 第199行self._token_dict.get(“Z”, self._token_unk_id) 会等于self._token_unk_id,而这个没定义。

你究竟能不能理解一下我前面说的话? 只要你的词表有[UNK],那么这个self._token_unk_id就不会报错,也就是有定义,这个定义不是通过self._token_unk_id = xxx来定义,是通过setattr来定义。 我真不知道你在纠结什么...

感觉是我的表达问题。。 我说的是对于不在词表中的新词,要从token转id的时候。 跟词表里有没有[UNK]没关系。

1、对于不在词表的词,会转换为self._token_unk_id

2、只要你的词表有[UNK],那么self._token_unk_id就不会报错,所以第1步没有问题;

3、如果你的词表没有[UNK],那么可以自己定义正确的self._token_unk,此时self._token_unk_id就不会报错,所以第1步也没有问题;

4、如果第2、3步你都没有执行,那么报错不是应该的吗?

这个逻辑能理解?

bojone avatar Nov 16 '21 09:11 bojone

如果出现了词表中不存在的词Z, 将Z转换成id的 tokenizers.py 第199行self._token_dict.get(“Z”, self._token_unk_id) 会等于self._token_unk_id,而这个没定义。

你究竟能不能理解一下我前面说的话? 只要你的词表有[UNK],那么这个self._token_unk_id就不会报错,也就是有定义,这个定义不是通过self._token_unk_id = xxx来定义,是通过setattr来定义。 我真不知道你在纠结什么...

感觉是我的表达问题。。 我说的是对于不在词表中的新词,要从token转id的时候。 跟词表里有没有[UNK]没关系。

1、对于不在词表的词,会转换为self._token_unk_id

2、只要你的词表有[UNK],那么self._token_unk_id就不会报错,所以第1步没有问题;

3、如果你的词表没有[UNK],那么可以自己定义正确的self._token_unk,此时self._token_unk_id就不会报错,所以第1步也没有问题;

4、如果第2、3步你都没有执行,那么报错不是应该的吗?

这个逻辑能理解?

sorry,我傻了,tokenizers.py 192行定义了self._token_unk_id。不好意思,是我看的不仔细。

xiaochang129 avatar Nov 16 '21 09:11 xiaochang129