bert模型是Google在2018年10月发布的语言表示模型,Bert在NLP领域横扫了11项任务的最优结果,可以说是现今最近NLP中最重要的突破。Bert模型的全称是Bidirectional Encoder Representations 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

数据准备工作

  1. 将下载的预训练模型解压至vocab_file文件夹中,文件名可以任意,后续在运行python时可以指定。
  2. 将你的语料分成3个文件,分别为train.tsvtest.tsvdev.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

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐