SentencePiece
https://github.com/google/sentencepiece
https://arxiv.org/abs/1808.06226
neural networkベースのテキスト生成用の教師なしテキストトークナイザー
形態素解析っぽい
space区切りがない日本語等にも扱える
作者による記事
https://qiita.com/taku910/items/7e52f1e58d0ea6e7859c
MeCabやKyTeaといった単語分割ソフトウエアとは趣旨や目的が異なる
語彙サイズに依存した計算量が必要となるめ、大規模な語彙を扱えません。高頻度語彙のみに限定することで計算量の問題は回避できますが、低頻度語が捨てられてしまいます。
サブワード
上記の問題を解決する
サブワードのアイデアは非常に簡単です。要は、低頻度語は文字や部分文字列にフォールバックしましょうというだけです。具体的には、事前にテキストを単語分割し、各単語の頻度を求めておきます。このときに、高頻度の単語は1単語として扱い、低頻度語はより短い単位に分割します。最終的なトークン数が事前に与えられたサイズ(通常数千から数万以下)になるように分割を進めていきます。
英語等のヨーロッパ言語の場合、単語の同定は容易ですが、日本語・中国語にサブワードを適用しようとすると、事前にMeCabやKyTea等で分割しないといけません。この事前の分割処理をなんとか駆逐できないかと思って作ったのが Sentencepieceです。
Sentencepieceは、単語列からスタートするのではなく、生文から直接分割を学習します。アイデアはそれだけですが、以下のような拡張を加えています。
BPEの高速化
Sennrichらが単語リストからBPEを学習した理由に計算量があります。ナイーブに実装すると計算量はO(n^2)(nはテキスト長)になるため、単語分割による探索空間の削減は必須でした。Sentencepieceでは O(n log n)のアルゴリズムを採用しており、大規模な生文から直接学習・分割が可能です。
言語モデルベースの分割
BPEとは別に、言語モデルベースの分割手法も実装しています。大雑把な比較として、BPEはトークン数を目的関数にする、辞書に基づく圧縮、言語モデルは尤度を最大化するエントロピー圧縮とみなせます。どちらもテキストを圧縮するという意味では同じです。最終的な分割結果を見ると、BPEの貪欲法によるエラーが散見され、言語モデルのほうが正しい分割をしているようです。2
End to End 処理に向けたテキストの可逆分割
これは後述します。