# app_streamlit_fakenews.py import streamlit as st from transformers import pipeline import pandas as pd import matplotlib.pyplot as plt import time from datetime import datetime # --- Configuration Thème Streamlit --- current_hour = datetime.now().hour if 6 <= current_hour < 18: theme = "light" else: theme = "dark" st.set_page_config( page_title="Détection de Fake News", page_icon="", layout="wide", initial_sidebar_state="expanded" ) # --- Chargement du modèle --- @st.cache_resource def load_model(): time.sleep(1) return pipeline( "text-classification", model="mrm8488/bert-tiny-finetuned-fake-news-detection" ) with st.spinner("Chargement du modèle..."): classifier = load_model() # --- Fonctions --- def detect_fake_news(texts): if isinstance(texts, str): texts = [texts] results = classifier(texts) df = pd.DataFrame({ "Texte": texts, "Prédiction": [res['label'] for res in results], "Score de Confiance": [res['score'] for res in results] }) return df def show_fake_news_graph(df): prediction_counts = df["Prédiction"].value_counts() fig, ax = plt.subplots(figsize=(6,4)) prediction_counts.plot(kind="bar", ax=ax) ax.set_ylabel("Nombre de textes") ax.set_xlabel("Classe") ax.set_title("Répartition des prédictions") st.pyplot(fig) def animate_scores(df): st.write("Scores de Confiance Individuels") for idx, row in df.iterrows(): st.write(f"Texte {idx + 1} : {row['Texte']}") st.progress(row['Score de Confiance']) # --- UI --- if theme == "light": st.title("Détection de Fake News - Mode Jour") else: st.title("Détection de Fake News - Mode Nuit") st.subheader("Outil de détection automatique des fausses informations") st.markdown(""" Bienvenue dans cet outil de détection de fake news. Analysez si un texte est vraisemblablement **réel** ou **faux**. """) # Sidebar pour options with st.sidebar: st.header("Paramètres") mode = st.radio("Mode d'analyse", ["Texte Unique", "Batch de Textes (.txt)"]) threshold = st.slider("Filtrer par score de confiance", 0.0, 1.0, 0.5, 0.01) show_graphs = st.checkbox("Afficher le graphique des résultats", value=True) show_animations = st.checkbox("Afficher l'animation de score", value=True) st.markdown("---") st.caption(f"Mode actuel : {theme.capitalize()}") # Corps principal if mode == "Texte Unique": st.write("Entrez votre texte à analyser") user_input = st.text_area("Tapez ou copiez un article, une déclaration ou une actualité :", height=150) analyze_button = st.button("Analyser") if analyze_button: if not user_input.strip(): st.warning("Veuillez entrer du texte avant d'analyser.") else: with st.spinner("Analyse en cours..."): df_result = detect_fake_news(user_input) df_result = df_result[df_result["Score de Confiance"] >= threshold] st.success("Analyse terminée. Voici les résultats :") st.dataframe(df_result, use_container_width=True) if show_graphs and not df_result.empty: st.write("Visualisation") show_fake_news_graph(df_result) if show_animations and not df_result.empty: animate_scores(df_result) else: st.write("Uploadez votre fichier .txt") uploaded_file = st.file_uploader("Chaque ligne doit contenir une information à vérifier", type=["txt"]) if uploaded_file is not None: content = uploaded_file.read().decode("utf-8") lines = [line.strip() for line in content.splitlines() if line.strip()] if lines: if st.button("Analyser le fichier"): with st.spinner("Analyse en batch..."): df_result = detect_fake_news(lines) df_result = df_result[df_result["Score de Confiance"] >= threshold] st.success(f"{len(df_result)} textes analysés avec succès.") st.dataframe(df_result, use_container_width=True) if show_graphs and not df_result.empty: st.write("Visualisation") show_fake_news_graph(df_result) if show_animations and not df_result.empty: animate_scores(df_result) else: st.warning("Le fichier est vide ou mal formaté.") # Footer st.markdown("""---""") st.caption("Projet de détection automatique de fake news réalisé avec Python et Streamlit")