Ottoman Turkish Etymology Classifier
Osmanlı/modern Türkçe kelimeleri köken bakımından 4 sınıfa ayıran hibrit bir karakter-CNN modeli: ARABIC (Arapça), PERSIAN (Farsça), TURKISH (Türkçe), WESTERN (Batı kökenli — Fransızca kökenli kelimeler de eğitim verisi düzeyinde WESTERN sınıfına dahil edilmiştir).
Türkçe kelime dağarcığının etimolojik bileşiminin tarihsel bir Türkçe metin külliyatının farklı baskıları arasında nasıl değiştiğini incelemek amacıyla geliştirilmiştir.
Mimari
[karakter dizisi] → Embedding(32d) → Conv1D(k=3,4,5; her biri 128 filtre) → GlobalMaxPool → 384d ──┐
├→ FC(256) → FC(4)
[kural özellik vektörü, 10d] ─────────────────────────────────────────────────────────────────────────┘
Her kelime için 10 boyutlu bir kural özellik vektörü hesaplanır ve CNN'in ürettiği vektörle birleştirilir: sözlük üyeliği (2 özellik), Farsça/Arapça/Batı kökenli ek kalıpları (3 özellik), ünlü uyumu, düzeltme işareti (â/î/û) varlığı ve 3 kelime-uzunluğu grubu.
Bu depo, ilk 2 kural özelliği için kullanılan Türkçe/Farsça sözlük dosyalarını içermemektedir — bu yüzden çıkarım sırasında bu 2 özellik her zaman 0 olarak hesaplanır ve isabet oranı aşağıdaki (tam özellik setiyle elde edilen) sonuçların biraz altında kalır. Geri kalan her şey (karakter CNN + diğer 8 kural özelliği) tam olarak çalışır durumdadır.
Sonuçlar (tam özellik seti, sözlükler dahil)
| Metrik | Değer |
|---|---|
| Test isabeti (accuracy) | 83.62% |
| Test makro F1 | 0.8363 |
Kullanım
from huggingface_hub import snapshot_download
import sys
path = snapshot_download("dbbiyte/ottoman-turkish-etymology-classifier")
sys.path.insert(0, path)
from inference import load_model, predict_word
model, vocab, config = load_model(path)
print(predict_word(model, vocab, config, "şehir"))
# [('PERSIAN', 0.5773), ('ARABIC', 0.4056), ('WESTERN', 0.0105)]
Bir metin dosyasındaki tüm kelimeleri sınıflandırma:
import re
from collections import Counter
text = open("metin.txt", encoding="utf-8").read()
words = re.findall(r"[a-zA-ZçğıöşüÇĞİÖŞÜâîûÂÎÛ]+", text.lower())
counts = Counter(words)
results = Counter()
for word, freq in counts.items():
label, _ = predict_word(model, vocab, config, word, top_k=1)[0]
results[label] += freq
total = sum(results.values())
for label, freq in results.most_common():
print(f"{label:<10} {freq/total*100:.2f}%")
Dosyalar
| Dosya | Açıklama |
|---|---|
model.safetensors |
eğitilmiş ağırlıklar |
config.json |
mimari hiperparametreler + sınıf etiketleri |
vocab.json |
karakter düzeyinde sözlük (vocabulary) |
inference.py |
bağımsız model tanımı + load_model() / predict_word() |
👥 Yazarlar
Bu model İzmir Yüksek Teknoloji Enstitüsü - Dijital Beşeri Bilimler ve Yapay Zekâ Laboratuvarı bünyesinde geliştirilmiştir:
- Dr. Yasemin ÖZCAN GÖNÜLAL — İzmir Yüksek Teknoloji Enstitüsü
- Dr. Mustafa İLTER — İzmir Yüksek Teknoloji Enstitüsü
🏦 Destek ve Teşekkür
Bu çalışma, Türkiye Bilimsel ve Teknolojik Araştırma Kurumu (TÜBİTAK) tarafından 323K372 numaralı proje ile desteklenmiştir. Projeye verdiği destekten ötürü TÜBİTAK'a teşekkürlerimizi sunarız.
Lisans
MIT
- Downloads last month
- 15