learning-to-bert

在一些视频理解任务中,比如分类,VQA等,除了画面信息之外通常还会引入一些音频、文本等信息。为了使视频任务中引入标题信息(无论是否有帮助,但总要尝试),决定利用BERT来提取标题向量。

看了google官方的bert以及huggingface所实现的pytorch版本的transformers,对于一个NLP小白来说可能是由于bert的变种太多实在太过眼花缭乱,所以本文的目标就是得到一个可提取中文文本特征向量的接口。

对我而言,接触一个任务时习惯性的会考虑三个问题:数据、模型以及损失函数。这篇Blog也根据该思路来对BERT做一个学习。

BERT的输入是什么?

该部分直接参考官方的tokenization.py来说明是如何对输入进行预处理的,其它框架虽然略有不同,但也都是由此演变而来。tokenization.py中包含了两个分词器:BasicTokenizerWordpieceTokenizer,下面我们根据例子来说明是如何处理的。

给定一段文本:text=“新垣结衣(Aragaki Yui),1988年6月11日出生于日本冲绳县那霸市。日本女演员、歌手、模特\r\n”。

BasicTokenizer

BasicTokenizer是一个初步分词器。对于一个输入文本,处理流程为:转unicode->去除特殊字符->处理中文->按空格分词->去除多余字符和标点分词->再次按空格分词。

转unicode编码

具体可以看convert_to_unicode(text)函数,大概流程是:对python3而言,输入为str类型时直接返回,为bytes型时转为unicode类型;对python2而言,输入为str类型时则转为unicode类型,为unicode类型时则直接返回。

经过转码处理之后,text和原来相同:

1
2
3
>>> text=convert_to_unicode(text)
>>> text
'新垣结衣(Aragaki Yui),1988年6月11日出生于日本冲绳县那霸市。日本女演员、歌手、模特\r\n'

清除无效字符及空白字符

该部分对应于_clean_text(self, text)函数,主要用于去除无效字符和多余空格。

源码中的ord()函数是以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值。

整体流程如下:

  • 码位=0时