本文记录对XLNet的实践过程,会在实践和代码分析的过程中,穿插着从代码层面对原理的理解。基本上是按照XLNet代码分析 - 李理的博客里面的顺序,一步步实践的,不过对里面的一些细节针对自己的实践,进行了补充和修改。希望对学习nlp朋友们有所帮助。读者阅读前需要初步了解XLNet的原理,不熟悉的读者请先阅读下面的参考[2]。到了这一步你会对原理有初步的理解,深入的理解和对细节的把握还需要从代码细节入手。文章如有错误还望谅解,欢迎沟通讨论。
分词工具准备
这一步 你需要准备自己的语料,进行分词。和BERT不同,BERT使用Python实现分词和WordPiece的切分;而XLNet使用了Sentence Piece来实现分词和WordPiece切分。因此我们需要首先安装Sentence Piece。
安装Sentence Piece
pip install sentencepiece
如果安装不成功,需要源码安装,需要先安装Bazel,按照下述代码安装,如果成功则可以直接跳过安装bazel步骤,我2条路径都试过,都是可以成功运行后续的程序的。或者可以参照官网的sentencepiece · PyPI 路径安装。
git clone https://github.com/google/sentencepiece.git
cd sentencepiece # Build C++库
bazel build src:all # 安装Python模块
pip install sentencepiece
安装bazel
官方文档:Installing Bazel on Ubuntu - Bazel main
我采用的是以下方式安装方式:
1、安装bazel所需附加包
sudo yum install pkg-config zip g++ zlib1g-dev unzip python
运行完出现以下结果:
![](https://i-blog.csdnimg.cn/blog_migrate/6f0ff641f79ab176ca7452353773fbd4.png)
2、下载bazel包
wget https://github.com/bazelbuild/bazel/releases/download/0.21.0/bazel-0.21.0-installer-linux-x86_64.sh
3、运行安装程序
chmod +x bazel-0.21.0-installer-linux-x86_64.sh
./bazel-0.21.0-installer-linux-x86_64.sh --use
运行完出现以下结果:
![](https://i-blog.csdnimg.cn/blog_migrate/10e43d27dde538ff87f5ad86d3dc0cba.png)
4、添加环境变量到~/.bashrc
export PATH="$PATH:$HOME/bin"
5、Build C++库
./bazel-0.21.0-installer-linux-x86_64.sh build src:all
运行完出现以下结果:
![](https://i-blog.csdnimg.cn/blog_migrate/47608ebd34e5e8a50dfeacddef102dec.png)
下载训练好的分词模型:
# 请科学上网
wget https://storage.googleapis.com/xlnet/released_models/cased_L-24_H-1024_A-16.zip
unzip cased_L-24_H-1024_A-16.zip
解压后里面有个训练好的.model文件,就是data_utils.py 文件的输入参数 sp_path。你也可以使用spm_train 工具的重新训练(未尝试)。做完这些我们就为运行data_utils.py 文件里面的代码做好了准备
data_utils.py代码分析
为了便于分析代码,我们先下载代码
git clone https://github.com/zihangdai/xlnet.git
<