zetaah commited on
Commit
574ec5c
1 Parent(s): 147b544

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +182 -0
app.py ADDED
@@ -0,0 +1,182 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import json
3
+ import google.generativeai as genai
4
+ import re
5
+ import random
6
+ import os
7
+
8
+ # --- Secure API Key Management ---
9
+
10
+ # Use environment variables to store API keys.
11
+ # This keeps them out of your codebase for security.
12
+ GENAI_API_KEY = os.environ.get("GENAI_API_KEY")
13
+
14
+ # You can set multiple keys in your environment and choose randomly:
15
+ # GENAI_API_KEYS = os.environ.get("GENAI_API_KEYS").split(",")
16
+ # GENAI_API_KEY = random.choice(GENAI_API_KEYS)
17
+
18
+ if GENAI_API_KEY is None:
19
+ st.error("API Key not found. Please set the `GENAI_API_KEY` environment variable.")
20
+ st.stop() # Stop execution if the key is missing
21
+
22
+
23
+ # Data File Path
24
+ DATA_FILE = "data_tsa.json"
25
+
26
+ # --- Helper Functions ---
27
+
28
+ def count_word_occurrences(text, word='maroc'):
29
+ """Counts occurrences of a word, including variations (e.g., plural, feminine)."""
30
+ pattern1 = re.compile(r'\b' + re.escape(word) + r'(?:s?|aine)?\b', re.IGNORECASE)
31
+ pattern2 = re.compile(r'\b' + re.escape(word) + r'(?:s?|ain)?\b', re.IGNORECASE)
32
+ matches = pattern1.findall(text) + pattern2.findall(text)
33
+ return len(matches)
34
+ @st.cache_data
35
+ def load_and_process_data(file_path):
36
+ """Loads data from JSON, handles different formats, and prepares for display."""
37
+ with open(file_path, 'r') as f:
38
+ data_js = json.load(f)
39
+ try:
40
+ data = data_js[:100]
41
+ except:
42
+ data = data_js
43
+
44
+ # Determine data structure for counting articles
45
+ if isinstance(data, dict):
46
+ try:
47
+ num_articles = sum(len(v) for v in data.values())
48
+ except TypeError:
49
+ num_articles = len(data)
50
+ else:
51
+ num_articles = len(data)
52
+
53
+ # Limit data displayed to prevent UI overload (adjust as needed)
54
+ data_str = str(data)
55
+
56
+ return data_js,data_str, num_articles
57
+
58
+ # --- Streamlit App ---
59
+
60
+ # Title and Styling
61
+ st.set_page_config(page_title="Algeria Propaganda Analysis", page_icon="🇲🇦")
62
+ st.title("MaghrebInsights: Analyse de la Propagande Algérienne: Presse vs Maroc 🇲🇦")
63
+ st.markdown(
64
+ """
65
+ <style>
66
+ body {
67
+ font-family: 'Helvetica', sans-serif;
68
+ }
69
+ .stButton>button {
70
+ background-color: #4CAF50; /* Green */
71
+ border: none;
72
+ color: white;
73
+ padding: 10px 20px;
74
+ text-align: center;
75
+ text-decoration: none;
76
+ display: inline-block;
77
+ font-size: 16px;
78
+ margin: 4px 2px;
79
+ cursor: pointer;
80
+ }
81
+ </style>
82
+ """,
83
+ unsafe_allow_html=True,
84
+ )
85
+
86
+ # Load and display data
87
+ data_js,data_str, num_articles = load_and_process_data(DATA_FILE)
88
+ print(num_articles,data_str)
89
+ st.subheader("Extrait des Données:")
90
+ st.json(data_js)
91
+
92
+ # --- User Input Section ---
93
+
94
+ st.sidebar.header("Paramètres du Rapport")
95
+ word_to_analyze = st.sidebar.text_input("Mot-clé à analyser", value="maroc")
96
+ st.sidebar.markdown("___") # Visual separator
97
+
98
+ # Pre-calculate word occurrences
99
+ occurrences = count_word_occurrences(data_str, word_to_analyze)
100
+
101
+ # --- Report Generation ---
102
+
103
+ # Craft dynamic prompt
104
+ user_input = f"""
105
+ - Incarnez un expert marocain en analyse de propagande, de stratégie militaire et de désinformation.
106
+ - Analysez ces données extraites de la presse algérienne : {data_str}
107
+ - Nombre total d'articles analysés: {num_articles}
108
+ - Nombre d'occurrences du mot "{word_to_analyze}" dans les données : {occurrences}
109
+
110
+ ### Objectif :
111
+
112
+ Analyser les données fournies d'un point de vue politique et propagandiste afin de :
113
+
114
+ ### Tâches :
115
+
116
+ 1. **Résumé des données**:
117
+ - Fournir un résumé des données avec toutes les informations pertinentes.
118
+ - Dates, période, NOMBRE D'ARTICLES = {num_articles}
119
+ - Nombre d'occurrences du Maroc dans les données : {occurrences}
120
+
121
+ 2. **Analyse Critique**:
122
+ - Mener une analyse critique des données, en se concentrant sur les interprétations et les implications nuancées.
123
+
124
+ 3. **Analyse de la Propagande**:
125
+ - Identifier et analyser les cas de techniques de propagande telles que la désinformation, la manipulation ou les messages persuasifs dans les données.
126
+
127
+ 4. **Méthodologie**:
128
+ - 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.
129
+
130
+ 5. **Conclusions Clés**:
131
+ - 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.
132
+
133
+ 6. **Recommandations**:
134
+ - 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.
135
+
136
+ 7. **Conclusion**:
137
+ - Résumer les connaissances politiques et de propagande acquises grâce à l'analyse. Discuter des implications plus larges et des conséquences potentielles.
138
+
139
+ ### Instructions pour l'IA :
140
+ - **Expertise en Politique et Propagande**:
141
+ - Analyser les données avec une compréhension approfondie de la dynamique politique et des techniques de propagande.
142
+
143
+ - **Analyse Critique**:
144
+ - Mener une analyse critique des données, en se concentrant sur les interprétations et les implications nuancées.
145
+
146
+ - **Observations fondées sur des Preuves**:
147
+ - Soutenir les conclusions avec des exemples concrets et des preuves issues des données.
148
+
149
+ - **Considérations Éthiques**:
150
+ - Tenir compte des implications éthiques liées à l'analyse politique et à la propagande.
151
+
152
+ - **Lignes Directrices de Formatage**:
153
+ - Formater le rapport de manière professionnelle, en utilisant des titres et sous-titres appropriés. Assurer la clarté et la lisibilité.
154
+ ### Références :
155
+ Veuillez vous assurer de citer chaque déclaration en utilisant les URL des données au format Markdown.
156
+ """
157
+
158
+ if st.sidebar.button("Générer le Rapport Complet"):
159
+ with st.spinner("Analyse en cours ..."):
160
+ # AI Model Configuration
161
+ generation_config = {
162
+ "temperature": 0.8, # Adjust for creativity (0.2 - more focused, 1.0 - more creative)
163
+ "top_p": 0.95, # Controls the diversity of the generated text
164
+ "top_k": 40, # Limits the next token choices to the top 'k' probabilities
165
+ "max_output_tokens": 4096, # Adjust based on expected report length
166
+ }
167
+
168
+ model = genai.GenerativeModel(
169
+ model_name="gemini-1.5-flash",
170
+ generation_config=generation_config,
171
+ )
172
+
173
+ chat_session = model.start_chat(
174
+ history=[{"role": "user", "parts": [user_input]}],
175
+ )
176
+
177
+ response = chat_session.send_message(user_input)
178
+ st.markdown(response.text)
179
+
180
+ # Footer
181
+ st.markdown("---")
182
+ st.markdown("Développé par [Ayoub Abraich](https://ayoubabraich.netlify.app/)")