NLP之BERT中文文本分类超详细教程

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。
数据准备工作
将下载的预训练模型解压至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=mytask \

 --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
1
运行的时间可能会有点久,视配置而定,会在output_dir下面生成一个eval_results.txt文件:

eval_accuracy = 0.8503984
eval_loss = 0.47183684
global_step = 6588
loss = 0.47183684
 
这样说明我们就运行成功了。在output_dir也会有fine-tune(微调)之后的模型文件。
 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值