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
5
Safetensors
Model size
153k params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support