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