Coda

論文メモ SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing

February 29, 2020

SentencePieceは、深層学習向けのトークナイザ・脱トークナイザである。 特定の言語を意識した処理がないため、あらゆるテキストに利用できる。 本論文では、C++やPythonによる実装と翻訳への適用実験について書かれている。 アルゴリズムの解説は、Sennrich et al.Kudo.にゆずられている。 これらの論文について2019年7月13日の記事と2019年7月17日の記事で解説している。

SentencePieceは、テキストを、単語の部分文字列であるサブワードに分割する。 実験では翻訳性能(BLEU)で評価されるように、翻訳への応用が意図されている。 深層学習による翻訳では、扱える語彙数に上限がある。 頻出度の低い単語や未知語の翻訳性能を限られた語彙数のもとで上げるために、音素や形態素をヒントに未知の単語を翻訳できることに着目し、 単語より粒度の小さいサブワードをトークンとして扱う。 本論文における日英の翻訳性能評価では、ベースモデルにおけるワードモデルと比べ、ユニグラムのSentencePieceは一貫して高かった。 ただし、事前にトークナイズした結果をSentencePieceに渡した場合と、SentencePieceだけでトークナイズした場合では明らかな性能の優劣がみられなかった。

SentencePieceは、Normalizer, Trainer, Encoder, *Decoder*と呼ばれるコンポーネントからなる。 *Normalizer*は、Unicode正規化のように役割が等しく文字コードが異なる文字を統一する。 *Trainer*は、正規化されたコーパスから、サブワードにトークナイズするモデルを生成する。 *Encoder*は、テキストを正規化した上でモデルでサブワード列に変換する。 *Decoder*は、サブワード列を正規化されたテキストに変換する。

*Decoder*によるテキストへの変換では、サブワード列を正規化される前のテキストに復元することができる。 これはlossless tokenizationと呼ばれ、次のような性質がある。

Decode(Encode(Normalize(text))) = Normalize(text)

背景には、SentencePieceが、空白を_(U+2581)に置換したうえで、_を含めた全ての文字を等価に扱い、サブワードには空白_も含まれることがある。


論文はこちらからダウンロードできます。