Spaces:
Runtime error
Runtime error
| 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 | |
| # Get the current working directory | |
| current_directory = os.getcwd() | |
| # Define the file name | |
| file_name = "data_tsa.json" | |
| # Build the full path to the JSON file | |
| DATA_FILE = "data_tsa.json" #"https://huggingface.co/spaces/ZETAIB/MaghrebInsights/raw/main/data_tsa.json" #os.path.join(current_directory, file_name) | |
| # --- 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) | |
| 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( | |
| """ | |
| <style> | |
| body { | |
| font-family: 'Helvetica', sans-serif; | |
| } | |
| .stButton>button { | |
| background-color: #4CAF50; /* Green */ | |
| border: none; | |
| color: white; | |
| padding: 10px 20px; | |
| text-align: center; | |
| text-decoration: none; | |
| display: inline-block; | |
| font-size: 16px; | |
| margin: 4px 2px; | |
| cursor: pointer; | |
| } | |
| </style> | |
| """, | |
| unsafe_allow_html=True, | |
| ) | |
| # Load and display data | |
| data_js,data_str, num_articles = load_and_process_data(DATA_FILE) | |
| 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 ..."): | |
| genai.configure(api_key=GENAI_API_KEY) | |
| # 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/)") |