Spaces:
Sleeping
Sleeping
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) | |
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) | |
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/)") |