MaghrebInsights / app.py
zetaah's picture
Create app.py
574ec5c verified
raw
history blame
No virus
6.75 kB
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(
"""
<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/)")