ilaydabeyhan commited on
Commit
be0cfe8
·
verified ·
1 Parent(s): 2b7ea18

Upload 5 files

Browse files
Files changed (6) hide show
  1. .gitattributes +1 -0
  2. Dockerfile +23 -0
  3. README.md +9 -0
  4. app.py +90 -0
  5. requirements.txt +4 -0
  6. siniflandirma_modeli.pkl +3 -0
.gitattributes ADDED
@@ -0,0 +1 @@
 
 
1
+ siniflandirma_modeli.pkl filter=lfs diff=lfs merge=lfs -text
Dockerfile ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 1. TEMEL İMAJ: Python 3.10 tabanlı hafif bir Linux imajı kullan
2
+ FROM python:3.10-slim
3
+
4
+ # 2. Gerekli araçları kur: gunicorn (performans için önerilen sunucu)
5
+ # Ayrıca, modeliniz için Sentence-Transformers'ın gerektirdiği bazı sistem kütüphaneleri
6
+ RUN pip install gunicorn
7
+
8
+ # 3. ÇALIŞMA DİZİNİ: Uygulama dosyalarının bulunacağı klasör
9
+ WORKDIR /app
10
+
11
+ # 4. DOSYALARI KOPYALA: requirements.txt dosyasını kopyala
12
+ COPY requirements.txt .
13
+
14
+ # 5. KÜTÜPHANELERİ KUR: Gerekli kütüphaneleri kur
15
+ RUN pip install --no-cache-dir -r requirements.txt
16
+
17
+ # 6. UYGULAMA DOSYALARINI KOPYALA: Kalan dosyaları kopyala (app.py ve siniflandirma_modeli.pkl)
18
+ COPY . .
19
+
20
+ # 7. KOMUT: Uygulamayı başlat
21
+ # Hugging Face'de port otomatik olarak $PORT çevresel değişkeni ile atanır.
22
+ # gunicorn kullanarak app.py içindeki Flask uygulamamızı ('app') başlatıyoruz.
23
+ CMD exec gunicorn --bind 0.0.0.0:$PORT --workers 1 --threads 8 --timeout 0 app:app
README.md ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ title: Medium Makale Kategorizasyon API'si emoji: 🧠 colorFrom: indigo colorTo: blue sdk: docker app_port: 80 pinned: false
2
+ Medium Kategorizasyon API'si
3
+ Bu alan, ilaydabeyhan'ın Medium yazılarını Yapay Zeka, Yazılım ve Trendler gibi kategorilere ayırmak için eğitilmiş bir Makine Öğrenmesi (ML) modelini barındırır.
4
+
5
+ Bu bir HTTP POST API'sidir ve doğrudan Power Automate tarafından kullanılmak üzere tasarlanmıştır.
6
+
7
+ Endpoint: /kategorize-et
8
+ Giriş: { "baslik": "Makale Başlığı Buraya" }
9
+ Çıkış: { "kategori": "Tahmin Edilen Kategori" }
app.py ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, request, jsonify
2
+ import joblib
3
+ import re
4
+ from sentence_transformers import SentenceTransformer
5
+ from threading import Lock
6
+ import os
7
+
8
+ # Flask uygulamasını başlat (Hugging Face bu uygulamayı otomatik olarak başlatır)
9
+ app = Flask(__name__)
10
+
11
+ # Model yükleme işlemini sadece bir kez yapmak için global değişkenler
12
+ MODEL_LOADED = False
13
+ MODEL_LOCK = Lock()
14
+ classifier = None
15
+ embedding_model = None
16
+
17
+
18
+ # Metin ön işleme fonksiyonu
19
+ def metin_temizle(metin):
20
+ """Metni küçük harfe dönüştürür, noktalama işaretlerini ve sayıları kaldırır."""
21
+ metin = metin.lower()
22
+ metin = re.sub(r'[^\w\s]', '', metin)
23
+ metin = re.sub(r'\d+', '', metin)
24
+ return metin
25
+
26
+
27
+ # Modeli yükleme fonksiyonu (Sadece bir kez çalışacak)
28
+ def load_models():
29
+ global classifier, embedding_model, MODEL_LOADED
30
+
31
+ # Kilit mekanizmasını kullanarak, modelin birden fazla kez yüklenmesini engelle
32
+ with MODEL_LOCK:
33
+ if MODEL_LOADED:
34
+ return
35
+
36
+ print("Modeller ilk kez yükleniyor...")
37
+ try:
38
+ # 1. SVC sınıflandırma modelini yükle
39
+ classifier = joblib.load('siniflandirma_modeli.pkl')
40
+ print("SVC modeli başarıyla yüklendi.")
41
+ except FileNotFoundError:
42
+ # Bu hata olursa, yüklemede bir sorun var demektir.
43
+ raise FileNotFoundError("siniflandirma_modeli.pkl dosyası bulunamadı.")
44
+
45
+ try:
46
+ # 2. Gömme modelini doğrudan internetten indir (Distiluse modeli)
47
+ embedding_model = SentenceTransformer('distiluse-base-multilingual-cased-v2')
48
+ print("Sentence-Transformer modeli başarıyla indirildi/yüklendi.")
49
+ except Exception as e:
50
+ print(f"HATA: Sentence-Transformer modeli yüklenirken bir sorun oluştu: {e}")
51
+ raise Exception(f"Model yükleme hatası: {e}")
52
+
53
+ MODEL_LOADED = True
54
+ print("Model yükleme tamamlandı. API hazır.")
55
+
56
+
57
+ # API'nin makale başlığını alıp kategoriyi tahmin edeceği uç nokta (endpoint)
58
+ @app.route('/kategorize-et', methods=['POST'])
59
+ def kategorize_et_api():
60
+ """Gelen HTTP isteğini işler, makale başlığını kategorize eder ve sonucu JSON olarak döndürür."""
61
+
62
+ # Modelleri yükle (Zaten yüklüyse bu adım atlanır)
63
+ load_models()
64
+
65
+ # Gelen JSON verisini al
66
+ data = request.get_json(silent=True)
67
+
68
+ if not data or 'baslik' not in data:
69
+ return jsonify({"hata": "Makale başlığı (baslik) JSON gövdesinde bulunamadı."}), 400
70
+
71
+ makale_basligi = data.get('baslik', '')
72
+
73
+ temizlenmis_baslik = metin_temizle(makale_basligi)
74
+
75
+ # Başlığı vektöre dönüştür
76
+ tahmin_vektoru = embedding_model.encode([temizlenmis_baslik])
77
+
78
+ # Sınıflandırma modelini kullanarak kategoriyi tahmin et
79
+ tahmin_sonucu = classifier.predict(tahmin_vektoru)[0]
80
+
81
+ # Sonucu JSON formatında döndür
82
+ return jsonify({"kategori": tahmin_sonucu})
83
+
84
+
85
+ # Uygulama çalıştırma kodu. Hugging Face'de bu satır genellikle gerekmez,
86
+ # ancak dosyamızı daha standart tutmak için bırakabiliriz.
87
+ if __name__ == '__main__':
88
+ # Hugging Face'de port otomatik olarak verilir. Lokal test için 7860 kullanıyoruz
89
+ port = int(os.environ.get('PORT', 7860))
90
+ app.run(host='0.0.0.0', port=port)
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ Flask
2
+ joblib
3
+ sentence-transformers
4
+ scikit-learn
siniflandirma_modeli.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6ddfe1c0cf8264546ef68bc6578bd1cffe1ab98e2d6e7f59d4b02de7993f91d9
3
+ size 689807