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")