medium-api3 / app.py
ilaydabeyhan's picture
Upload 4 files
7d616a7 verified
from flask import Flask, request, jsonify
import joblib
import re
from sentence_transformers import SentenceTransformer
from threading import Lock
import os
# Flask uygulamasını başlat (Hugging Face bu uygulamayı otomatik olarak başlatır)
app = Flask(__name__)
# Model yükleme işlemini sadece bir kez yapmak için global değişkenler
MODEL_LOADED = False
MODEL_LOCK = Lock()
classifier = None
embedding_model = None
# Metin ön işleme fonksiyonu
def metin_temizle(metin):
"""Metni küçük harfe dönüştürür, noktalama işaretlerini ve sayıları kaldırır."""
metin = metin.lower()
metin = re.sub(r'[^\w\s]', '', metin)
metin = re.sub(r'\d+', '', metin)
return metin
# Modeli yükleme fonksiyonu (Sadece bir kez çalışacak)
def load_models():
global classifier, embedding_model, MODEL_LOADED
# Kilit mekanizmasını kullanarak, modelin birden fazla kez yüklenmesini engelle
with MODEL_LOCK:
if MODEL_LOADED:
return
print("Modeller ilk kez yükleniyor...")
try:
# 1. SVC sınıflandırma modelini yükle
classifier = joblib.load('siniflandirma_modeli.pkl')
print("SVC modeli başarıyla yüklendi.")
except FileNotFoundError:
# Bu hata olursa, yüklemede bir sorun var demektir.
raise FileNotFoundError("siniflandirma_modeli.pkl dosyası bulunamadı.")
try:
# 2. Gömme modelini doğrudan internetten indir (Distiluse modeli)
embedding_model = SentenceTransformer('distiluse-base-multilingual-cased-v2')
print("Sentence-Transformer modeli başarıyla indirildi/yüklendi.")
except Exception as e:
print(f"HATA: Sentence-Transformer modeli yüklenirken bir sorun oluştu: {e}")
raise Exception(f"Model yükleme hatası: {e}")
MODEL_LOADED = True
print("Model yükleme tamamlandı. API hazır.")
# API'nin makale başlığını alıp kategoriyi tahmin edeceği uç nokta (endpoint)
@app.route('/kategorize-et', methods=['POST'])
def kategorize_et_api():
"""Gelen HTTP isteğini işler, makale başlığını kategorize eder ve sonucu JSON olarak döndürür."""
# Modelleri yükle (Zaten yüklüyse bu adım atlanır)
load_models()
# Gelen JSON verisini al
data = request.get_json(silent=True)
if not data or 'baslik' not in data:
return jsonify({"hata": "Makale başlığı (baslik) JSON gövdesinde bulunamadı."}), 400
makale_basligi = data.get('baslik', '')
temizlenmis_baslik = metin_temizle(makale_basligi)
# Başlığı vektöre dönüştür
tahmin_vektoru = embedding_model.encode([temizlenmis_baslik])
# Sınıflandırma modelini kullanarak kategoriyi tahmin et
tahmin_sonucu = classifier.predict(tahmin_vektoru)[0]
# Sonucu JSON formatında döndür
return jsonify({"kategori": tahmin_sonucu})
# Uygulama çalıştırma kodu. Hugging Face'de bu satır genellikle gerekmez,
# ancak dosyamızı daha standart tutmak için bırakabiliriz.
if __name__ == '__main__':
# Hugging Face'de port otomatik olarak verilir. Lokal test için 7860 kullanıyoruz
port = int(os.environ.get('PORT', 7860))
app.run(host='0.0.0.0', port=port)