mcpField
S
sentencepiece

sentencepiece

github.com/orchestra-research開発14.1k960 回インストール19 週間前に更新
リポジトリ

sentencepiece について

SentencePieceは、言語固有の前処理なしで生テキストを扱う教師なしトークナイザーです。多言語やCJKのモデル開発に向き、サブワードモデルの学習やサンプリングにも対応します。

主な機能

  1. 01生テキストを直接処理
  2. 02BPEとUnigramに対応
  3. 03独自語彙の学習
  4. 04正則化向けトークン化サンプリング
  5. 05テキストのエンコードとデコード

活用シーン

  1. 01多言語モデル向けデータのトークン化
  2. 02中国語・日本語・韓国語の処理
  3. 03サンプリングによる学習データ拡張

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/orchestra-research/ai-research-skills --skill sentencepiece

インストール後、Claude Code で/sentencepieceを入力して読み込まれたか確認します。

同梱ファイルreferences/algorithms.mdreferences/training.md

詳細

SentencePiece - 言語非依存のトークナイゼーション

言語固有の前処理を必要とせず、生のテキストに対して動作する教師なしトークナイザーです。

SentencePiece を使うタイミング

SentencePiece を使うべき場合:

  • 多言語モデルを構築するとき(言語固有のルールが不要)
  • CJK 言語(中国語、日本語、韓国語)を扱うとき
  • 再現可能なトークナイゼーションが必要なとき(決定的な語彙)
  • 生のテキストから学習したいとき(事前トークナイゼーションが不要)
  • 軽量なデプロイが必要なとき(メモリ 6MB、50k 文/秒)

パフォーマンス:

  • 速度: 50,000 文/秒
  • メモリ: 読み込み済みモデルで約 6MB
  • 言語: すべて(言語非依存)

代わりに使うべき選択肢:

  • HuggingFace Tokenizers: 学習が高速で、より柔軟
  • tiktoken: OpenAI モデル(GPT-3.5/4)向け
  • BERT WordPiece: 英語中心のタスク向け

クイックスタート

インストール
# Python
pip install sentencepiece

# C++ (requires CMake)
git clone https://github.com/google/sentencepiece.git
cd sentencepiece
mkdir build && cd build
cmake .. && make -j $(nproc)
sudo make install
モデルの学習
# Command-line (BPE with 8000 vocab)
spm_train --input=data.txt --model_prefix=m --vocab_size=8000 --model_type=bpe

# Python API
import sentencepiece as spm

spm.SentencePieceTrainer.train(
    input='data.txt',
    model_prefix='m',
    vocab_size=8000,
    model_type='bpe'
)

学習時間: 100MB のコーパスで約 1〜2 分

エンコードとデコード
import sentencepiece as spm

# Load model
sp = spm.SentencePieceProcessor(model_file='m.model')

# Encode to pieces
pieces = sp.encode('This is a test', out_type=str)
print(pieces)  # ['▁This', '▁is', '▁a', '▁test']

# Encode to IDs
ids = sp.encode('This is a test', out_type=int)
print(ids)  # [284, 47, 11, 1243]

# Decode
text = sp.decode(ids)
print(text)  # "This is a test"

言語非依存の設計

空白を記号として扱う(▁)
text = "Hello world"
pieces = sp.encode(text, out_type=str)
print(pieces)  # ['▁Hello', '▁world']

# Decode preserves spaces
decoded = sp.decode_pieces(pieces)
print(decoded)  # "Hello world"

基本原則: テキストを生の Unicode として扱い、空白は ▁(メタ記号)で表します。

トークナイゼーションのアルゴリズム

BPE(Byte-Pair Encoding)
spm.SentencePieceTrainer.train(
    input='data.txt',
    model_prefix='bpe_model',
    vocab_size=16000,
    model_type='bpe'
)

使用モデル: mBART

Unigram(デフォルト)
spm.SentencePieceTrainer.train(
    input='data.txt',
    model_prefix='unigram_model',
    vocab_size=8000,
    model_type='unigram'
)

使用モデル: T5、ALBERT、XLNet

学習の設定

主要なパラメータ
spm.SentencePieceTrainer.train(
    input='corpus.txt',
    model_prefix='m',
    vocab_size=32000,
    model_type='unigram',
    character_coverage=0.9995,  # 1.0 for CJK
    user_defined_symbols=['[SEP]', '[CLS]'],
    unk_piece='<unk>',
    num_threads=16
)
文字カバレッジ
言語タイプカバレッジ理由
英語0.9995最も一般的な文字
CJK(中国語)1.0必要なすべての文字
多言語0.9995バランス

エンコードのオプション

サブワード正則化
# Sample different tokenizations
for _ in range(3):
    pieces = sp.encode('tokenization', out_type=str, enable_sampling=True, alpha=0.1)
    print(pieces)

# Output (different each time):
# ['▁token', 'ization']
# ['▁tok', 'en', 'ization']

ユースケース: 頑健性のためのデータ拡張。

よくあるパターン

T5 形式の学習
spm.SentencePieceTrainer.train(
    input='c4_corpus.txt',
    model_prefix='t5',
    vocab_size=32000,
    model_type='unigram',
    user_defined_symbols=[f'<extra_id_{i}>' for i in range(100)],
    unk_id=2,
    eos_id=1,
    pad_id=0
)
transformers との統合
from transformers import T5Tokenizer

# T5 uses SentencePiece internally
tokenizer = T5Tokenizer.from_pretrained('t5-base')
inputs = tokenizer('translate English to French: Hello', return_tensors='pt')

パフォーマンスベンチマーク

学習速度
コーパスBPE (16k)Unigram (8k)
100 MB1〜2 分3〜4 分
1 GB10〜15 分30〜40 分
トークナイゼーション速度
  • SentencePiece: 50,000 文/秒
  • HF Tokenizers: 200,000 文/秒(4 倍高速)

対応モデル

T5 ファミリー: t5-base、t5-large(語彙 32k、Unigram) ALBERT: albert-base-v2(語彙 30k、Unigram) XLNet: xlnet-base-cased(語彙 32k、Unigram) mBART: facebook/mbart-large-50(語彙 250k、BPE)

参考資料

リソース

コメント