import streamlit as st import pickle import re import string # 1. Sayfa Ayarları / Page Settings st.set_page_config(page_title="Fake-News-Detection | Sahte Haber Tespiti", page_icon="🔍", layout="wide") # 2. Model ve Vektörleştiriciyi Güvenli Yükle / Load Assets Safely @st.cache_resource def load_assets(): try: with open('vectorizer.pkl', 'rb') as f: vectorizer = pickle.load(f) with open('model_nb.pkl', 'rb') as f: model = pickle.load(f) return vectorizer, model except Exception as e: return None, None tfidf, nb_model = load_assets() # 3. Güçlendirilmiş Metin Temizleme / Robust Text Cleaning def clean_text(text): try: text = str(text).lower() # Reuters imzasını temizle text = re.sub(r'^.*?\(reuters\)\s*-', '', text) # Linkleri ve parantez içlerini sil text = re.sub(r'https?://\S+|www\.\S+', '', text) text = re.sub(r'\[.*?\]', '', text) # Sadece harf ve boşlukları tut (Hataları önlemek için en güvenli yol) text = re.sub(r'[^a-z\s]', '', text) # Fazla boşlukları temizle text = re.sub(r'\s+', ' ', text) return text.strip() except: return "" # --- SOL PANEL (SIDEBAR) --- st.sidebar.title("⚙️ Kontrol Paneli / Control Panel") st.sidebar.warning("⚠️ **NOT / NOTE:** Bu model sadece İngilizce metinlere duyarlıdır. / Only English supported.") st.sidebar.subheader("📌 Kopyalanabilir Örnekler / Examples") # İstediğin yeni örnekleri buraya ekledim st.sidebar.info("**Ekonomi (Gerçek):**\n\nWASHINGTON (Reuters) - The Federal Reserve maintained its interest rate target on Wednesday, signaling the economy is expanding at a solid pace and inflation is stable.") st.sidebar.success("**Uzay & Teknoloji (Gerçek):**\n\nA private space company successfully launched its latest satellite into orbit on Tuesday. The mission aims to provide high-speed internet access to rural areas across the globe, according to official statements.") st.sidebar.error("**Sosyal Medya (Sahte):**\n\nURGENT: Your smartphone is secretly recording all your family photos and sending them to a hidden server. The government is forcing tech companies to hide this truth. Share now!") st.sidebar.error("**Sağlık (Sahte):**\n\nDrinking five cups of salted water every hour is proven to cure every single virus instantly. Doctors are being paid to stay silent about this miracle cure!") st.sidebar.markdown("---") st.sidebar.write("**Model:** Multinomial NB\n**Accuracy:** %94") # --- ANA SAYFA --- st.title("🔍 Fake-News-Detection | Sahte Haber Tespiti") st.markdown("Haberin gerçek mi yoksa sahte mi olduğunu analiz edin. / Analyze news veracity.") if tfidf is None or nb_model is None: st.error("Model dosyaları bulunamadı! Lütfen vectorizer.pkl ve model_nb.pkl dosyalarını kontrol edin.") # 4. Kullanıcı Girişi user_input = st.text_area("Analiz edilecek haber metnini girin / Enter news text:", height=250) if st.button("Analiz Et / Analyze"): if user_input.strip() != "": try: # Ön İşlem cleaned = clean_text(user_input) if len(cleaned) < 5: st.warning("Metin analiz için çok kısa! / Text is too short for analysis!") else: # Vektörleştirme vec = tfidf.transform([cleaned]) # Tahmin pred = nb_model.predict(vec)[0] prob = nb_model.predict_proba(vec) st.subheader("Analiz Sonucu / Result:") # Etiket Mantığı: 1 = GERÇEK, 0 = SAHTE if pred == 1: st.success(f"✅ GERÇEK GÖRÜNÜYOR / LOOKS REAL (Güven/Confidence: %{prob[0][1]*100:.2f})") st.balloons() else: st.error(f"🚨 SAHTE OLABİLİR / MIGHT BE FAKE (Olasılık/Probability: %{prob[0][0]*100:.2f})") with st.expander("Temizlenmiş Metin Detayı / View Cleaned Text"): st.write(cleaned) except Exception as e: st.error(f"Beklenmedik bir hata oluştu: {e}") else: st.warning("Lütfen bir metin girin. / Please enter a text.")