Spaces:
Sleeping
Sleeping
File size: 6,746 Bytes
574ec5c |
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 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 |
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/)") |