<?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/de/tags/tokenizer/</link><description>Recent content in Tokenizer on [ MECANIK DEV ]</description><generator>Hugo</generator><language>de</language><copyright>Copyright © 2020-{year} von [ MECANIK DEV ]. Alle Rechte vorbehalten.</copyright><lastBuildDate>Thu, 07 Aug 2025 20:00:00 +0100</lastBuildDate><atom:link href="https://mecanik.dev/de/tags/tokenizer/index.xml" rel="self" type="application/rss+xml"/><item><title>Tiny BPE Trainer - Ein schneller und leichter BPE-Trainer in C++</title><link>https://mecanik.dev/de/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/de/posts/tiny-bpe-trainer-a-fast-and-lightweight-bpe-trainer-in-c++/</guid><description>&lt;h2 id="wir-stellen-vor-tiny-bpe-trainer">Wir stellen vor: Tiny BPE Trainer&lt;/h2>
&lt;p>Die meisten modernen NLP-Modelle, von GPT bis RoBERTa, basieren heute auf der Tokenisierung von Teilwörtern mittels Byte Pair Encoding (BPE). Doch was, wenn Sie Ihren eigenen Wortschatz in reinem C++ trainieren möchten?&lt;/p>
&lt;p>Lernen Sie den Tiny BPE Trainer kennen - einen blitzschnellen, Header-only-BPE-Trainer, geschrieben in modernem C++17/20, mit &lt;strong>null Abhängigkeiten&lt;/strong>, voller UTF-8-Unterstützung und HuggingFace-kompatibler Ausgabe (&lt;code>vocab.txt&lt;/code>, &lt;code>merges.txt&lt;/code>).&lt;/p>
&lt;h3 id="warum-noch-ein-bpe-trainer">Warum noch ein BPE-Trainer?&lt;/h3>
&lt;p>Bestehende Optionen sind oft:&lt;/p></description></item><item><title>Ein schneller, UTF-8-fähiger C++-Tokenizer für NLP und ML</title><link>https://mecanik.dev/de/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/de/posts/a-fast-utf-8-aware-c++-tokenizer-for-nlp-ml/</guid><description>&lt;h2 id="einführung-des-modern-text-tokenizers">Einführung des Modern Text Tokenizers&lt;/h2>
&lt;p>Moderne Modelle der natürlichen Sprachverarbeitung (NLP) wie BERT, DistilBERT und andere transformerbasierte Architekturen setzen stark auf effektive Tokenisierung. C++-Entwickler sehen sich jedoch oft mit eingeschränkten Möglichkeiten wie überladenen Abhängigkeiten, unzureichender Unicode-Unterstützung oder mangelnder Kompatibilität mit vocab-basierten Encodern konfrontiert.&lt;/p>
&lt;p>Deshalb habe ich den &lt;strong>Modern Text Tokenizer&lt;/strong> entwickelt – einen blitzschnellen, &lt;strong>header-only&lt;/strong> C++-Tokenizer, der &lt;strong>UTF-8-fähig&lt;/strong>, &lt;strong>unabhängig&lt;/strong> und &lt;strong>ML-fähig&lt;/strong> ist.&lt;/p>
&lt;h3 id="was-macht-ihn-einzigartig">Was macht ihn einzigartig?&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Keine Abhängigkeiten&lt;/strong> – Kein Boost, keine ICU, keine externen Bibliotheken.&lt;/li>
&lt;li>&lt;strong>UTF-8-sicher&lt;/strong> – Korrekte Verarbeitung von mehrsprachigem Text, Emojis und Multibyte-Zeichen.&lt;/li>
&lt;li>&lt;strong>Header-only&lt;/strong> – Einfach in Ihr Projekt einfügen und loslegen.&lt;/li>
&lt;li>&lt;strong>Vokabularkodierung&lt;/strong> – Laden Sie „vocab.txt“ von HuggingFace und generieren Sie Token-IDs.&lt;/li>
&lt;li>&lt;strong>Transformer-fähig&lt;/strong> – Unterstützt &lt;code>[CLS]&lt;/code>, &lt;code>[SEP]&lt;/code>, &lt;code>[PAD]&lt;/code> und Sequenzformatierung.&lt;/li>
&lt;/ul>
&lt;h3 id="hauptfunktionen">Hauptfunktionen&lt;/h3>
&lt;ul>
&lt;li>Schnelle ASCII- vs. Unicode-Verzweigung mit &lt;code>std::string_view&lt;/code>&lt;/li>
&lt;li>Fluent API für die Konfiguration:
&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>Vokabeln laden:
&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>Kodieren / Dekodieren:
&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="leistung">Leistung&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">Leistungstest mit 174.000 Zeichen
&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">Ergebnisse:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">Tokenisierung: &lt;span class="m">2159&lt;/span> μs &lt;span class="o">(&lt;/span>22.000 Token&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">Kodierung: &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">Dekodierung: &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">Gesamtzeit: 4,49 ms
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">8&lt;/span>&lt;span class="cl">Durchsatz: 36,97 MB/s&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;em>Benchmarking auf Ryzen 9 5900X @ -O3 im Release-Modus.&lt;/em>&lt;/p></description></item></channel></rss>