在一些视频理解任务中,比如分类,VQA等,除了画面信息之外通常还会引入一些音频、文本等信息。为了使视频任务中引入标题信息(无论是否有帮助,但总要尝试),决定利用BERT来提取标题向量。
看了google官方的bert以及huggingface所实现的pytorch版本的transformers,对于一个NLP小白来说可能是由于bert的变种太多实在太过眼花缭乱,所以本文的目标就是得到一个可提取中文文本特征向量的接口。
对我而言,接触一个任务时习惯性的会考虑三个问题:数据、模型以及损失函数。这篇Blog也根据该思路来对BERT做一个学习。
BERT的输入是什么?
该部分直接参考官方的tokenization.py
来说明是如何对输入进行预处理的,其它框架虽然略有不同,但也都是由此演变而来。tokenization.py
中包含了两个分词器:BasicTokenizer
和WordpieceTokenizer
,下面我们根据例子来说明是如何处理的。
给定一段文本: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 | text=convert_to_unicode(text) |
清除无效字符及空白字符
该部分对应于_clean_text(self, text)
函数,主要用于去除无效字符和多余空格。
源码中的ord()
函数是以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值。
整体流程如下:
- 码位=0时