""" Hugging Face Spaces için CEFR Classifier App Bu dosyayı Space'inize yükleyin """ import gradio as gr import torch from transformers import AutoTokenizer, AutoModelForCausalLM from peft import PeftModel import os import re # Model yükleme (Space başlangıcında bir kez) # NOT: Kendi model path'inizi buraya yazın (Hub'dan veya lokal) MODEL_NAME = os.getenv("MODEL_NAME", "keremigenas/cefr-llama-3b-optimized") # Hub'daki model adınız BASE_MODEL = "meta-llama/Llama-3.2-3B-Instruct" print("Model yükleniyor...") hf_token = os.getenv("HF_TOKEN") # Tokenizer tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, token=hf_token) if tokenizer.pad_token is None: tokenizer.pad_token = tokenizer.eos_token # Base model base_model = AutoModelForCausalLM.from_pretrained( BASE_MODEL, torch_dtype=torch.bfloat16 if torch.cuda.is_available() else torch.float32, device_map="auto", token=hf_token ) # LoRA adaptörleri model = PeftModel.from_pretrained(base_model, MODEL_NAME) model = model.merge_and_unload() model.eval() print("✓ Model yüklendi") def create_prompt(sentence): """Llama modeli için prompt oluştur""" system_prompt = """Sen bir CEFR (Common European Framework of Reference) seviye sınıflandırıcısısın. Verilen Türkçe cümleyi analiz edip A1, A2, B1, B2, C1 veya C2 seviyelerinden birine sınıflandır. CEFR Seviyeleri: - A1: Başlangıç seviyesi, çok basit cümleler, temel kelimeler - A2: Temel seviye, günlük konuşma, basit cümleler - B1: Orta seviye, karmaşık cümleler, günlük konuşma - B2: Orta-ileri seviye, akademik dil, karmaşık yapılar - C1: İleri seviye, akıcı dil, karmaşık ifadeler - C2: Uzman seviye, anadil seviyesine yakın, çok karmaşık yapılar Önce analiz yap: - Cümle yapısı - Dilbilgisi karmaşıklığı - Kelime seviyesi - Metin tutarlılığı Sonra SADECE CEFR seviyesini (A1, A2, B1, B2, C1 veya C2) döndür.""" user_prompt = f"Cümle: {sentence}\n\nBu cümlenin CEFR seviyesi nedir?" prompt = f"<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\n{system_prompt}<|eot_id|><|start_header_id|>user<|end_header_id|>\n\n{user_prompt}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n" return prompt def predict_cefr(text): """Metni cümlelere ayır ve her biri için CEFR seviyesi tahmin et""" if not text or not text.strip(): return "Lütfen bir metin girin." # Cümleleri ayır sentences = re.split(r'[.!?]+', text) sentences = [s.strip() for s in sentences if s.strip()] if not sentences: return "Cümle bulunamadı." results = [] for sentence in sentences: try: prompt = create_prompt(sentence) inputs = tokenizer(prompt, return_tensors="pt", truncation=True, max_length=512) inputs = {k: v.to(model.device) for k, v in inputs.items()} with torch.no_grad(): outputs = model.generate( **inputs, max_new_tokens=10, do_sample=False, pad_token_id=tokenizer.eos_token_id ) generated_text = tokenizer.decode(outputs[0], skip_special_tokens=False) # CEFR seviyesini çıkar valid_levels = ['A1', 'A2', 'B1', 'B2', 'C1', 'C2'] level = "B1" # default # Assistant response'u çıkar if "<|start_header_id|>assistant<|end_header_id|>" in generated_text: response = generated_text.split("<|start_header_id|>assistant<|end_header_id|>")[-1] response = response.split("<|eot_id|>")[0].strip() else: response = generated_text.split(prompt)[-1].strip() if prompt in generated_text else generated_text[-20:] # Seviyeyi bul for lvl in valid_levels: if lvl in response.upper(): level = lvl break results.append(f"{sentence} → **{level}**") except Exception as e: results.append(f"{sentence} → Hata: {str(e)}") return "\n\n".join(results) # Gradio interface with gr.Blocks(title="CEFR Seviye Sınıflandırıcı") as demo: gr.Markdown("# 🇹🇷 CEFR Seviye Sınıflandırıcı") gr.Markdown("Türkçe metinlerinizi CEFR seviyelerine göre sınıflandırın.") with gr.Row(): with gr.Column(): text_input = gr.Textbox( label="Türkçe Metin", placeholder="Analiz etmek istediğiniz metni buraya yazın...", lines=5 ) btn = gr.Button("Analiz Et", variant="primary") with gr.Column(): output = gr.Markdown(label="Sonuçlar") btn.click(fn=predict_cefr, inputs=text_input, outputs=output) gr.Examples( examples=[ "Merhaba, benim adım Ahmet.", "Eğer müze gezilmezse, kültürel bilgiler eksik olabilir.", "Deney sonuçları geç geldiği için rapor geç hazırlandı." ], inputs=text_input ) demo.launch()