Fuzuli Base v0.1
A from-scratch decoder-only language model for Latinized Ottoman Turkish
Fatih Burak Karagöz · CDLI
Fuzuli is a small (~85M parameter), decoder-only language model trained from scratch on a curated corpus of Latinized Ottoman Turkish texts. No foreign weights were inherited; no model was fine-tuned. Tokenizer, training data, and weights are all produced end-to-end in the project.
This is a research artifact, not a production tool. See the limitations section before using it.
Evaluation scores
Frozen heldout split, four-evaluator harness, strict-no-trades policy.
| Metric | Value |
|---|---|
| Heldout perplexity (bits/byte) | 1.9292 |
| Ottoman lexicon score (lower = more Ottoman flavor) | 9.8729 |
| Modern-Turkish flatness (loanword rate) | 0.0110 |
| Smoke fail rate (5 prompts) | 0.80 |
Baseline checkpoint git SHA: b6765554
Architecture
Standard post-2023 dense decoder transformer (RoPE + GQA + SwiGLU + RMSNorm).
| Component | Choice |
|---|---|
| Layers | 12 |
| Hidden dim | 640 |
| Attention heads (Q) | 8 |
| KV heads (GQA) | 4 |
| MLP | SwiGLU, mlp_ratio 2.67 |
| Positional embedding | RoPE |
| Normalization | RMSNorm, no bias |
| Tokenizer | BPE, vocab 24,000 |
| Embedding tying | False |
| Total parameters | ~85M |
Training corpus
| Documents | 59 |
| Pages (post-cleaning) | 15,852 |
| Characters | 28,798,649 |
| Unique BPE tokens | 7,968,478 |
Composed of: Evliya Çelebi Seyahatnâme (7 books), 25-volume Sebilürreşad / Sırat-ı Müstakim late-Ottoman periodicals, and 25 classical / late-classical works (Dîvâns, Mecmuas, historiographies). All Latinized; sourced from the two HuggingFace datasets listed in the frontmatter.
Sample generations
Prompt id: sultan_abdulhamid
Completion: Sultan Abdülhamid'in saltanatı sırasında "Müftî"nin taht-ı idâresinde bir hayli münakaş bir hey'et-şinâslıklı bir hey'et-şinâslık Türk- ler mu- vaffakıyyete karşı mu'cizelerle teşerrüf ediyor. O, mevki'lerini ihâta eden bir zât o hey'-ı ilâhîye mazhar olmak için Avrupa'nın daha büyük bir ehemmiyet-i nâfi'
Verdict: ✗ rejected — loanword: mevki
Prompt id: bedestende_sarraflar
Completion: Şehrin bedesteninde; Yirmi bin kadar; sonra da; sonra da; Yavaş, alıp önceden da fazla; Yavaş yavaş yavaşça... Ne var, ne; Alın; Alın da meydanda. O; rûh-i İslâm'ın... O da bir nûrunu: "Yaşamak için mutlakâ yarattım; O, koşuyorum, ayrıldın da Şark'i yık
Verdict: ✓ accepted
Prompt id: tanzimat_fermani
Completion: Tanzimat fermanı bu kadar ma'mûr u müzeyyen ve müzeyyen ve ma'mûr u müzeyyen ma'mûr u müzeyyen ma'mûr u âbâdân kurâlar ve bâğ u bâğçe ve bâğ u bâğçe ve bâğ u bâğçe ve bâğ u bâğçe ve bâğ u bâğçe ve bâğ u bâğçe ve bâğ u bâğçe ve bâğ u bâğçe ve bâğ u bâğçe ve bâğ u bâğçe ve bâğ u bâğçe ve bâğ u bâğçe ve bâğ u bâğçe ve bâğ
Verdict: ✗ rejected — 5gram repetition
Prompt id: divan_i_humayun
Completion: Divan-ı hümayunda toplanan vezirleriyle bu konferansın pek mühim bir zamanda büyük bir kuvvetle idâre edecektir. Ankara'da bulunan Ankara gazetesi yazıyor. Ankara'da bulunan British Mu- hamid gibi Vukû'ları idâresinde pek çok kıymetdâr şeylerin zuhûru gelen bu bir takım mesâilin açtığı büyük bir bu husüsda münderic bulunan bir eser-i mahsûsa, bu tereddüde
Verdict: ✗ rejected — loanword: takım
Prompt id: yeniceri_ocagi
Completion: Yeniçeri ocağının kaldırılması için kendisine bir kat daha arttırıyor. Bu yüzdendir ki, bu kongrenin, nüshaların, mekteplerin, medreselerin sosyalistlerini, köylünün dinlerini, çocuklarını, çocuklarını, çocuklarını, dünyaya, hâsılı bütün köylünün dinini, gerek müslümanca yaşadığı bu konuda yeniden, gerek eskiden beri, gerek müslüman ve ictimâî hayatında, gerek hükümet
Verdict: ✗ rejected — loanword: hükümet
Limitations
Fuzuli v0.1 is trained at roughly 200× under Chinchilla-optimal (8 M unique tokens for 84 M parameters; Chinchilla recommends ~1.7 B tokens). Expect:
- Plausible short completions (one-sentence) in Ottoman-Turkish style.
- Useful for perplexity scoring of historical Turkish text.
- Not suitable for long-form generation (will memorize 3–5-token windows).
- Not capable on Arabic-script Ottoman, modern Turkish, or conversational input.
- Not for any historical-translation or paleographic task without human review.
How to use
Custom architecture (see train/arch.py in the source repo). For now, load via:
import torch
from huggingface_hub import hf_hub_download
weights = hf_hub_download("fatihburakkaragoz/fuzuli-base", "model.pt")
state = torch.load(weights, map_location="cpu")
# See train/arch.py:AsenaModel for the config schema.
A transformers-compatible loader is planned for v0.5.
Citation
@misc{karagoz2026fuzuli,
title = {Fuzuli v0.1 — A from-scratch Latinized Ottoman Turkish language model},
author = {Karagöz, Fatih Burak},
year = {2026},
note = {CDLI technical report; HuggingFace Hub release},
url = {https://huggingface.co/fatihburakkaragoz/fuzuli-base}
}
License
Apache-2.0 (code + weights). Training data is CC-BY-4.0; the article is CC-BY-4.0.