bert模型是Google在2018年10月发布的语言表示模型,Bert在NLP领域横扫了11项任务的最优结果,可以说是现今最近NLP中最重要的突破。Bert模型的全称是Bidirectional EncoderRepresentations from Transformers,是通过训练Masked Language Model和预测下一句任务得到的模型。关于Bert具体训练的细节和更多的原理,有兴趣的读者可以去看在arXiv上的原文。本篇文章从实践入手,带领大家进行Bert的中文文本分类教程。
文件准备工作
- 下载bert源代码 : https://github.com/google-research/bert
- 下载bert的预训练模型:https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip
Google提供了多种预训练好的bert模型,有针对不同语言的和不同模型大小的。对于中文模型,我们使用Bert-Base, Chinese。
数据准备工作
- 将下载的预训练模型解压至vocab_file文件夹中,文件名可以任意,后续在运行python时可以指定。
- 将你的语料分成3个文件,分别为train.tsv,test.tsv,dev.tsv三个,比例一般为7:2:1,放入一个data_dir文件夹下,tsv文件是类似于csv,只不过分割符号有所区别csv为,,而tsv为\t,即tab键。当然也可以自己任意的文件格式或者分割符号,只不过需要在后续步骤中文件处理的时候个性化度高一点。
编码
- 在bert文件夹下的run_classifier.py中的def main(_):函数中将processors的内容增加为
processors = {
"cola": ColaProcessor,
"mnli": MnliProcessor,
"mrpc": MrpcProcessor,
"xnli": XnliProcessor,
"cus": CustomProcessor
}
"cus": CustomProcessor 为新增的一个处理类,cus为自己定义的任务名,在后续运行run_classifier.py时会指定。
- 实现如下CustomProcessor
class CustomProcessor(DataProcessor):
def get_train_examples(self, data_dir):
return self._create_examples(
self._read_tsv(os.path.join(data_dir, "train.tsv")), "train")
def get_dev_examples(self, data_dir):
return self._create_examples(
self._read_tsv(os.path.join(data_dir, "dev.tsv")), "dev")
def get_test_examples(self, data_dir):
return self._create_examples(
self._read_tsv(os.path.join(data_dir, "test.tsv")), "test")
def get_labels(self):
# 这里返回的为具体的你的分类的类别
return ["1", "2", "3", "4", "5", "12", "14"]
def _create_examples(self, lines, set_type):
"""Creates examples for the training and dev sets."""
examples = []
for (i, line) in enumerate(lines):
guid = "%s-%s" % (set_type, i)
text_a = tokenization.convert_to_unicode(line[1])
label = tokenization.convert_to_unicode(line[0])
examples.append(
InputExample(guid=guid, text_a=text_a, text_b=None, label=label))
return examples
将CustomProcessor放置在和其他Processor并列的位置。
编写运行脚本
新建一个运行脚本文件名为“run.sh”,将文件内容编辑为:
export DATA_DIR=上面自己建的语料路径
export BERT_BASE_DIR=预训练模型所在路径
python run_classifier.py \
--task_name=cus \
--do_train=true \
--do_eval=true \
--data_dir=$DATA_DIR/ \
--vocab_file=$BERT_BASE_DIR/vocab.txt \
--bert_config_file=$BERT_BASE_DIR/bert_config.json \
--init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
--max_seq_length=128 \
--train_batch_size=32 \
--learning_rate=2e-5 \
--num_train_epochs=3.0 \
--output_dir=/output
下面的几个参数,do_train代表是否进行fine tune,do_eval代表是否进行evaluation,还有未出现的参数do_predict代表是否进行预测。如果不需要进行fine tune,或者显卡配置太低的话,可以将do_trian去掉。max_seq_length代表了句子的最长长度,当显存不足时,可以适当降低max_seq_length。
运行脚本
./run.sh
运行的时间可能会有点久,视配置而定,会在output_dir下面生成一个eval_results.txt文件:
eval_accuracy = 0.8503984
eval_loss = 0.47183684
global_step = 6588
loss = 0.47183684
这样说明我们就运行成功了。在output_dir也会有fine-tune(微调)之后的模型文件。
代码github地址:https://github.com/cy576013581/text-classification.git
本文暂时没有评论,来添加一个吧(●'◡'●)