File size: 4,662 Bytes
d814fb3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
# 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")
|