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/)")