SentencePiece adalah tokenizer dan detokenizer teks tanpa pengawasan terutama untuk sistem pembuatan teks berbasis Jaringan Neural di mana ukuran kosakata telah ditentukan sebelumnya sebelum pelatihan model saraf. SentencePiece mengimplementasikan unit subkata (misalnya, byte-pair-encoding (BPE) [Sennrich et al.]) dan model bahasa unigram [Kudo.]) dengan perluasan pelatihan langsung dari kalimat mentah. SentencePiece memungkinkan kita membuat sistem end-to-end murni yang tidak bergantung pada pra/pascapemrosesan khusus bahasa.
Ini bukan produk resmi Google.
Bagi mereka yang belum terbiasa dengan SentencePiece sebagai perangkat lunak/algoritma, Anda dapat membaca pengantar singkatnya di sini.
Fitur | Potongan Kalimat | subkata-nmt | Potongan Kata |
---|---|---|---|
Algoritma yang didukung | BPE, unigram, karakter, kata | BPE | BPE* |
OSS? | Ya | Ya | internal Google |
Regularisasi subkata | Ya | TIDAK | TIDAK |
Perpustakaan Python (pip) | Ya | TIDAK | T/A |
Perpustakaan C++ | Ya | TIDAK | T/A |
Diperlukan pra-segmentasi? | TIDAK | Ya | Ya |
Normalisasi yang dapat disesuaikan (misalnya, NFKC) | Ya | TIDAK | T/A |
Pembuatan id langsung | Ya | TIDAK | T/A |
Perhatikan bahwa algoritma BPE yang digunakan di WordPiece sedikit berbeda dengan BPE asli.
SentencePiece adalah implementasi ulang unit subkata , cara efektif untuk mengatasi masalah kosakata terbuka dalam terjemahan mesin saraf. SentencePiece mendukung dua algoritma segmentasi, byte-pair-encoding (BPE) [Sennrich et al.] dan model bahasa unigram [Kudo.]. Berikut adalah perbedaan tingkat tinggi dari implementasi lainnya.
Model Terjemahan Mesin Neural biasanya beroperasi dengan kosakata tetap. Tidak seperti kebanyakan algoritme segmentasi kata tanpa pengawasan, yang mengasumsikan kosakata tak terbatas, SentencePiece melatih model segmentasi sedemikian rupa sehingga ukuran kosakata akhir tetap, misalnya 8k, 16k, atau 32k.
Perhatikan bahwa SentencePiece menentukan ukuran kosakata akhir untuk pelatihan, yang berbeda dari subword-nmt yang menggunakan jumlah operasi penggabungan. Jumlah operasi penggabungan adalah parameter khusus BPE dan tidak berlaku untuk algoritma segmentasi lainnya, termasuk unigram, kata, dan karakter.
Implementasi sub-kata sebelumnya mengasumsikan bahwa kalimat masukan sudah diberi token sebelumnya. Batasan ini diperlukan untuk pelatihan yang efisien, namun membuat prapemrosesan menjadi rumit karena kita harus menjalankan tokenizer yang bergantung pada bahasa terlebih dahulu. Implementasi SentencePiece cukup cepat untuk melatih model dari kalimat mentah. Hal ini berguna untuk melatih tokenizer dan detokenizer untuk bahasa Mandarin dan Jepang di mana tidak ada spasi eksplisit di antara kata-katanya.
Langkah pertama pemrosesan Natural Language adalah tokenisasi teks. Misalnya, tokenizer standar bahasa Inggris akan mengelompokkan teks "Halo dunia". menjadi tiga token berikut.
[Halo] [Dunia] [.]
Salah satu pengamatannya adalah bahwa masukan asli dan urutan yang diberi token TIDAK dapat dikonversi secara reversibel . Misalnya, informasi yang tidak ada spasi antara “Dunia” dan “.” dihilangkan dari urutan tokenized, karena misalnya, Tokenize(“World.”) == Tokenize(“World .”)
SentencePiece memperlakukan teks masukan hanya sebagai rangkaian karakter Unicode. Spasi putih juga ditangani sebagai simbol normal. Untuk menangani spasi sebagai token dasar secara eksplisit, SentencePiece terlebih dahulu keluar dari spasi dengan simbol meta " " (U+2581) sebagai berikut.
Halo Dunia.
Kemudian teks tersebut disegmentasi menjadi bagian-bagian kecil, misalnya:
[Halo] [ Wor] [ld] [.]
Karena spasi dipertahankan dalam teks yang tersegmentasi, kami dapat melakukan detokenisasi teks tanpa ambiguitas apa pun.
detokenized = ''.join(pieces).replace('▁', ' ')
Fitur ini memungkinkan untuk melakukan detokenisasi tanpa bergantung pada sumber daya khusus bahasa.
Perhatikan bahwa kami tidak dapat menerapkan konversi lossless yang sama saat memisahkan kalimat dengan segmenter kata standar, karena mereka memperlakukan spasi sebagai simbol khusus. Urutan yang diberi token tidak menyimpan informasi yang diperlukan untuk mengembalikan kalimat aslinya.
Regularisasi subkata [Kudo.] dan Provilkov dkk yang putus sekolah adalah metode regularisasi sederhana yang secara virtual menambah data pelatihan dengan pengambilan sampel subkata sambil jalan, yang membantu meningkatkan keakuratan dan ketahanan model NMT.
Untuk mengaktifkan regularisasi subkata, Anda ingin mengintegrasikan pustaka SentencePiece (C++/Python) ke dalam sistem NMT untuk mengambil sampel satu segmentasi untuk setiap pembaruan parameter, yang berbeda dari persiapan data offline standar. Berikut contoh perpustakaan Python. Anda dapat menemukan bahwa 'New York' disegmentasi secara berbeda pada setiap SampleEncode (C++)
atau encode with enable_sampling=True (Python)
. Detail parameter pengambilan sampel dapat ditemukan di kalimatpiece_processor.h.
>>> import sentencepiece as spm
>>> s = spm.SentencePieceProcessor(model_file='spm.model')
>>> for n in range(5):
... s.encode('New York', out_type=str, enable_sampling=True, alpha=0.1, nbest_size=-1)
...
['▁', 'N', 'e', 'w', '▁York']
['▁', 'New', '▁York']
['▁', 'New', '▁Y', 'o', 'r', 'k']
['▁', 'New', '▁York']
['▁', 'New', '▁York']
SentencePiece menyediakan pembungkus Python yang mendukung pelatihan dan segmentasi SentencePiece. Anda dapat menginstal paket biner Python dari SentencePiece dengan.
pip install sentencepiece
Untuk lebih detailnya, lihat modul Python
Alat dan pustaka berikut diperlukan untuk membuat SentencePiece:
Di Ubuntu, alat pembangunan dapat diinstal dengan apt-get:
% sudo apt-get install cmake build-essential pkg-config libgoogle-perftools-dev
Kemudian, Anda dapat membuat dan menginstal alat baris perintah sebagai berikut.
% git clone https://github.com/google/sentencepiece.git
% cd sentencepiece
% mkdir build
% cd build
% cmake ..
% make -j $(nproc)
% sudo make install
% sudo ldconfig -v
Di OSX/macOS, ganti perintah terakhir dengan sudo update_dyld_shared_cache
Anda dapat mengunduh dan menginstal kalimat menggunakan pengelola ketergantungan vcpkg:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install sentencepiece
Port kalimat di vcpkg selalu diperbarui oleh anggota tim Microsoft dan kontributor komunitas. Jika versinya sudah kedaluwarsa, silakan buat masalah atau tarik permintaan pada repositori vcpkg.
Anda dapat mengunduh roda dari halaman rilis GitHub. Kami membuat tanda tangan SLSA3 menggunakan generator slsa-framework/slsa-github-generator OpenSSF selama proses rilis. Untuk memverifikasi biner rilis:
attestation.intoto.jsonl
dari halaman rilis GitHub.slsa-verifier -artifact-path < the-wheel > -provenance attestation.intoto.jsonl -source github.com/google/sentencepiece -tag < the-tag >
pip instal wheel_file.whl
% spm_train --input=<input> --model_prefix=<model_name> --vocab_size=8000 --character_coverage=1.0 --model_type=<type>
--input
: file korpus mentah satu kalimat per baris. Tidak perlu menjalankan tokenizer, normalizer, atau preprocessor. Secara default, SentencePiece menormalkan input dengan Unicode NFKC. Anda dapat memberikan daftar file yang dipisahkan koma.--model_prefix
: awalan nama model keluaran. <model_name>.model
dan <model_name>.vocab
dihasilkan.--vocab_size
: ukuran kosakata, misalnya 8000, 16000, atau 32000--character_coverage
: jumlah karakter yang dicakup oleh model, nilai default yang baik adalah: 0.9995
untuk bahasa dengan kumpulan karakter yang kaya seperti Jepang atau Cina dan 1.0
untuk bahasa lain dengan kumpulan karakter kecil.--model_type
: tipe model. Pilih dari unigram
(default), bpe
, char
, atau word
. Kalimat masukan harus diberi pretokenisasi saat menggunakan tipe word
. Gunakan tanda --help
untuk menampilkan semua parameter pelatihan, atau lihat di sini untuk ikhtisarnya.
% spm_encode --model=<model_file> --output_format=piece < input > output
% spm_encode --model=<model_file> --output_format=id < input > output
Gunakan tanda --extra_options
untuk menyisipkan penanda BOS/EOS atau membalikkan urutan input.
% spm_encode --extra_options=eos (add </s> only)
% spm_encode --extra_options=bos:eos (add <s> and </s>)
% spm_encode --extra_options=reverse:bos:eos (reverse input and add <s> and </s>)
SentencePiece mendukung segmentasi nbest dan pengambilan sampel segmentasi dengan --output_format=(nbest|sample)_(piece|id)
.
% spm_encode --model=<model_file> --output_format=sample_piece --nbest_size=-1 --alpha=0.5 < input > output
% spm_encode --model=<model_file> --output_format=nbest_id --nbest_size=10 < input > output
% spm_decode --model=<model_file> --input_format=piece < input > output
% spm_decode --model=<model_file> --input_format=id < input > output
Gunakan tanda --extra_options
untuk memecahkan kode teks dalam urutan terbalik.
% spm_decode --extra_options=reverse < input > output
% spm_train --input=data/botchan.txt --model_prefix=m --vocab_size=1000
unigram_model_trainer.cc(494) LOG(INFO) Starts training with :
input: "../data/botchan.txt"
... <snip>
unigram_model_trainer.cc(529) LOG(INFO) EM sub_iter=1 size=1100 obj=10.4973 num_tokens=37630 num_tokens/piece=34.2091
trainer_interface.cc(272) LOG(INFO) Saving model: m.model
trainer_interface.cc(281) LOG(INFO) Saving vocabs: m.vocab
% echo "I saw a girl with a telescope." | spm_encode --model=m.model
▁I ▁saw ▁a ▁girl ▁with ▁a ▁ te le s c o pe .
% echo "I saw a girl with a telescope." | spm_encode --model=m.model --output_format=id
9 459 11 939 44 11 4 142 82 8 28 21 132 6
% echo "9 459 11 939 44 11 4 142 82 8 28 21 132 6" | spm_decode --model=m.model --input_format=id
I saw a girl with a telescope.
Anda dapat menemukan bahwa kalimat masukan asli dipulihkan dari urutan id kosakata.
% spm_export_vocab --model=<model_file> --output=<output file>
<output file>
menyimpan daftar kosakata dan probabilitas log emisi. Id kosakata sesuai dengan nomor baris dalam file ini.
By default, SentencePiece uses Unknown (<unk>), BOS (<s>) and EOS (</s>) tokens which have the ids of 0, 1, and 2 respectively. Kita dapat mendefinisikan ulang pemetaan ini dalam fase pelatihan sebagai berikut.
% spm_train --bos_id=0 --eos_id=1 --unk_id=5 --input=... --model_prefix=... --character_coverage=...
Saat mengatur -1 id misalnya bos_id=-1
, token khusus ini dinonaktifkan. Perhatikan bahwa id yang tidak dikenal tidak dapat dinonaktifkan. Kita dapat mendefinisikan id untuk padding (<pad>) sebagai --pad_id=3
.
Jika Anda ingin menetapkan token khusus lainnya, silakan lihat Menggunakan simbol khusus.
spm_encode
menerima opsi --vocabulary
dan --vocabulary_threshold
sehingga spm_encode
hanya akan menghasilkan simbol yang juga muncul dalam kosakata (setidaknya dengan frekuensi tertentu). Latar belakang fitur ini dijelaskan di halaman subword-nmt.
Penggunaannya pada dasarnya sama dengan subword-nmt
. Dengan asumsi bahwa L1 dan L2 adalah dua bahasa (bahasa sumber/target), latih model spm bersama, dan dapatkan kosakata yang dihasilkan untuk masing-masing bahasa:
% cat {train_file}.L1 {train_file}.L2 | shuffle > train
% spm_train --input=train --model_prefix=spm --vocab_size=8000 --character_coverage=0.9995
% spm_encode --model=spm.model --generate_vocabulary < {train_file}.L1 > {vocab_file}.L1
% spm_encode --model=spm.model --generate_vocabulary < {train_file}.L2 > {vocab_file}.L2
perintah shuffle
digunakan untuk berjaga-jaga karena spm_train
memuat 10 juta baris pertama korpus secara default.
Kemudian segmen korpus latih/uji dengan opsi --vocabulary
% spm_encode --model=spm.model --vocabulary={vocab_file}.L1 --vocabulary_threshold=50 < {test_file}.L1 > {test_file}.seg.L1
% spm_encode --model=spm.model --vocabulary={vocab_file}.L2 --vocabulary_threshold=50 < {test_file}.L2 > {test_file}.seg.L2