Open feiyunamy opened 3 years ago
噢 似乎self.tokenizer.tokenize(triple[0])[1:-1]是为了规避[SEP]与[CLS]token,那么这种tokenize表现就是bug?但是如果换一个tokenizer, 代码中预测部分,预测出来的结果也会少一个字,所以不是很清楚到底是出于何种考虑。
问题1:代码中的tokenizer貌似是针对英文token的,对每个单词wordpiece,把单词之间的空格替换成[unused1]。如果是中文会出现你描述的情况,中文的tokenizer还需要改写下。
同意 @Phoeby2618 的说法,我试了(1)把中文分割成带空格的类似英文的格式,用代码里面的HBTokenizer(2)中文用原文,tokenizer用原生的Tokenier加上[unused1],metric函数中把' '.join(sub.split('[unused1]'))
也改过来了。(3)中文用原文,tokenizer用原生的Tokenier不加[unused1],metric同上。
前2者结果差不多。最后一种情况,pred的关系实体总是为0。应该是[unused1]不能随便去掉,暂时没搞清楚咋回事。
我现在也发现了这个问题,打算试试您上面说的方法(2),不知您现在有没有更好的办法。
这里的self.tokenizer.tokenize(triple[0])[1:-1]确实是为了规避开头的[CLS]标签和末尾的[SEP],这是函数内部拼接上去的,但是有个问题就是,如果实体token不在词典,那么该实体token就会被细分成多个token。
各位大佬,能分享下处理中文数据的代码嘛,或者怎么修改
代码中使用了keras-bert里面的tokenizer,但是这个tokenize的表现好像有些特殊,例如:
这条数据,text就会被tokenize成,['[CLS]', '##三', '##国', ... , ‘[unused1]’, '[SEP]'], 对应的subject会被tokenize成,['##陆', '##逊', ‘[unused1]’],不知道是出于什么考虑还是只是bug?因为如果这样,在原始输入序列中无法找到subject与object对应的位置,就无法产生对应的标签。(bert-base-chinese, vocab也是bert自带的vocab.txt)
但是代码中在data_generator阶段似乎又有意规避了末尾的unused1标签?
另外,keras-bert 0.80.0似乎无法使用。 我的环境如下
综上,我的问题如下: