<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tokenizer on [ MECANIK DEV ]</title><link>https://mecanik.dev/en/tags/tokenizer/</link><description>Recent content in Tokenizer on [ MECANIK DEV ]</description><generator>Hugo</generator><language>en</language><copyright>Copyright © 2020-{year} by [ MECANIK DEV ]. All Rights Reserved.</copyright><lastBuildDate>Thu, 07 Aug 2025 20:00:00 +0100</lastBuildDate><atom:link href="https://mecanik.dev/en/tags/tokenizer/index.xml" rel="self" type="application/rss+xml"/><item><title>Tiny BPE Trainer – A Fast and Lightweight BPE Trainer in C++</title><link>https://mecanik.dev/en/posts/tiny-bpe-trainer-a-fast-and-lightweight-bpe-trainer-in-c++/</link><pubDate>Thu, 07 Aug 2025 20:00:00 +0100</pubDate><guid>https://mecanik.dev/en/posts/tiny-bpe-trainer-a-fast-and-lightweight-bpe-trainer-in-c++/</guid><description>&lt;h2 id="introducing-tiny-bpe-trainer">Introducing Tiny BPE Trainer&lt;/h2>
&lt;p>Most modern NLP models today from GPT to RoBERTa, rely on subword tokenization using &lt;strong>Byte Pair Encoding (BPE)&lt;/strong>. But what if you want to train your own vocabulary in pure C++?&lt;/p>
&lt;p>Meet &lt;strong>Tiny BPE Trainer&lt;/strong> - a blazing-fast, header-only BPE trainer written in modern C++17/20, with &lt;strong>zero dependencies&lt;/strong>, full &lt;strong>UTF-8 support&lt;/strong>, and HuggingFace-compatible output (&lt;code>vocab.txt&lt;/code>, &lt;code>merges.txt&lt;/code>).&lt;/p>
&lt;h3 id="why-another-bpe-trainer">Why Another BPE Trainer?&lt;/h3>
&lt;p>Because existing options are often:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Python-only&lt;/strong>, with heavy runtime dependencies (Rust, Protobuf, etc.)&lt;/li>
&lt;li>Not easily embeddable in &lt;strong>C++ applications&lt;/strong>&lt;/li>
&lt;li>Not focused on &lt;strong>speed&lt;/strong>, &lt;strong>simplicity&lt;/strong>, or &lt;strong>cross-platform usage&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>Tiny BPE Trainer is:&lt;/p></description></item><item><title>A Fast, UTF-8 Aware C++ Tokenizer for NLP &amp; ML</title><link>https://mecanik.dev/en/posts/a-fast-utf-8-aware-c++-tokenizer-for-nlp-ml/</link><pubDate>Wed, 06 Aug 2025 06:00:00 +0100</pubDate><guid>https://mecanik.dev/en/posts/a-fast-utf-8-aware-c++-tokenizer-for-nlp-ml/</guid><description>&lt;h2 id="introducing-modern-text-tokenizer">Introducing Modern Text Tokenizer&lt;/h2>
&lt;p>Modern natural language processing (NLP) models like BERT, DistilBERT, and other transformer-based architectures rely heavily on effective tokenization. But C++ developers often face limited options like bloated dependencies, poor Unicode support, or lack of compatibility with vocab-based encoders.&lt;/p>
&lt;p>That&amp;rsquo;s why I created &lt;strong>Modern Text Tokenizer&lt;/strong> - a blazing-fast, &lt;strong>header-only&lt;/strong> C++ tokenizer that&amp;rsquo;s &lt;strong>UTF-8 aware&lt;/strong>, &lt;strong>zero-dependency&lt;/strong>, and &lt;strong>ML-ready&lt;/strong> out of the box.&lt;/p>
&lt;h3 id="what-makes-it-unique">What Makes It Unique?&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Zero Dependencies&lt;/strong> – No Boost, no ICU, no external libs.&lt;/li>
&lt;li>&lt;strong>UTF-8 Safe&lt;/strong> – Correctly handles multilingual text, emojis, and multibyte characters.&lt;/li>
&lt;li>&lt;strong>Header-Only&lt;/strong> – Drop it into your project and go.&lt;/li>
&lt;li>&lt;strong>Vocabulary Encoding&lt;/strong> – Load &lt;code>vocab.txt&lt;/code> from HuggingFace and generate token IDs.&lt;/li>
&lt;li>&lt;strong>Transformer-Ready&lt;/strong> – Supports &lt;code>[CLS]&lt;/code>, &lt;code>[SEP]&lt;/code>, &lt;code>[PAD]&lt;/code>, and sequence formatting.&lt;/li>
&lt;/ul>
&lt;h3 id="key-features">Key Features&lt;/h3>
&lt;ul>
&lt;li>Fast ASCII vs Unicode branching using &lt;code>std::string_view&lt;/code>&lt;/li>
&lt;li>Fluent API for configuration:
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="n">TextTokenizer&lt;/span> &lt;span class="n">tokenizer&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">&lt;span class="n">tokenizer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">&lt;span class="p">.&lt;/span>&lt;span class="n">set_lowercase&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">true&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">&lt;span class="p">.&lt;/span>&lt;span class="n">set_split_on_punctuation&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">true&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">&lt;span class="p">.&lt;/span>&lt;span class="n">set_keep_punctuation&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">true&lt;/span>&lt;span class="p">);&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>Load vocabularies:
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="n">tokenizer&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">load_vocab&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;vocab.txt&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>Encode / Decode:
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="k">auto&lt;/span> &lt;span class="n">ids&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">tokenizer&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">encode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Hello world!&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span> &lt;span class="n">decoded&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">tokenizer&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">decode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ids&lt;/span>&lt;span class="p">);&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h3 id="performance">Performance&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">Performance &lt;span class="nb">test&lt;/span> with &lt;span class="m">174000&lt;/span> characters
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">Results:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">Tokenization: &lt;span class="m">2159&lt;/span> μs &lt;span class="o">(&lt;/span>&lt;span class="m">22000&lt;/span> tokens&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">Encoding: &lt;span class="m">1900&lt;/span> μs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl">Decoding: &lt;span class="m">430&lt;/span> μs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">7&lt;/span>&lt;span class="cl">Total time: 4.49 ms
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">8&lt;/span>&lt;span class="cl">Throughput: 36.97 MB/s&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;em>Benchmarked on Ryzen 9 5900X @ -O3 in release mode.&lt;/em>&lt;/p></description></item></channel></rss>