利用bert预训练模型进行文本分类

该文章已经过时了,可以用Transformer来代替,更简洁方便
https://mp.weixin.qq.com/s/GmPGWHegdX5DgpCRi_BoMg

摘要

从git下载bert程序,下载bert预训练模型,自行标注数据,实现数据集加载程序,bert进行分类模型训练,评估。
bert和模型地址:https://github.com/google-research/bert

程序目录结构

在这里插入图片描述
bert文件夹:git clone的项目
cased_L12_H768_A12文件夹:下载bert模型
data文件夹:自行标注的数据
output文件夹:训练后保存的模型

数据说明

train.csv:训练数据集,需要有label
dev.csv:开发集,需要有label,模型评估准确性等指标
test.csv:测试集,不需要label,模型评价给出每个数据分类概率

第一列是标签,0表示负情绪,1表示正情绪,如下
1,l like this book
0,I dislike this book

run_classier.py添加代码

(1)添加数据加载class

class MyProcessor(DataProcessor):
    """
    My data processor
    """
    def _read_csv(self, data_dir, file_name):
        df = pd.read_csv(data_dir+file_name, header=None)
        return df

    def get_train_examples(self, data_dir):
        df = self._read_csv(data_dir, "train.csv")

        examples = []
        for row in df.iterrows():
            guid = "train-%d" % (row[0])
            text_a = tokenization.convert_to_unicode(row[1][1])
            label = tokenization.convert_to_unicode(str(row[1][0]))
            examples.append(
                InputExample(guid=guid, text_a=text_a, label=label))
        return examples

    def get_dev_examples(self, data_dir):
        df = self._read_csv(data_dir, "dev.csv")

        examples = []
        for row in df.iterrows():
            guid = "dev-%d" % (row[0])
            text_a = tokenization.convert_to_unicode(row[1][1])
            label = tokenization.convert_to_unicode(str(row[1][0]))
            examples.append(
                InputExample(guid=guid, text_a=text_a, label=label))

        return examples

    def get_test_examples(self, data_dir):
        df = self._read_csv(data_dir, "test.csv")

        examples = []
        for row in df.iterrows():
            guid = "test-%d" % (row[0])
            text_a = tokenization.convert_to_unicode(row[1][1])
            label = tokenization.convert_to_unicode(str(row[1][0]))
            examples.append(
                InputExample(guid=guid, text_a=text_a, label=label))
        return examples

    def get_labels(self):
        return ["0", "1"]

(2)在main(_)函数添加MyProcessor

def main(_):
    tf.logging.set_verbosity(tf.logging.INFO)
    processors = {
        "cola": ColaProcessor,
        "mnli": MnliProcessor,
        "mrpc": MrpcProcessor,
        "xnli": XnliProcessor,
        "my": MyProcessor
    }

训练

在bert_model_test文件夹下,terminal输入命令如下
(1)将python工作目录制定到bert
export PYTHONPATH=$PYTHONPATH:pwd:pwd/bert
(2)训练命令

python bert/run_classifier.py --data_dir=data/ --task_name=my --vocab_file=cased_L12_H768_A12/vocab.txt --bert_config_file=cased_L12_H768_A12/bert_config.json --output_dir=output/ --do_train=true   --do_eval=true   --init_checkpoint=cased_L12_H768_A12/bert_model.ckpt --max_seq_length=32  --train_batch_size=32  --learning_rate=5e-5  --num_train_epochs=1.0 --save_checkpoints_steps=100 --iterations_per_loop=100

参数说明:
data_dir:数据所在目录
task_name:main(_)里边自定义任务名
output_dir:模型训练后保存路径
do_train:是否执行训练
do_eval:是否在dev集评估,可给出准确率
max_seq_length:cell数量(该实验128就很好了)
train_batch_size:每次迭代输入数据量
num_train_epochs:训练数据集训练的轮数
save_checkpoints_steps:每训练多少步存储一次模型(一个batch算一步)
iterations_per_loop:How many steps to make in each estimator call,有待研究,先和save_checkpoints_steps一样,和默认一样。

预测

python bert/run_classifier.py --data_dir=data/ --task_name=my --vocab_file=cased_L12_H768_A12/vocab.txt --bert_config_file=cased_L12_H768_A12/bert_config.json --output_dir=output/ --do_predict=true --init_checkpoint=output --max_seq_length=32

输出是若干列概率,如二分类
0.123 0.877
0.933 0.067

结论

bert训练有点慢,模型输出大概1.3G,比用tf实现的lstm情感分类,dev数据集准确率可提高4%~5%。自建英文数据集在2000多条,标的还算认真,dev准确率lstm能到89%,bert准确率可到94%。留个笔记用的时候省的找了。

  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值