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

摘要

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

程序目录结构

利用bert预训练模型进行文本分类_第1张图片
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%。留个笔记用的时候省的找了。

你可能感兴趣的:(深度学习,bert,情感分类,自然语言处理)