import streamlit as st import json import google.generativeai as genai import re import random import os # --- Secure API Key Management --- # Use environment variables to store API keys. # This keeps them out of your codebase for security. GENAI_API_KEY = os.environ.get("GENAI_API_KEY") # You can set multiple keys in your environment and choose randomly: # GENAI_API_KEYS = os.environ.get("GENAI_API_KEYS").split(",") # GENAI_API_KEY = random.choice(GENAI_API_KEYS) if GENAI_API_KEY is None: st.error("API Key not found. Please set the `GENAI_API_KEY` environment variable.") st.stop() # Stop execution if the key is missing # Data File Path DATA_FILE = "data_tsa.json" # --- Helper Functions --- def count_word_occurrences(text, word='maroc'): """Counts occurrences of a word, including variations (e.g., plural, feminine).""" pattern1 = re.compile(r'\b' + re.escape(word) + r'(?:s?|aine)?\b', re.IGNORECASE) pattern2 = re.compile(r'\b' + re.escape(word) + r'(?:s?|ain)?\b', re.IGNORECASE) matches = pattern1.findall(text) + pattern2.findall(text) return len(matches) @st.cache_data def load_and_process_data(file_path): """Loads data from JSON, handles different formats, and prepares for display.""" with open(file_path, 'r') as f: data_js = json.load(f) try: data = data_js[:100] except: data = data_js # Determine data structure for counting articles if isinstance(data, dict): try: num_articles = sum(len(v) for v in data.values()) except TypeError: num_articles = len(data) else: num_articles = len(data) # Limit data displayed to prevent UI overload (adjust as needed) data_str = str(data) return data_js,data_str, num_articles # --- Streamlit App --- # Title and Styling st.set_page_config(page_title="Algeria Propaganda Analysis", page_icon="🇲🇦") st.title("MaghrebInsights: Analyse de la Propagande Algérienne: Presse vs Maroc 🇲🇦") st.markdown( """ """, unsafe_allow_html=True, ) # Load and display data data_js,data_str, num_articles = load_and_process_data(DATA_FILE) print(num_articles,data_str) st.subheader("Extrait des Données:") st.json(data_js) # --- User Input Section --- st.sidebar.header("Paramètres du Rapport") word_to_analyze = st.sidebar.text_input("Mot-clé à analyser", value="maroc") st.sidebar.markdown("___") # Visual separator # Pre-calculate word occurrences occurrences = count_word_occurrences(data_str, word_to_analyze) # --- Report Generation --- # Craft dynamic prompt user_input = f""" - Incarnez un expert marocain en analyse de propagande, de stratégie militaire et de désinformation. - Analysez ces données extraites de la presse algérienne : {data_str} - Nombre total d'articles analysés: {num_articles} - Nombre d'occurrences du mot "{word_to_analyze}" dans les données : {occurrences} ### Objectif : Analyser les données fournies d'un point de vue politique et propagandiste afin de : ### Tâches : 1. **Résumé des données**: - Fournir un résumé des données avec toutes les informations pertinentes. - Dates, période, NOMBRE D'ARTICLES = {num_articles} - Nombre d'occurrences du Maroc dans les données : {occurrences} 2. **Analyse Critique**: - Mener une analyse critique des données, en se concentrant sur les interprétations et les implications nuancées. 3. **Analyse de la Propagande**: - Identifier et analyser les cas de techniques de propagande telles que la désinformation, la manipulation ou les messages persuasifs dans les données. 4. **Méthodologie**: - Décrire les méthodes et techniques analytiques employées. Expliquer comment les aspects politiques et de propagande ont été intégrés à l'analyse. 5. **Conclusions Clés**: - Présenter des observations perspicaces sur les implications politiques et les éléments de propagande trouvés dans les données. Utiliser des exemples précis et des preuves pour étayer les conclusions. 6. **Recommandations**: - Offrir des recommandations d'experts basées sur l'analyse. Proposer des stratégies pour contrer ou atténuer les effets de la propagande si nécessaire. 7. **Conclusion**: - Résumer les connaissances politiques et de propagande acquises grâce à l'analyse. Discuter des implications plus larges et des conséquences potentielles. ### Instructions pour l'IA : - **Expertise en Politique et Propagande**: - Analyser les données avec une compréhension approfondie de la dynamique politique et des techniques de propagande. - **Analyse Critique**: - Mener une analyse critique des données, en se concentrant sur les interprétations et les implications nuancées. - **Observations fondées sur des Preuves**: - Soutenir les conclusions avec des exemples concrets et des preuves issues des données. - **Considérations Éthiques**: - Tenir compte des implications éthiques liées à l'analyse politique et à la propagande. - **Lignes Directrices de Formatage**: - Formater le rapport de manière professionnelle, en utilisant des titres et sous-titres appropriés. Assurer la clarté et la lisibilité. ### Références : Veuillez vous assurer de citer chaque déclaration en utilisant les URL des données au format Markdown. """ if st.sidebar.button("Générer le Rapport Complet"): with st.spinner("Analyse en cours ..."): # AI Model Configuration generation_config = { "temperature": 0.8, # Adjust for creativity (0.2 - more focused, 1.0 - more creative) "top_p": 0.95, # Controls the diversity of the generated text "top_k": 40, # Limits the next token choices to the top 'k' probabilities "max_output_tokens": 4096, # Adjust based on expected report length } model = genai.GenerativeModel( model_name="gemini-1.5-flash", generation_config=generation_config, ) chat_session = model.start_chat( history=[{"role": "user", "parts": [user_input]}], ) response = chat_session.send_message(user_input) st.markdown(response.text) # Footer st.markdown("---") st.markdown("Développé par [Ayoub Abraich](https://ayoubabraich.netlify.app/)")