BERT介绍及中文文本相似度任务实践

BERT简介

BERT全称 Bidirectional Encoder Representations from Transformers,是一种新的语言模型。自Google在2018年10月底公布BERT在11项NLP任务中的卓越表现后,BERT引起了社区极大的关注与讨论,被认为是 NLP 领域的极大突破。

BERT是一种预训练语言表示的方法,在大量文本语料上训练了一个通用的“语言理解”模型,然后用这个模型去执行各类下游子任务。它是第一个用在预训练NLP上的无监督、深度双向系统。

Google已开放源码,并提供了预训练模型的下载地址,这些模型已经在大规模数据集上进行了预训练。
git地址: google-research/bert

当然git上还有其他版本的实现,可自行百度。

关于BERT的理论部分,可参照其他博客,该文后面主要对BERT的上手实践进行记录。。

BERT源码分析

1、从git上克隆代码

使用如下命令:

git clone https://github.com/google-research/bert

2、下载预训练模型

git上给出了以下预训练模型,可根据需要进行下载:

其中,最后一个是针对中文的预训练模型。

由于接下来的工作是对中文进行处理,因此下载最后一个模型,文件名为 chinese_L-12_H-768_A-12.zip。将其解压至bert文件夹,包含以下三种文件:

  • 配置文件(bert_config.json):用于指定模型的超参数
  • 词典文件(vocab.txt):用于WordPiece 到 Word id的映射
  • Tensorflow checkpoint(bert_model.ckpt):包含了预训练模型的权重(实际包含三个文件)

3、代码结构

BERT的本质上是一个两段式的NLP模型。第一阶段:Pre-training,利用无标记的语料训练一个语言模型;第二阶段:Fine-tuning,利用预训练好的语言模型,完成具体的NLP下游任务。

我们在下载的预训练模型的基础上,进行Fine-tuning,因此着重介绍微调的代码使用。

下图是bert的源码结构:
bert源码结构
其中, run_classifier.pyrun_squad.py这两个文件是用来做fine-tuning的。
extract_features.py文件从名称来看可知是用来提取特征向量的,后面文章再具体介绍。

4、 run_classifier.py文件(中文文本相似度任务fine-tuning)

接下来,以 中文文本相似度 任务为例,介绍进行 fine-tuning的流程。

打开run_classifier.py文件,查看其文件结构,可以如下看到几个类,下图是run_classifier.py文件中所包含的几个数据处理类
数据处理类
其中,几个****Processor的类,都继承于同一个父类DataProcessor(object),该父类提供了 4 个抽象方法,如下图:
DataProcessor类
由名称我们可知:前三个方法是获取 训练、验证、测试的输入数据,第四个方法是获取labels
对于我们处理自己的数据,就需要自定义新的数据类,并重写这四个方法,从而实现数据的获取过程。

1. 自定义数据类

具体的实现方法可以参考其他几个类的实现过程。

现有类分析

假设我们数据类取名为SimProcessor,具体如何实现4个方法呢,我们不妨来看看其中一个数据类,如XnliProcessor,以get_train_examples()函数get_labels()函数为例分析:

def get_train_examples(self, data_dir): # 获取训练数据
    """See base class."""
    lines = self._read_tsv(
        os.path.join(data_dir, "multinli",
                     "multinli.train.%s.tsv" % self.language)) # 读取训练文件,后缀为.tsv
    examples = [] # 空列表
    for (i, line) in enumerate(lines): # 逐行读取
        if i == 0:
            continue
        guid = "train-%d" % (i)
        text_a = tokenization.convert_to_unicode(line[0]) # 句子A
        text_b = tokenization.convert_to_unicode(line[1]) # 句子B
        label = tokenization.convert_to_unicode(line[2]) # label
        if label == tokenization.convert_to_unicode(
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值