词典中不存在词的词嵌入
位置:bert4keras/bert4keras/tokenizers.py ---- 第199行
问题:对字典中没有的词进行编码时,把该词等同于self._token_unk_id,但这个局部变量未定义。
建议:直接设定为self._token_unk_id=10
如果你的词表没有[UNK],那就没定义,那就是词表的问题,不是软件的问题。
如果你的词表没有[UNK],那就没定义,那就是词表的问题,不是软件的问题。
我的意思是 类中定义了self._token_unk=‘[UNK]‘,但是没定义self._token_unk_id。 所以词表中有[unk]也是不够的。
如果你的词表没有[UNK],那就没定义,那就是词表的问题,不是软件的问题。
我的意思是 类中定义了self._token_unk=‘[UNK]‘,但是没定义self._token_unk_id。 所以词表中有[unk]也是不够的。
没证没据不要乱说,我只是没有写self._token_unk_id = xxx这句代码,跟没有定义是两回事。我很好奇你这么肯定,是实际中跑出了错误,还是纯粹自己想象?
如果你的词表没有[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)。没有别的意思。
如果你的词表没有[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就会报错。
如果你的词表没有[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,帮助很大,所以想贡献点自己实际遇到的一些情况。
我只是觉得补全了,会更完备。常用bert4keras,帮助很大,所以想贡献点自己实际遇到的一些情况。
谢谢。但正如我一开始所说,不是每一份词表都必须有[UNK]、[MASK]等token的,所以直接明确定义self._token_unk_id = xxx、self._token_mask_id = xxx反而会降低了灵活性。
况且,当前这种写法,除了ide不会有这个变量的提示外,没有任何使用上的损失。而我的建议是“珍惜生命,远离ide”,所以当前的写法可以说百利无害。
我只是觉得补全了,会更完备。常用bert4keras,帮助很大,所以想贡献点自己实际遇到的一些情况。
谢谢。但正如我一开始所说,不是每一份词表都必须有[UNK]、[MASK]等token的,所以直接明确定义
self._token_unk_id = xxx、self._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,而这个没定义。
你说的灵活性确实非常有必要,特别是做p-tunning的时候。看你介绍的p-tunning,后续如果要构建模板字段时,我们确实要防止和这些重复。
如果出现了词表中不存在的词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来定义。
我真不知道你在纠结什么...
如果出现了词表中不存在的词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]没关系。
如果出现了词表中不存在的词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步你都没有执行,那么报错不是应该的吗?
这个逻辑能理解?
如果出现了词表中不存在的词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。不好意思,是我看的不仔细。