Python 3.14で標準ライブラリにZstandard圧縮が追加された。これだけなら地味なアップデートに見える。しかし、圧縮をテキスト分類に使うと面白いことが起きる。そこで今回は、圧縮ベースのテキスト分類の仕組みと実践手順を解説する。
Python 3.14のZstandard対応とは
ZstandardはFacebookが開発した圧縮アルゴリズムだ。gzipより圧縮率が高く、しかも速い。以前はpipで外部ライブラリを入れる必要があった。しかし、PEP 784に基づいてPython 3.14の標準ライブラリに組み込まれた。つまり、追加インストールなしで使える。
使い方もシンプルだ。compression.zstdモジュールからcompress関数とdecompress関数を呼ぶだけだ。そのため、既存のgzip処理を置き換えるのも簡単だ。さらに、圧縮レベルの調整で速度と圧縮率のバランスを取れる。実際、デフォルト設定でもgzipの数倍速い。
圧縮でテキスト分類ができる仕組み
圧縮ベースのテキスト分類は直感に反するアイデアだ。しかし、理論的な裏付けがある。圧縮アルゴリズムはデータのパターンを学習する。つまり、似たテキストを多く圧縮した後なら、同種のテキストをより効率的に圧縮できる。
具体的には、こう動く。まずカテゴリごとにコンプレッサーを用意する。次に、各カテゴリのテキストでコンプレッサーを訓練する。そして分類したい文書を各コンプレッサーで圧縮する。最も小さく圧縮できたコンプレッサーのカテゴリが答えだ。なぜなら、似たパターンを知っているほど効率よく圧縮できるからだ。
Zstandardにはインクリメンタル圧縮機能がある。これはコンプレッサーがチャンク間でコンテキストを保持する仕組みだ。そのため、テキストを次々に流し込むとパターンの学習が進む。実際、ニュースグループデータで91%の分類精度が報告されている。しかも処理は2秒未満だ。
実践手順とコードの流れ
まず、分類カテゴリごとの学習データを準備する。たとえば、スポーツ記事100件、技術記事100件、政治記事100件のように分ける。次に、各カテゴリでZstdCompressorを作成し、学習データを順番に圧縮する。この段階でコンプレッサーは各カテゴリのパターンを覚える。
分類時は、新しいテキストを全カテゴリのコンプレッサーに通す。そして圧縮後のサイズを比較する。最も小さいサイズのカテゴリに分類する。実際のコードは数十行で書ける。したがって、機械学習のフレームワークを導入する必要がない。
また、辞書機能を使うとさらに精度が上がる。具体的には、カテゴリごとの学習データからZstd辞書を作成する。辞書にはカテゴリ特有の頻出パターンが凝縮される。そのため、少ないデータでも高い分類精度が得られる。
メリットと注意点
最大のメリットは軽さだ。GPUが不要で、CPUだけで高速に動作する。さらに、モデルの学習時間がほぼゼロだ。テキストを圧縮するだけなので、BERTのように何時間もファインチューニングする必要がない。そのため、リソースの限られた環境でも使える。
しかし、万能ではない。長い文書の微妙なニュアンスの違いは捉えにくい。また、カテゴリ数が多くなると精度が下がる傾向がある。とはいえ、シンプルな分類タスクには十分な性能を発揮する。特に、前処理としてざっくり分類したい場面に向いている。
なお、Python 3.14未満の環境でもpython-zstandardパッケージで同じことができる。ただし、標準ライブラリ版のほうがAPIが整理されている。このように、圧縮ベースのテキスト分類はシンプルで実用的だ。機械学習に頼らなくても分類は可能だと覚えておくと、選択肢が広がるだろう。