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.

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Datasets used to train fatihburakkaragoz/fuzuli-base