|
|
|
|
|
import streamlit as st |
|
from transformers import pipeline |
|
import pandas as pd |
|
import matplotlib.pyplot as plt |
|
import time |
|
from datetime import datetime |
|
|
|
|
|
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" |
|
) |
|
|
|
|
|
@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() |
|
|
|
|
|
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']) |
|
|
|
|
|
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**. |
|
""") |
|
|
|
|
|
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()}") |
|
|
|
|
|
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é.") |
|
|
|
|
|
st.markdown("""---""") |
|
st.caption("Projet de détection automatique de fake news réalisé avec Python et Streamlit") |
|
|