2025-07-23 13:06:06 +03:00
|
|
|
|
from simple_llm.tokenizer.bpe import BPE
|
2025-07-11 12:21:33 +03:00
|
|
|
|
from simple_llm.tokenizer.simple_bpe import SimpleBPE
|
|
|
|
|
|
from simple_llm.tokenizer.optimize_bpe import OptimizeBPE
|
|
|
|
|
|
import time
|
|
|
|
|
|
|
2025-07-23 13:06:06 +03:00
|
|
|
|
def compare_tokenizers(text, vocab_size=50):
|
|
|
|
|
|
"""Сравнивает разные реализации BPE"""
|
|
|
|
|
|
print(f"\n=== Анализ текста: '{text[:20]}...' ===")
|
2025-07-11 12:21:33 +03:00
|
|
|
|
|
2025-07-23 13:06:06 +03:00
|
|
|
|
# 1. Базовая реализация BPE
|
|
|
|
|
|
start = time.time()
|
|
|
|
|
|
bpe = BPE(vocab_size=vocab_size)
|
|
|
|
|
|
bpe.fit(text)
|
|
|
|
|
|
base_time = time.time() - start
|
|
|
|
|
|
|
|
|
|
|
|
print("\n[Базовая реализация BPE]")
|
|
|
|
|
|
print(f"Время обучения: {base_time:.4f} сек")
|
|
|
|
|
|
print(f"Размер словаря: {len(bpe.vocab)}")
|
|
|
|
|
|
print("Примеры токенов:", list(bpe.vocab)[:10], "...")
|
|
|
|
|
|
|
|
|
|
|
|
# 2. SimpleBPE
|
2025-07-11 12:21:33 +03:00
|
|
|
|
start = time.time()
|
|
|
|
|
|
simple_bpe = SimpleBPE(vocab_size=vocab_size)
|
|
|
|
|
|
simple_bpe.fit(text)
|
|
|
|
|
|
simple_time = time.time() - start
|
|
|
|
|
|
|
2025-07-23 13:06:06 +03:00
|
|
|
|
print("\n[SimpleBPE]")
|
2025-07-11 12:21:33 +03:00
|
|
|
|
print(f"Время обучения: {simple_time:.4f} сек")
|
|
|
|
|
|
print(f"Размер словаря: {len(simple_bpe.vocab)}")
|
|
|
|
|
|
|
2025-07-23 13:06:06 +03:00
|
|
|
|
# 3. OptimizeBPE
|
2025-07-11 12:21:33 +03:00
|
|
|
|
start = time.time()
|
|
|
|
|
|
opt_bpe = OptimizeBPE(vocab_size=vocab_size)
|
|
|
|
|
|
opt_bpe.fit(text)
|
|
|
|
|
|
opt_time = time.time() - start
|
|
|
|
|
|
|
2025-07-23 13:06:06 +03:00
|
|
|
|
print("\n[OptimizeBPE]")
|
2025-07-11 12:21:33 +03:00
|
|
|
|
print(f"Время обучения: {opt_time:.4f} сек")
|
|
|
|
|
|
print(f"Размер словаря: {len(opt_bpe.vocab)}")
|
2025-07-12 11:46:57 +03:00
|
|
|
|
|
2025-07-23 13:06:06 +03:00
|
|
|
|
# Сравнение производительности
|
|
|
|
|
|
if opt_time > 0:
|
|
|
|
|
|
print(f"\nОптимизированная версия быстрее SimpleBPE в {simple_time/opt_time:.1f} раз")
|
|
|
|
|
|
|
|
|
|
|
|
# Демонстрация работы на примерах
|
|
|
|
|
|
test_phrases = [
|
|
|
|
|
|
text.split()[0], # первое слово
|
|
|
|
|
|
text[:10], # часть текста
|
|
|
|
|
|
"неизвестное_слово", # OOV
|
|
|
|
|
|
"спецсимволы: 123, !@#"
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
print("\n=== Примеры кодирования/декодирования ===")
|
2025-07-12 11:46:57 +03:00
|
|
|
|
for phrase in test_phrases:
|
2025-07-23 13:06:06 +03:00
|
|
|
|
print(f"\nФраза: '{phrase}'")
|
|
|
|
|
|
|
|
|
|
|
|
encoded = bpe.encode(phrase)
|
|
|
|
|
|
decoded = bpe.decode(encoded)
|
|
|
|
|
|
print(f"BPE: {encoded} -> '{decoded}'")
|
|
|
|
|
|
|
|
|
|
|
|
encoded = simple_bpe.encode(phrase)
|
|
|
|
|
|
decoded = simple_bpe.decode(encoded)
|
|
|
|
|
|
print(f"SimpleBPE: {encoded} -> '{decoded}'")
|
|
|
|
|
|
|
2025-07-12 11:46:57 +03:00
|
|
|
|
encoded = opt_bpe.encode(phrase)
|
|
|
|
|
|
decoded = opt_bpe.decode(encoded)
|
2025-07-23 13:06:06 +03:00
|
|
|
|
print(f"OptimizeBPE: {encoded} -> '{decoded}'")
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
|
# Тестовые тексты разной сложности
|
|
|
|
|
|
texts = [
|
|
|
|
|
|
"мама мыла раму, папа пил какао",
|
|
|
|
|
|
"коты бегают быстро, собаки лают громко",
|
|
|
|
|
|
"искусственный интеллект меняет мир вокруг нас",
|
|
|
|
|
|
"BPE (Byte Pair Encoding) - популярный алгоритм токенизации"
|
|
|
|
|
|
]
|
2025-07-11 12:21:33 +03:00
|
|
|
|
|
2025-07-23 13:06:06 +03:00
|
|
|
|
for text in texts:
|
|
|
|
|
|
compare_tokenizers(text)
|
|
|
|
|
|
|
|
|
|
|
|
print("\n=== Тестирование завершено ===")
|
2025-07-11 12:21:33 +03:00
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2025-07-23 13:06:06 +03:00
|
|
|
|
main()
|