bert4keras
bert4keras copied to clipboard
tokenizer不分词
提问时请尽可能提供如下信息:
基本信息
- 你使用的ubuntu:
- 你使用的Python3.6版本:
- 你使用的Tensorflow-gpu-1.14.0版本:
- 你使用的Keras-2.3.1版本:
- 你使用的bert4keras版本:
- 你使用纯tf.keras:
- 你加载的预训练模型 通过pretraining.py训练得到的:
核心代码
#coding:utf-8
"""
测试MLM
"""
import numpy as np
from bert4keras.models import build_transformer_model
from bert4keras.tokenizers import Tokenizer
from bert4keras.snippets import to_array
config_path = './bert_model/bert_config.json'
checkpoint_path = './bert_model/bert_model.ckpt'
dict_path = './bert_model/vocab.txt'
tokenizer = Tokenizer(dict_path, do_lower_case=True)
model = build_transformer_model(
config_path=config_path,
checkpoint_path=checkpoint_path,
with_mlm=True
)
token_ids, segment_ids = tokenizer.encode(u'科学技术是第一生产力')
for i, token_id in enumerate(token_ids):
print(i, tokenizer.decode([token_id]))
token_ids[3] = token_ids[4] = tokenizer._token_mask_id
token_ids, segment_ids = to_array([token_ids], [segment_ids])
probas = model.predict([token_ids, segment_ids])[0]
print(tokenizer.decode(probas[3:5].argmax(axis=1)))
输出信息
0 49995
1 6878 科
2 1136 学
3 49998
4 39816 术
5 44 是
6 25578 第
7 38 一
8 2218 生
9 7922 产
10 16680 力
11 49996
自我尝试
不管什么问题,请先尝试自行解决,“万般努力”之下仍然无法解决再来提问。此处请贴上你的努力过程。
没有分词。词表的最后几行
49996 [CLS]
49997 [SEP]
49998 [PAD]
49999 [UNK]
50000 [MASK]
这里行号与前边输出索引号+1相对应。
不知道你说什么。没有分词有什么稀奇的?
原文“科学技术是第一生产力” 输出里没有“技”,因为词表里只有“技术”。
“技”这么常见的单字,要当作未登录词吗?
我不知道你的词表哪里来的。我看了看roformer的词表,里边显然是有“技”单字的,然后roformer的词表最后一个也不是[MASK]
从这里https://github.com/bojone/bert4keras/blob/master/pretraining/data_utils.py生成的训练集,用的模型是
dict_path = '/home/spaces_ac_cn/chinese_L-12_H-768_A-12/vocab.txt'
这个模型从这里下载的
https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip
如果是chinese_L-12_H-768_A-12的词表,那么大小应该是2万多个词,并且最后一个也不是[MASK]
从这个链接下的文件有问题吗? 我看data_utils.py里用了jibea,但bert4keras的代码里没有导入分词器。
印象词典里少标记会报错,具体运行哪里报的就忘了,当时记录了参考的链接:
参考:
https://github.com/bojone/bert4keras/blob/c8df00366bf39a83ada2ae935dff72fe13393f8c/bert4keras/tokenizers.py#L46
参考:https://github.com/bojone/bert4keras/issues/126
从这个链接下的文件有问题吗? 我看data_utils.py里用了jibea,但bert4keras的代码里没有导入分词器。
这个链接没有问题,是你自己不知道怎么改得有问题。data_utils.py用jieba是做wwm的,跟tokenizer没直接关系。
那预训练出的模型,要怎么推断,推断全基于单字,训练时分词?
那预训练出的模型,要怎么推断,推断全基于单字,训练时分词?
如果你说的是bert或者roberta,那么训练和推断都没分词。这些基本概念建议自行查阅资料了解。
那建议 就把https://github.com/bojone/bert4keras/tree/master/pretraining 这个目录都删了吧,免得引起大家误会。
或者,把jieba分词的那一段删掉,而且预训练的模型文件名也不该再用WWM的吧,chinese_L-12_H-768_A-12/vocab.txt这个文件里不该再有多字词,这个文件是不是也是用来训练wwm的。
那建议 就把https://github.com/bojone/bert4keras/tree/master/pretraining 这个目录都删了吧,免得引起大家误会。
这个目录实现得很清楚,不会引起什么误会。wwm具体含义是什么,请了解好再来讨论,至少在wwm的实现上,参考脚本的实现完全没有问题。这个预训练脚本放出也不是一天两天了,很多人都读过用过,小问题可能有,但不至于有这种低级错误。有问题建议多反思自己。
大哥,训练和预测的预处理都该一致吧,这就算不用BERT都该明白。
大哥,训练和预测的预处理都该一致吧,这就算不用BERT都该明白。
不管加不加wwm,训练和预测都没分词,哪里不一致了?你确定你知道wwm是什么了吗?
您的wwm确实可以用自己的语料预训练,而且是词级的,很不错。才想着看看bert4keras是否也支持。
您的wwm确实可以用自己的语料预训练,而且是词级的,很不错。才想着看看bert4keras是否也支持。
wwm没有硬性规定是word-based还是char-based,不管是word还是char都可以加wwm。
373行 https://github.com/bojone/bert4keras/blob/master/pretraining/data_utils.py#373
373行 https://github.com/bojone/bert4keras/blob/master/pretraining/data_utils.py#373
如果你执意不去理解整个代码、不去理解wwm的具体含义,非要停留在自己对wwm的幻想中,那么我认为我们没有必要讨论下去了。
懂的都懂。。。也是醉了。
懂的都懂。。。也是醉了。
至少从目前看来你肯定是不懂wwm的
没用过,但是看了看源码意思是给训练时做mask用的,后续转token id各个模型自有处理方法。
@bojone 好吧