L'analyse temporelle peut révéler des tendances importantes dans le corpus au fil du temps, comment certains thèmes ou sujets ont gagné ou perdu en importance.
10 mots-clés les plus fréquents
Les graphiques présentés ici montrent la fréquence annuelle des dix mots-clés les plus fréquents dans chaque corpus, tels qu'ils sont dérivés des métadonnées du Dublin Core Subject. Cette visualisation offre des observations intéressantes sur la dynamique de la prévalence des mots-clés, mettant en évidence trois tendances principales :
- Variabilité : la fréquence de certains mots-clés reste relativement stable d'une année à l'autre, tandis que d'autres présentent des fluctuations marquées. Cette variabilité peut refléter des changements dans l'orientation de la couverture médiatique ou dans l'intérêt du public.
- Dominance : certains mots-clés apparaissent systématiquement plus souvent que d'autres, soulignant leur pertinence ou leur importance dans le corpus. Cette dominance suggère que ces questions sont au cœur du discours capturé dans l'ensemble de données.
- Changements temporels : des pics ou des baisses notables de la fréquence de certains mots-clés au cours d'années particulières peuvent signaler des changements sociopolitiques ou culturels plus larges qui influencent le discours. Ces changements temporels fournissent des indices précieux pour comprendre le contexte et l'évolution des sujets abordés.
Il est important de noter que l'attribution de ces mots-clés a été faite manuellement et que la sélection n'est pas exhaustive. Par conséquent, l'analyse présentée ici doit être considérée comme un premier aperçu qui mérite un examen plus approfondi pour apprécier pleinement les complexités et les subtilités de l'ensemble de données.
Une analyse comparative des tendances de fréquence des mots-clés au Bénin et au Burkina Faso révèle à la fois des convergences et des divergences qui reflètent le paysage médiatique de chaque pays. Dans les deux pays, les fêtes islamiques, en particulier l'Aïd al-Adha, le Ramadan et l'Aïd el-Fitr, apparaissent systématiquement dans la presse, ce qui suggère une couverture importante de ces célébrations. La variabilité observée dans la fréquence des mots-clés dans les deux ensembles de données peut signaler des changements dans les intérêts de la société, les récits des médias ou l'impact des événements extérieurs dans la région.
Cependant, les données mettent également en évidence différents aspects de l'attention portée par les médias à chaque pays. Le corpus du Burkina Faso met particulièrement en évidence la figure d'Oumarou Kanazoé et les thèmes du terrorisme, avec une escalade marquée de la fréquence des mots-clés "Terrorisme et radicalisation" au cours des dernières années. Cette augmentation suggère que ces événements ont eu un impact significatif sur le discours public. Il est intéressant de noter que, malgré les préoccupations croissantes concernant l'infiltration de mouvements djihadistes dans la région du Golfe de Guinée, cette question n'est pas prévalente dans les données béninoises.
En outre, la présence de termes tels que l'Association des Élèves et Étudiants Musulmans au Burkina et l'enseignement confessionnel islamique dans le graphique du Burkina Faso souligne un fort intérêt ou une forte influence pour l'éducation islamique et les organisations islamiques. Cet aspect est moins prononcé dans le discours du Bénin, ce qui suggère des différences possibles dans les structures sociales et éducatives relatives aux communautés islamiques dans les deux pays.
Ces différences et ces schémas ne sont pas seulement révélateurs des différents récits nationaux, mais aussi des différents degrés d'importance accordés à certaines questions sociales, politiques et religieuses dans les médias de chaque pays.
Code Python
Pour garantir la transparence et la reproductibilité de notre analyse, l'extrait de code Python suivant montre comment nous avons interagi avec l'API de l'IWAC pour récupérer les données nécessaires et effectuer l'analyse de la fréquence des mots clés.
import requests | |
import pandas as pd | |
import plotly.graph_objs as go | |
from tqdm.auto import tqdm | |
from collections import Counter | |
from concurrent.futures import ThreadPoolExecutor, as_completed | |
# Function to fetch data from a single item set | |
def fetch_data(api_url, item_set_id): | |
page = 1 | |
items = [] | |
while True: | |
response = requests.get(f"{api_url}/items", params={"item_set_id": item_set_id, "page": page}) | |
data = response.json() | |
if data: | |
items.extend(data) | |
page += 1 | |
else: | |
break | |
return items | |
# Function to fetch and process data for all item sets in a country | |
def fetch_and_process_data(api_url, item_sets): | |
all_items = [] | |
# Use ThreadPoolExecutor to parallelize requests | |
with ThreadPoolExecutor(max_workers=5) as executor: | |
future_to_id = {executor.submit(fetch_data, api_url, id): id for id in item_sets} | |
for future in as_completed(future_to_id): | |
all_items.extend(future.result()) | |
# Process items to extract subjects and date | |
processed_data = [] | |
for item in all_items: | |
subjects = [sub['display_title'] for sub in item.get('dcterms:subject', []) if sub.get('display_title')] | |
date = item.get('dcterms:date', [{}])[0].get('@value') | |
for subject in subjects: | |
processed_data.append({ | |
'Subject': subject, | |
'Date': pd.to_datetime(date, errors='coerce') | |
}) | |
return pd.DataFrame(processed_data) | |
# Function to create an interactive keyword graph for each country | |
def create_interactive_keyword_graph(df, country, output_filename): | |
top_keywords = Counter(df['Subject']).most_common(10) | |
top_keywords = [keyword for keyword, count in top_keywords] | |
df_top_keywords = df[df['Subject'].isin(top_keywords)] | |
df_grouped = df_top_keywords.groupby([df_top_keywords['Date'].dt.year, 'Subject']).size().reset_index( | |
name='Frequency') | |
fig = go.Figure() | |
for keyword in top_keywords: | |
df_keyword = df_grouped[df_grouped['Subject'] == keyword] | |
fig.add_trace(go.Scatter( | |
x=df_keyword['Date'], | |
y=df_keyword['Frequency'], | |
mode='lines+markers', | |
name=keyword | |
)) | |
fig.update_layout( | |
title=f"Annual Frequency of Top 10 Keywords in {country}", | |
xaxis=dict(title="Year", rangeslider=dict(visible=True), type="date"), | |
yaxis=dict(title="Frequency") | |
) | |
fig.write_html(f"{output_filename}_{country}.html", full_html=True, include_plotlyjs='cdn') | |
# Example usage | |
api_url = "https://iwac.frederickmadore.com/api" | |
country_item_sets = { | |
"Bénin": ["2187", "2188", "2189"], | |
"Burkina Faso": ["2200", "2215", "2214", "2207", "2201"] | |
} | |
# Process and create graphs for each country | |
for country, item_sets in country_item_sets.items(): | |
df = fetch_and_process_data(api_url, item_sets) | |
create_interactive_keyword_graph(df, country, "top_keywords_graph") | |
tqdm.write(f"Interactive graph has been created for {country}.") | |
Comparaison de plusieurs mots-clés
Ces graphiques montrent les fréquences annuelles des mots-clés sélectionnés (thèmes, associations islamiques et responsables musulmans), ce qui permet une analyse comparative.
Code Python
import requests | |
import pandas as pd | |
import plotly.graph_objs as go | |
from tqdm.auto import tqdm | |
from concurrent.futures import ThreadPoolExecutor, as_completed | |
def fetch_data(api_url, item_set_id): | |
page = 1 | |
items = [] | |
while True: | |
response = requests.get(f"{api_url}/items", params={"item_set_id": item_set_id, "page": page}) | |
data = response.json() | |
if data: | |
items.extend(data) | |
page += 1 | |
else: | |
break | |
return items | |
def fetch_title_for_id(api_url, keyword_id): | |
response = requests.get(f"{api_url}/items/{keyword_id}") | |
data = response.json() | |
return data.get('dcterms:title', [{}])[0].get('@value', 'Unknown Title') | |
def fetch_and_process_data(api_url, item_sets, selected_keyword_ids): | |
all_items = [] | |
with ThreadPoolExecutor(max_workers=5) as executor: | |
future_to_id = {executor.submit(fetch_data, api_url, id): id for id in item_sets} | |
for future in tqdm(as_completed(future_to_id), total=len(item_sets), desc="Fetching item sets"): | |
all_items.extend(future.result()) | |
processed_data = [] | |
selected_keyword_ids_set = set(map(int, selected_keyword_ids)) # Convert to set of integers for faster lookup | |
for item in tqdm(all_items, desc="Processing items"): | |
subjects = item.get('dcterms:subject', []) | |
date = item.get('dcterms:date', [{}])[0].get('@value') | |
for subject in subjects: | |
if subject.get('value_resource_id') in selected_keyword_ids_set: | |
processed_data.append({ | |
'Subject': subject['display_title'], | |
'Date': pd.to_datetime(date, errors='coerce'), | |
'ID': subject['value_resource_id'] | |
}) | |
return pd.DataFrame(processed_data) | |
def create_interactive_keyword_graph(api_url, df, selected_keyword_ids, output_filename): | |
if df.empty: | |
print("No data available for the selected keyword IDs.") | |
return | |
# Fetch titles for the keywords | |
keyword_titles = {str(id): fetch_title_for_id(api_url, id) for id in tqdm(selected_keyword_ids, desc="Fetching titles")} | |
df_grouped = df.groupby([df['Date'].dt.year, 'Subject', 'ID']).size().reset_index(name='Frequency') | |
fig = go.Figure() | |
for keyword_id in selected_keyword_ids: | |
if keyword_id in df['ID'].astype(str).unique(): | |
subject_title = keyword_titles[keyword_id] | |
df_keyword = df_grouped[df_grouped['ID'] == int(keyword_id)] | |
fig.add_trace(go.Scatter( | |
x=df_keyword['Date'], | |
y=df_keyword['Frequency'], | |
mode='lines+markers', | |
name=subject_title # Use the fetched title as the trace name | |
)) | |
else: | |
print(f"No data found for ID {keyword_id}. Skipping this ID.") | |
fig.update_layout( | |
title="Annual Frequency of Selected Muslim Leaders in Burkina Faso", | |
xaxis=dict(title="Year", rangeslider=dict(visible=True), type="date"), | |
yaxis=dict(title="Frequency"), | |
legend_title="Keyword Title" | |
) | |
fig.write_html(f"{output_filename}.html", full_html=True, include_plotlyjs='cdn') | |
print(f"Interactive graph has been created. File saved as '{output_filename}.html'") | |
# Example usage | |
api_url = "https://iwac.frederickmadore.com/api" | |
all_item_sets = ["2200", "2215", "2214", "2207", "2201"] | |
selected_keyword_ids = ["898", "861", "944", "960", "947", "855", "1102", "1053", "912"] | |
df = fetch_and_process_data(api_url, all_item_sets, selected_keyword_ids) | |
create_interactive_keyword_graph(api_url, df, selected_keyword_ids, "selected_keywords_graph") |