やはり途中で生成されたファイルに不備があるのでは、という疑いが晴れないので学習前までのファイル生成をUbuntuでも行ってみる。
mecab-neologdのインストール
sudo apt -y install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file
git clone https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd
./bin/install-mecab-ipadic-neologd -n -a
最後にyes/noで答えるところが出てくるので、yesと答えると、
/usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd
にインストールされる。
スクリプト中でmecabの設定ファイルを読み込むところがあるが、パスがうまく取得できないようなので、シンボリックリンクを張る
sudo ln -s /etc/mecabrc /usr/local/etc/mecabrc
必要なPythonモジュールをインストールする
pip3 install beautifulsoup4 fugashi ipadic==1.0.0 logzero sentencepiece>=0.1.91 tensorflow>=2.3.0 tensorflow-datasets>=3.2.0 tf-models-official==2.3.0 tqdm tokenizers==0.9.2 transformers==3.4.0 unidic==1.0.2 unidic_lite==1.0.7
git clone https://github.com/cl-tohoku/bert-japanese.git
git clone https://github.com/google-research/bert.git
cd bert-japanese
Wikiの日本語データをダウンロードする
wget https://dumps.wikimedia.org/other/cirrussearch/current/jawiki-20220117-cirrussearch-content.json.gz
たぶんcurrentの下のファイルはどんどん変わり続けるので安定したURLは別途探す必要があるかも
corpusの作成と8つに分割
python make_corpus_wiki.py --input_file jawiki-20220117-cirrussearch-content.json.gz --output_file ./corpus/jawiki-20220117/corpus.txt --min_text_length 10 --max_text_length 200 --mecab_option "-d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd"
python merge_split_corpora.py --input_files ./corpus/jawiki-20220117/corpus.txt --output_dir ./corpus/jawiki-20220117 --num_files 8
tokenizer訓練のためのファイル作成
cat ./corpus/jawiki-20220117/corpus.txt|grep -v '^$'|shuf|head -n 1000000 > ./corpus/jawiki-20220117/corpus_sampled.txt
tokenizer訓練
TOKENIZERS_PARALLELISM=false python train_tokenizer.py --input_files ./corpus/jawiki-20220117/corpus_sampled.txt --output_dir ./tokenizers/jawiki-20220117/wordpiece_unidic_lite --tokenizer_type wordpiece --mecab_dic_type unidic_lite --vocab_size 32768 --limit_alphabet 6129 --num_unused_tokens 10
Ubuntuの場合は頭にTOKENIZERS_PARALLELISM=falseをつけないと一向にファイルが読み込まれず、一日経っても0%のままで絶望しかけたが、元のREADME.mdにこれがあるのに気付いてつけたところ順調に読み込み始めた。
一文字単位のtokenizer用のデータ作成?
head -n 6144 ./tokenizers/jawiki-20220117/wordpiece_unidic_lite/vocab.txt > ./tokenizers/jawiki-20220117/character/vocab.txt
事前訓練用のデータ生成はWindowsと同じはず
今はこれを実行しているところで、完了したところでファイルの中身が同じように成っているかどうかをみてみようと思う
python create_pretraining_data.py --input_file ./corpus/jawiki-20220117/corpus_01.txt --output_file ./bert/jawiki-20220117/wordpiece_unidic_lite/pretraining_data/pretraining_data_01.tfrecord.gz --vocab_file ./tokenizers/jawiki-20220117/wordpiece_unidic_lite/vocab.txt --tokenizer_type wordpiece --mecab_dic_type unidic_lite --do_whole_word_mask --gzip_compress --max_seq_length 512 --max_predictions_per_seq 80 --dupe_factor 10
python create_pretraining_data.py --input_file ./corpus/jawiki-20220117/corpus_02.txt --output_file ./bert/jawiki-20220117/wordpiece_unidic_lite/pretraining_data/pretraining_data_02.tfrecord.gz --vocab_file ./tokenizers/jawiki-20220117/wordpiece_unidic_lite/vocab.txt --tokenizer_type wordpiece --mecab_dic_type unidic_lite --do_whole_word_mask --gzip_compress --max_seq_length 512 --max_predictions_per_seq 80 --dupe_factor 10
python create_pretraining_data.py --input_file ./corpus/jawiki-20220117/corpus_03.txt --output_file ./bert/jawiki-20220117/wordpiece_unidic_lite/pretraining_data/pretraining_data_03.tfrecord.gz --vocab_file ./tokenizers/jawiki-20220117/wordpiece_unidic_lite/vocab.txt --tokenizer_type wordpiece --mecab_dic_type unidic_lite --do_whole_word_mask --gzip_compress --max_seq_length 512 --max_predictions_per_seq 80 --dupe_factor 10
python create_pretraining_data.py --input_file ./corpus/jawiki-20220117/corpus_04.txt --output_file ./bert/jawiki-20220117/wordpiece_unidic_lite/pretraining_data/pretraining_data_04.tfrecord.gz --vocab_file ./tokenizers/jawiki-20220117/wordpiece_unidic_lite/vocab.txt --tokenizer_type wordpiece --mecab_dic_type unidic_lite --do_whole_word_mask --gzip_compress --max_seq_length 512 --max_predictions_per_seq 80 --dupe_factor 10
python create_pretraining_data.py --input_file ./corpus/jawiki-20220117/corpus_05.txt --output_file ./bert/jawiki-20220117/wordpiece_unidic_lite/pretraining_data/pretraining_data_05.tfrecord.gz --vocab_file ./tokenizers/jawiki-20220117/wordpiece_unidic_lite/vocab.txt --tokenizer_type wordpiece --mecab_dic_type unidic_lite --do_whole_word_mask --gzip_compress --max_seq_length 512 --max_predictions_per_seq 80 --dupe_factor 10
python create_pretraining_data.py --input_file ./corpus/jawiki-20220117/corpus_06.txt --output_file ./bert/jawiki-20220117/wordpiece_unidic_lite/pretraining_data/pretraining_data_06.tfrecord.gz --vocab_file ./tokenizers/jawiki-20220117/wordpiece_unidic_lite/vocab.txt --tokenizer_type wordpiece --mecab_dic_type unidic_lite --do_whole_word_mask --gzip_compress --max_seq_length 512 --max_predictions_per_seq 80 --dupe_factor 10
python create_pretraining_data.py --input_file ./corpus/jawiki-20220117/corpus_07.txt --output_file ./bert/jawiki-20220117/wordpiece_unidic_lite/pretraining_data/pretraining_data_07.tfrecord.gz --vocab_file ./tokenizers/jawiki-20220117/wordpiece_unidic_lite/vocab.txt --tokenizer_type wordpiece --mecab_dic_type unidic_lite --do_whole_word_mask --gzip_compress --max_seq_length 512 --max_predictions_per_seq 80 --dupe_factor 10
python create_pretraining_data.py --input_file ./corpus/jawiki-20220117/corpus_08.txt --output_file ./bert/jawiki-20220117/wordpiece_unidic_lite/pretraining_data/pretraining_data_08.tfrecord.gz --vocab_file ./tokenizers/jawiki-20220117/wordpiece_unidic_lite/vocab.txt --tokenizer_type wordpiece --mecab_dic_type unidic_lite --do_whole_word_mask --gzip_compress --max_seq_length 512 --max_predictions_per_seq 80 --dupe_factor 10
ひとまず一つファイルができたところで中身を見てみたところ、
$ less pretraining_data_01.tfrecord
"pretraining_data_01.tfrecord" may be a binary file. See it anyway?
とテキストファイルではないと警告され、実際にあけてみるとところどころ読めるテキストあるけれど基本的にはバイナリファイルであった。Windowsでも同じようなファイルができていたから、ここまではどうやら間違っていなかったようだ。そうすると事前学習ステップか・・・。