Modül: İleri NLP (Capstone) • Süre: 3-4 saat
Bir haber/medya platformunda NLP mühendisi olarak çalışıyorsun. Platforma gelen kısa metinleri tek bir uçtan uca NLP pipeline'ından geçirmen gerekiyor:
- Metni kategorilere ayır (sport / business / tech),
- İçindeki kişi, kurum ve yer isimlerini (named entity) çıkar,
- Bir sorguya anlamca en yakın dokümanları semantik arama ile bul,
- Eğittiğin modeli diske kaydet ve geri yükle (production'a çıkar).
Bu capstone, İleri NLP dersinde öğrendiğin tüm araçları TEK pipeline'da birleştirir. Tek tek küçük problemler değil; gerçek bir NLP sisteminin uçtan uca iskeleti.
- ✅ Metin ön işleme — lowercase + regex temizliği + stopword eleme
- ✅ TF-IDF + LogisticRegression — sklearn
Pipelineile metin sınıflandırma - ✅ spaCy NER (
en_core_web_sm) — metinden varlık (ORG / PERSON / GPE...) çıkarımı - ✅ sentence-transformers (
all-MiniLM-L6-v2) — cümle embedding'i + cosine ile semantik arama - ✅ Model persistence —
joblibile kaydet/yükle (round-trip) - ✅ Uçtan uca pipeline — hepsini tek akışta birleştirme
# Fork + clone
git clone <your-fork-url>
cd ds-45-nlp-capstone
# Virtual environment
python -m venv venv
source venv/bin/activate # Mac/Linux
# venv\Scripts\activate # Windows
# Dependencies
pip install -r requirements.txt
# spaCy İngilizce modeli (NER için gerekli — bir kez)
python -m spacy download en_core_web_sm
# Auto test runner (dosya değişince çalışır)
python watch.py
# Manuel test
pytest tests/test_question.py -vNot — ilk çalıştırma:
sentence-transformersmodeli (all-MiniLM-L6-v2) ilk kullanımda internetten indirilir (~90MB). spaCy modeli de bir kez indirilir. Sonraki çalıştırmalar lokal cache'ten okur.
Skorunun Kaizu hesabına yazılması için kaizu_config.py dosyasını aç ve USER_ID alanını kendi user_id'nle değiştir:
USER_ID = 0 # ← Kaizu profilinden alıp buraya yaz
PROJECT_ID = 725 # ← Bu projeye ait, dokunmaUser_id'ni Kaizu profilinden bulabilirsin (Profile → Settings → User ID).
Skor göndermek için tüm testleri toplu çalıştırmalısın:
python tests/test_question.pyBu komut tüm testleri çalıştırır, passed/total oranını otomatik Kaizu'ya gönderir. Geliştirme sırasında pytest -v kullanmaya devam edebilirsin (skor göndermez).
Bu projede dış veri indirmiyorsun. Küçük (~30-40 metin) İngilizce bir veri setini load_data() fonksiyonunda koda gömeceksin. 3-4 kategori (örn. sport, business, tech), her kategoride en az 2 (önerilen ~10-12) örnek cümle.
X, y = load_data()
# X: ["The football team won the championship final...", ...]
# y: ["sport", "business", "tech", ...]Capstone'un odağı veri toplamak değil; araçları birleştirmek. O yüzden veri küçük ve deterministik.
task_manager.py dosyasındaki fonksiyonları sırayla doldur. Her task altta testler pass olana kadar düzenlenmeli.
load_data()— ~30-40 İngilizce metin + 3-4 kategori etiketi döndür (gömülü)preprocess(text)— lowercase + regex + stopword temizliğibuild_classifier()—TfidfVectorizer+LogisticRegressionPipelinetrain_classifier(pipe, X, y)— fit + dönclassify(pipe, text)— tek metin için kategori (str)evaluate(pipe, X, y)— accuracy (float)extract_entities(text)— spaCyen_core_web_smile[(text, label), ...]semantic_search(query, docs, top_k)—all-MiniLM-L6-v2+ cosine, skor azalan[(doc, score), ...]save_model(pipe, path)/load_model(path)— joblib round-triprun_pipeline()— hepsini uçtan uca birleştir, özet dict dön
Bu projeyi bitirdiğinde:
- Metni ön işleyebilecek (regex + stopword) ve TF-IDF + LogisticRegression ile sınıflandırabileceksin
- spaCy ile metinden named entity çıkarabileceksin
- sentence-transformers ile embedding üretip cosine similarity ile semantik arama yapabileceksin
- Bir modeli joblib ile diske kaydedip geri yükleyebileceksin
- Tüm bu araçları tek bir uçtan uca pipeline'da birleştirebileceksin
Test dosyası: tests/test_question.py (13 test)
Tümü pass olmalı:
load_data~30-40 metin, 3-4 kategori, her kategoride ≥2 örnekpreprocessküçük harf + rakam/noktalama temizliği + stopword elemebuild_classifierdoğru tip (TfidfVectorizer + LogisticRegression)classifybilinen bir kategori döndürürevaluateaccuracy eşiği geçer (> 0.9 — küçük veri setinde TF-IDF + LR mükemmele yakın ayırır)extract_entitiesen az 1 varlık döndürür ve label bir stringsemantic_searchtop_ksonuç döndürür, skorlar azalan, en ilgili doküman ilk sıradasave_model → load_modelsonrası model aynı tahmini verirrun_pipelinetüm aşamaları çalıştırır, beklenen anahtarları döndürür
Accuracy: 1.0 (küçük, ayrışabilir veri setinde TF-IDF + LogisticRegression)
NER: ORG / PERSON / GPE gibi etiketlerle en az birkaç varlık
Semantik arama: spor sorgusunda en üst sonuç bir spor metni
Round-trip: kaydedilen ve yüklenen model aynı tahmini verir
- spaCy ve sentence-transformers modelleri büyüktür; her çağrıda yeniden yükleme yapma — modülde bir kez yükleyip global cache'le (çözümdeki gibi).
preprocess'iTfidfVectorizer(preprocessor=preprocess)olarak pipeline'a verebilirsin; böylece eğitim ve tahmin aynı temizlikten geçer.- Embedding'leri
normalize_embeddings=Trueile üretirsen cosine = dot product olur (doc_emb @ q_emb). np.argsort(scores)[::-1][:top_k]→ en büyüktop_kskorun indeksleri (azalan).random_state=42değerini değiştirme.
tests/test_question.pydosyasını değiştirme_solution/klasörü yok (DB'de saklanır, dersin haftası geçince açılır)- Dokunabileceğin 2 dosya:
tasks/task_manager.py(kodu yaz) +kaizu_config.py(sadece USER_ID)