from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from pydantic import BaseModel import torch from transformers import AutoTokenizer, AutoModelForSequenceClassification, AutoConfig app = FastAPI() app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=False, allow_methods=["*"], allow_headers=["*"], ) class AnalyzeRequest(BaseModel): text: str # --------------------------------------------------------- # BERTurk Duygu Analizi / Sınıflandırma Modeli # --------------------------------------------------------- MODEL_PATH = "sentence_best_model 2.bin" BASE_MODEL_NAME = "dbmdz/bert-base-turkish-cased" print("Model yükleniyor, lütfen bekleyin...") try: tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL_NAME) # Modelinizi eğitirken kelime dağarcığına (vocab) 30 adet yeni token eklemişsiniz. # Orijinal BERTurk'ün vocab boyutu 32000 iken, sizin modelinizinki 32030 olmuş. # Bu yüzden konfigürasyonda bunu belirtmemiz gerekiyor, yoksa çöker ve Nötr döner! config = AutoConfig.from_pretrained(BASE_MODEL_NAME, num_labels=3, vocab_size=32030) # Konfigürasyonla iskeleti oluşturuyoruz model = AutoModelForSequenceClassification.from_config(config) # Kendi eğittiğiniz ağırlıkları (.bin) içine yüklüyoruz model.load_state_dict(torch.load(MODEL_PATH, map_location=torch.device('cpu'), weights_only=False)) model.eval() print("Model başarıyla yüklendi!") except Exception as e: print(f"Model yüklenirken hata oluştu: {e}") model = None tokenizer = None @app.post("/predict") async def predict_sentiment(request: AnalyzeRequest): """ Frontend'den gelen günlüğü okur ve duygu durumunu sınıflandırır. """ if not model or not tokenizer: return {"sentiment": "Neutral"} inputs = tokenizer(request.text, return_tensors="pt", truncation=True, padding=True) with torch.no_grad(): outputs = model(**inputs) predictions = torch.nn.functional.softmax(outputs.logits, dim=-1) predicted_class = torch.argmax(predictions, dim=-1).item() # Sınıf numaralarını metne çevirme (Örnek: 0: Negative, 1: Neutral, 2: Positive) # NOT: Kendi modelinizin label mapping'ine göre burayı değiştirebilirsiniz! sentiment_map = {0: "Negative", 1: "Neutral", 2: "Positive"} detected_sentiment = sentiment_map.get(predicted_class, "Neutral") return {"sentiment": detected_sentiment} @app.get("/health") async def health_check(): """ Konteynerin ve modelin durumunu kontrol etmek için health endpoint. """ if model and tokenizer: return {"status": "healthy", "model_loaded": True} return {"status": "degraded", "model_loaded": False, "message": "Model not loaded. Using fallback responses."}