Spaces:
Sleeping
Sleeping
Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,133 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import pandas as pd
|
3 |
+
import numpy as np
|
4 |
+
import plotly.express as px
|
5 |
+
from itertools import combinations
|
6 |
+
from collections import Counter
|
7 |
+
|
8 |
+
# Caricamento del dataset
|
9 |
+
file_path = 'sa-dataset.csv' # Assumiamo che il dataset sia nella stessa cartella
|
10 |
+
df = pd.read_csv(file_path)
|
11 |
+
df['anno_pubblicazione'] = pd.to_numeric(df['anno_pubblicazione'], errors='coerce')
|
12 |
+
df['num_parole'] = pd.to_numeric(df['num_parole'], errors='coerce')
|
13 |
+
|
14 |
+
# Funzione per calcolare la co-occorrenza delle parole chiave
|
15 |
+
def calcola_cooccorrenza_keywords(top_n=30):
|
16 |
+
keywords_list = df['keyword'].dropna().str.split(', ')
|
17 |
+
all_keywords = [kw for sublist in keywords_list for kw in sublist]
|
18 |
+
common_keywords = Counter(all_keywords).most_common(top_n)
|
19 |
+
common_keywords = [kw[0] for kw in common_keywords]
|
20 |
+
|
21 |
+
cooccurrence = Counter()
|
22 |
+
for keywords in keywords_list:
|
23 |
+
filtered_keywords = [kw for kw in keywords if kw in common_keywords]
|
24 |
+
cooccurrence.update(combinations(sorted(filtered_keywords), 2))
|
25 |
+
|
26 |
+
co_matrix = pd.DataFrame(np.zeros((len(common_keywords), len(common_keywords))),
|
27 |
+
index=common_keywords, columns=common_keywords)
|
28 |
+
for (kw1, kw2), count in cooccurrence.items():
|
29 |
+
co_matrix.loc[kw1, kw2] = count
|
30 |
+
co_matrix.loc[kw2, kw1] = count
|
31 |
+
|
32 |
+
return px.imshow(co_matrix, x=co_matrix.columns, y=co_matrix.index,
|
33 |
+
color_continuous_scale='Blues', labels=dict(color="Co-occorrenza"),
|
34 |
+
title="Mappa di Co-occorrenza delle Parole Chiave")
|
35 |
+
|
36 |
+
# Funzione per calcolare il trend delle keyword
|
37 |
+
def calcola_trend_keyword(top_n=10):
|
38 |
+
trend_df = df[['anno_pubblicazione', 'keyword']].dropna()
|
39 |
+
trend_df['keyword'] = trend_df['keyword'].str.split(', ')
|
40 |
+
trend_df = trend_df.explode('keyword')
|
41 |
+
keyword_counts = trend_df['keyword'].value_counts().head(top_n).index
|
42 |
+
trend_df = trend_df[trend_df['keyword'].isin(keyword_counts)]
|
43 |
+
trend_df = trend_df.groupby(['anno_pubblicazione', 'keyword']).size().reset_index(name='count')
|
44 |
+
|
45 |
+
return px.line(trend_df, x='anno_pubblicazione', y='count', color='keyword',
|
46 |
+
title='Trend Temporale delle Keyword',
|
47 |
+
labels={'anno_pubblicazione': 'Anno', 'count': 'Frequenza'})
|
48 |
+
|
49 |
+
# Funzione per calcolare la produttività degli autori
|
50 |
+
def produttivita_autori_mod(top_n=15, min_articoli=5):
|
51 |
+
autori_df = df[['anno_pubblicazione', 'primo_autore']].dropna()
|
52 |
+
total_counts = autori_df['primo_autore'].value_counts()
|
53 |
+
autori_eligible = total_counts[total_counts > min_articoli]
|
54 |
+
top_authors = autori_eligible.head(top_n).index
|
55 |
+
filtered_df = autori_df[autori_df['primo_autore'].isin(top_authors)]
|
56 |
+
produttivita = filtered_df.groupby(['anno_pubblicazione', 'primo_autore']).size().reset_index(name='conteggio')
|
57 |
+
|
58 |
+
return px.line(produttivita, x='anno_pubblicazione', y='conteggio', color='primo_autore',
|
59 |
+
title="Produttività degli Autori (Top 15 con >5 articoli)",
|
60 |
+
labels={'anno_pubblicazione': 'Anno', 'conteggio': 'Numero di Articoli'})
|
61 |
+
|
62 |
+
# Funzione per calcolare la frequenza dei luoghi citati
|
63 |
+
def frequenza_luoghi(top_n=10):
|
64 |
+
luoghi_df = df[['anno_pubblicazione', 'luoghi_citati']].dropna()
|
65 |
+
luoghi_df['luoghi_citati'] = luoghi_df['luoghi_citati'].str.split(', ')
|
66 |
+
luoghi_df = luoghi_df.explode('luoghi_citati')
|
67 |
+
luoghi_counts = luoghi_df['luoghi_citati'].value_counts().head(top_n).index
|
68 |
+
luoghi_df = luoghi_df[luoghi_df['luoghi_citati'].isin(luoghi_counts)]
|
69 |
+
luoghi_df = luoghi_df.groupby(['anno_pubblicazione', 'luoghi_citati']).size().reset_index(name='conteggio')
|
70 |
+
|
71 |
+
return px.line(luoghi_df, x='anno_pubblicazione', y='conteggio', color='luoghi_citati',
|
72 |
+
title="Frequenza dei Luoghi nel Tempo",
|
73 |
+
labels={'anno_pubblicazione': 'Anno', 'conteggio': 'Frequenza'})
|
74 |
+
|
75 |
+
# Funzioni per grafici aggiuntivi
|
76 |
+
def numero_parole_per_articolo():
|
77 |
+
return px.histogram(df, x='num_parole', title='Distribuzione del Numero di Parole per Articolo',
|
78 |
+
nbins=50, labels={'num_parole': 'Numero di Parole', 'count': 'Numero di Articoli'},
|
79 |
+
template='plotly')
|
80 |
+
|
81 |
+
def distribuzione_per_anno():
|
82 |
+
return px.histogram(df, x='anno_pubblicazione', title='Distribuzione degli Articoli per Anno di Pubblicazione',
|
83 |
+
nbins=50, labels={'anno_pubblicazione': 'Anno di Pubblicazione', 'count': 'Numero di Articoli'},
|
84 |
+
template='plotly')
|
85 |
+
|
86 |
+
def distribuzione_per_lingua():
|
87 |
+
return px.pie(df, names='lingua', title='Distribuzione degli Articoli per Lingua', template='plotly')
|
88 |
+
|
89 |
+
# **NUOVI GRAFICI AGGIUNTI**
|
90 |
+
def distribuzione_articoli_per_autore():
|
91 |
+
return px.histogram(df, x='primo_autore', title='Distribuzione del Numero di Articoli per Autore',
|
92 |
+
nbins=50, labels={'primo_autore': 'Autore', 'count': 'Numero di Articoli'},
|
93 |
+
template='plotly')
|
94 |
+
|
95 |
+
def evoluzione_articoli_per_anno():
|
96 |
+
conteggio_annuale = df['anno_pubblicazione'].value_counts().reset_index()
|
97 |
+
conteggio_annuale.columns = ['anno_pubblicazione', 'conteggio']
|
98 |
+
return px.line(conteggio_annuale, x='anno_pubblicazione', y='conteggio',
|
99 |
+
title='Evoluzione Temporale del Numero di Articoli Pubblicati',
|
100 |
+
labels={'anno_pubblicazione': 'Anno', 'conteggio': 'Numero di Articoli'})
|
101 |
+
|
102 |
+
def lunghezza_media_articoli_per_anno():
|
103 |
+
lunghezza_media = df.groupby('anno_pubblicazione')['num_parole'].mean().reset_index()
|
104 |
+
return px.line(lunghezza_media, x='anno_pubblicazione', y='num_parole',
|
105 |
+
title='Lunghezza Media degli Articoli per Anno',
|
106 |
+
labels={'anno_pubblicazione': 'Anno', 'num_parole': 'Lunghezza Media (Parole)'})
|
107 |
+
|
108 |
+
# **Creazione interfaccia Gradio**
|
109 |
+
with gr.Blocks() as app:
|
110 |
+
gr.Markdown("## Dashboard per l'Analisi degli Articoli di Storia dell'Arte")
|
111 |
+
|
112 |
+
with gr.Row():
|
113 |
+
cooccorrenza = gr.Plot(label="Co-occorrenza delle Parole Chiave")
|
114 |
+
trend = gr.Plot(label="Trend Temporale delle Keyword")
|
115 |
+
|
116 |
+
with gr.Row():
|
117 |
+
produttivita = gr.Plot(label="Produttività degli Autori")
|
118 |
+
distribuzione_autori = gr.Plot(label="Distribuzione del Numero di Articoli per Autore")
|
119 |
+
|
120 |
+
with gr.Row():
|
121 |
+
evoluzione_articoli = gr.Plot(label="Evoluzione del Numero di Articoli Pubblicati")
|
122 |
+
lunghezza_media = gr.Plot(label="Lunghezza Media degli Articoli per Anno")
|
123 |
+
|
124 |
+
btn = gr.Button("Genera Grafici")
|
125 |
+
btn.click(lambda: (calcola_cooccorrenza_keywords(), calcola_trend_keyword(), produttivita_autori_mod(),
|
126 |
+
frequenza_luoghi(), numero_parole_per_articolo(), distribuzione_per_anno(),
|
127 |
+
distribuzione_per_lingua(), distribuzione_articoli_per_autore(),
|
128 |
+
evoluzione_articoli_per_anno(), lunghezza_media_articoli_per_anno()),
|
129 |
+
inputs=[], outputs=[cooccorrenza, trend, produttivita, distribuzione_autori,
|
130 |
+
evoluzione_articoli, lunghezza_media])
|
131 |
+
|
132 |
+
if __name__ == "__main__":
|
133 |
+
app.launch()
|