bert4keras icon indicating copy to clipboard operation
bert4keras copied to clipboard

tokenizer不分词

Open baiziyuandyufei opened this issue 4 years ago • 24 comments

提问时请尽可能提供如下信息:

基本信息

  • 你使用的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相对应。

baiziyuandyufei avatar Sep 07 '21 05:09 baiziyuandyufei

不知道你说什么。没有分词有什么稀奇的?

bojone avatar Sep 26 '21 14:09 bojone

原文“科学技术是第一生产力” 输出里没有“技”,因为词表里只有“技术”。

baiziyuandyufei avatar Oct 08 '21 01:10 baiziyuandyufei

“技”这么常见的单字,要当作未登录词吗?

baiziyuandyufei avatar Oct 08 '21 01:10 baiziyuandyufei

我不知道你的词表哪里来的。我看了看roformer的词表,里边显然是有“技”单字的,然后roformer的词表最后一个也不是[MASK]

bojone avatar Oct 08 '21 03:10 bojone

从这里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

baiziyuandyufei avatar Oct 08 '21 06:10 baiziyuandyufei

如果是chinese_L-12_H-768_A-12的词表,那么大小应该是2万多个词,并且最后一个也不是[MASK]

bojone avatar Oct 08 '21 07:10 bojone

从这个链接下的文件有问题吗? 我看data_utils.py里用了jibea,但bert4keras的代码里没有导入分词器。

baiziyuandyufei avatar Oct 08 '21 07:10 baiziyuandyufei

印象词典里少标记会报错,具体运行哪里报的就忘了,当时记录了参考的链接:

参考:
https://github.com/bojone/bert4keras/blob/c8df00366bf39a83ada2ae935dff72fe13393f8c/bert4keras/tokenizers.py#L46
参考:https://github.com/bojone/bert4keras/issues/126

baiziyuandyufei avatar Oct 08 '21 07:10 baiziyuandyufei

从这个链接下的文件有问题吗? 我看data_utils.py里用了jibea,但bert4keras的代码里没有导入分词器。

这个链接没有问题,是你自己不知道怎么改得有问题。data_utils.py用jieba是做wwm的,跟tokenizer没直接关系。

bojone avatar Oct 08 '21 07:10 bojone

那预训练出的模型,要怎么推断,推断全基于单字,训练时分词?

baiziyuandyufei avatar Oct 08 '21 07:10 baiziyuandyufei

那预训练出的模型,要怎么推断,推断全基于单字,训练时分词?

如果你说的是bert或者roberta,那么训练和推断都没分词。这些基本概念建议自行查阅资料了解。

bojone avatar Oct 08 '21 07:10 bojone

那建议 就把https://github.com/bojone/bert4keras/tree/master/pretraining 这个目录都删了吧,免得引起大家误会。

baiziyuandyufei avatar Oct 08 '21 07:10 baiziyuandyufei

或者,把jieba分词的那一段删掉,而且预训练的模型文件名也不该再用WWM的吧,chinese_L-12_H-768_A-12/vocab.txt这个文件里不该再有多字词,这个文件是不是也是用来训练wwm的。

baiziyuandyufei avatar Oct 08 '21 07:10 baiziyuandyufei

那建议 就把https://github.com/bojone/bert4keras/tree/master/pretraining 这个目录都删了吧,免得引起大家误会。

这个目录实现得很清楚,不会引起什么误会。wwm具体含义是什么,请了解好再来讨论,至少在wwm的实现上,参考脚本的实现完全没有问题。这个预训练脚本放出也不是一天两天了,很多人都读过用过,小问题可能有,但不至于有这种低级错误。有问题建议多反思自己。

bojone avatar Oct 08 '21 07:10 bojone

大哥,训练和预测的预处理都该一致吧,这就算不用BERT都该明白。

baiziyuandyufei avatar Oct 08 '21 07:10 baiziyuandyufei

大哥,训练和预测的预处理都该一致吧,这就算不用BERT都该明白。

不管加不加wwm,训练和预测都没分词,哪里不一致了?你确定你知道wwm是什么了吗?

bojone avatar Oct 08 '21 08:10 bojone

您的wwm确实可以用自己的语料预训练,而且是词级的,很不错。才想着看看bert4keras是否也支持。

baiziyuandyufei avatar Oct 08 '21 08:10 baiziyuandyufei

您的wwm确实可以用自己的语料预训练,而且是词级的,很不错。才想着看看bert4keras是否也支持。

wwm没有硬性规定是word-based还是char-based,不管是word还是char都可以加wwm。

bojone avatar Oct 08 '21 08:10 bojone

373行 https://github.com/bojone/bert4keras/blob/master/pretraining/data_utils.py#373

baiziyuandyufei avatar Oct 08 '21 08:10 baiziyuandyufei

373行 https://github.com/bojone/bert4keras/blob/master/pretraining/data_utils.py#373

如果你执意不去理解整个代码、不去理解wwm的具体含义,非要停留在自己对wwm的幻想中,那么我认为我们没有必要讨论下去了。

bojone avatar Oct 08 '21 08:10 bojone

懂的都懂。。。也是醉了。

baiziyuandyufei avatar Oct 08 '21 08:10 baiziyuandyufei

懂的都懂。。。也是醉了。

至少从目前看来你肯定是不懂wwm的

bojone avatar Oct 08 '21 08:10 bojone

没用过,但是看了看源码意思是给训练时做mask用的,后续转token id各个模型自有处理方法。

WangHexie avatar Oct 08 '21 08:10 WangHexie

@bojone 好吧

baiziyuandyufei avatar Oct 08 '21 08:10 baiziyuandyufei