File size: 7,204 Bytes
58043e3
dbab432
c65b27b
 
dad07c8
 
 
 
 
 
 
 
 
 
 
 
c65b27b
dbab432
 
 
dad07c8
 
 
 
 
 
 
 
 
 
 
 
c65b27b
dad07c8
 
c65b27b
dbab432
c65b27b
 
dad07c8
 
dbab432
dad07c8
dbab432
c65b27b
 
dad07c8
 
c65b27b
dad07c8
 
 
c65b27b
 
dad07c8
dbab432
dad07c8
dbab432
c65b27b
 
dad07c8
dbab432
 
 
 
 
 
c65b27b
dad07c8
 
dbab432
 
 
 
 
 
c65b27b
 
dad07c8
dbab432
 
 
 
 
c65b27b
dbab432
dad07c8
 
 
dbab432
 
c65b27b
 
dad07c8
 
 
 
dbab432
dad07c8
dbab432
c65b27b
dbab432
dad07c8
c65b27b
dbab432
 
 
 
 
 
c65b27b
dad07c8
 
dbab432
dad07c8
dbab432
c65b27b
dbab432
c65b27b
dbab432
c65b27b
 
 
dbab432
 
 
 
 
 
 
 
 
 
 
 
 
dad07c8
c65b27b
 
58043e3
 
c65b27b
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
import pandas as pd
import plotly.express as px
import gradio as gr

# Configurazione: nomi delle colonne presenti nel dataset
COL_TITOLO       = "titolo_articolo"
COL_AUTORE1      = "primo_autore"
COL_AUTORE2      = "secondo_autore"
COL_AUTORE3      = "terzo_autore"
COL_ANNO         = "anno_pubblicazione"
COL_LINGUA       = "lingua"
COL_KEYWORD      = "keyword"
COL_TESTO        = "testo_txt"        # Colonna contenente il testo dell'articolo (se necessaria)
COL_NUM_PAROLE   = "num_parole"       # Colonna con il numero di parole per articolo
COL_LUOGHI       = "luoghi_citati"

def genera_grafici():
    # Caricamento del dataset
    df = pd.read_csv("sa-dataset.csv")
    
    # Verifica colonne fondamentali
    colonne_necessarie = [COL_ANNO, COL_LINGUA, COL_KEYWORD, COL_NUM_PAROLE, COL_LUOGHI, COL_AUTORE1, COL_AUTORE2, COL_AUTORE3]
    for col in colonne_necessarie:
        if col not in df.columns:
            raise KeyError(f"Il dataset non contiene la colonna '{col}'. Verificare il file.")
    
    # Assicurarsi che COL_NUM_PAROLE sia numerico
    df[COL_NUM_PAROLE] = pd.to_numeric(df[COL_NUM_PAROLE], errors="coerce")
    
    # Creazione di una colonna 'lista_autori' combinando i tre autori (filtrando eventuali valori nulli o vuoti)
    df["lista_autori"] = df[[COL_AUTORE1, COL_AUTORE2, COL_AUTORE3]].apply(
        lambda row: [a for a in row if pd.notnull(a) and str(a).strip() != ""], axis=1)
    
    # Creazione della serie degli autori (esplosione della lista)
    autori_explosi = df.explode("lista_autori")
    
    figures = []

    # 1. Lunghezza media di articoli per anno
    df_media = df.groupby(COL_ANNO)[COL_NUM_PAROLE].mean().reset_index()
    fig1 = px.bar(df_media, x=COL_ANNO, y=COL_NUM_PAROLE,
                  title="Lunghezza media di articoli per anno",
                  labels={COL_ANNO: "Anno", COL_NUM_PAROLE: "Numero medio di parole"})
    figures.append(fig1)

    # 2. Trend delle keyword per anno
    # Suddivide le keyword in lista (assumendo che siano separate da virgola)
    df["keyword_list"] = df[COL_KEYWORD].apply(lambda x: [k.strip() for k in str(x).split(",") if k.strip() != ""])
    df_keywords = df.explode("keyword_list")
    # Calcola la frequenza delle keyword per anno
    keyword_year = df_keywords.groupby([COL_ANNO, "keyword_list"]).size().reset_index(name="count")
    # Seleziona le 5 keyword più frequenti complessivamente
    top_keywords = df_keywords["keyword_list"].value_counts().head(5).index.tolist()
    keyword_year_top = keyword_year[keyword_year["keyword_list"].isin(top_keywords)]
    fig2 = px.line(keyword_year_top, x=COL_ANNO, y="count", color="keyword_list", markers=True,
                   title="Trend delle keyword per anno",
                   labels={COL_ANNO: "Anno", "count": "Frequenza", "keyword_list": "Keyword"})
    figures.append(fig2)

    # 3. Produttività degli autori (15 autori più prolifici)
    top15_autori = autori_explosi["lista_autori"].value_counts().head(15).reset_index()
    top15_autori.columns = ["autore", "count"]
    fig3 = px.bar(top15_autori, x="autore", y="count",
                  title="Produttività degli autori (15 autori più prolifici)",
                  labels={"autore": "Autore", "count": "Numero di articoli"})
    fig3.update_layout(xaxis_tickangle=-45)
    figures.append(fig3)

    # 4. Numero complessivo di articoli per ciascun autore (tutti gli autori)
    articoli_per_autore = autori_explosi["lista_autori"].value_counts().reset_index()
    articoli_per_autore.columns = ["autore", "count"]
    fig4 = px.bar(articoli_per_autore, x="autore", y="count",
                  title="Numero complessivo di articoli per ciascun autore",
                  labels={"autore": "Autore", "count": "Numero di articoli"})
    fig4.update_layout(xaxis_tickangle=-45)
    figures.append(fig4)

    # 5. Autori che hanno pubblicato più di 5 articoli
    autori_oltre5 = articoli_per_autore[articoli_per_autore["count"] > 5]
    fig5 = px.bar(autori_oltre5, x="autore", y="count",
                  title="Autori che hanno pubblicato più di 5 articoli",
                  labels={"autore": "Autore", "count": "Numero di articoli"})
    fig5.update_layout(xaxis_tickangle=-45)
    figures.append(fig5)

    # 6. Distribuzione per Lingua (grafico a torta)
    distribuzione_lingua = df[COL_LINGUA].value_counts().reset_index()
    distribuzione_lingua.columns = [COL_LINGUA, "count"]
    fig6 = px.pie(distribuzione_lingua, names=COL_LINGUA, values="count",
                  title="Distribuzione per Lingua", hole=0.3)
    figures.append(fig6)

    # 7. Numero di articoli per ciascun anno
    articoli_per_anno = df[COL_ANNO].value_counts().reset_index()
    articoli_per_anno.columns = [COL_ANNO, "count"]
    articoli_per_anno = articoli_per_anno.sort_values(COL_ANNO)
    fig7 = px.bar(articoli_per_anno, x=COL_ANNO, y="count",
                  title="Numero di articoli per ciascun anno",
                  labels={COL_ANNO: "Anno", "count": "Numero di articoli"})
    figures.append(fig7)

    # 8. Frequenza dei luoghi citati (top 10)
    df["luoghi_list"] = df[COL_LUOGHI].apply(lambda x: [l.strip() for l in str(x).split(",") if l.strip() != ""])
    df_luoghi = df.explode("luoghi_list")
    frequenza_luoghi = df_luoghi["luoghi_list"].value_counts().head(10).reset_index()
    frequenza_luoghi.columns = ["luogo", "count"]
    fig8 = px.bar(frequenza_luoghi, x="count", y="luogo", orientation="h",
                  title="Frequenza dei luoghi citati (top 10)",
                  labels={"luogo": "Luogo", "count": "Frequenza"})
    figures.append(fig8)

    # 9. Distribuzione del numero di parole per articolo (istogramma)
    fig9 = px.histogram(df, x=COL_NUM_PAROLE, nbins=20,
                        title="Distribuzione del numero di parole per articolo",
                        labels={COL_NUM_PAROLE: "Numero di parole", "count": "Frequenza"})
    figures.append(fig9)

    return figures

# Creazione dell'interfaccia Gradio con nove output interattivi
demo = gr.Interface(
    fn=genera_grafici,
    inputs=[],
    outputs=[
        gr.Plot(label="Grafico 1: Lunghezza media di articoli per anno"),
        gr.Plot(label="Grafico 2: Trend delle keyword per anno"),
        gr.Plot(label="Grafico 3: Produttività degli autori (15 autori più prolifici)"),
        gr.Plot(label="Grafico 4: Numero complessivo di articoli per ciascun autore"),
        gr.Plot(label="Grafico 5: Autori che hanno pubblicato più di 5 articoli"),
        gr.Plot(label="Grafico 6: Distribuzione per Lingua"),
        gr.Plot(label="Grafico 7: Numero di articoli per ciascun anno"),
        gr.Plot(label="Grafico 8: Frequenza dei luoghi citati (top 10)"),
        gr.Plot(label="Grafico 9: Distribuzione del numero di parole per articolo")
    ],
    title="Visualizzazione Grafici Interattivi del Dataset",
    description=("Questo spazio visualizza una serie di grafici interattivi derivati dal dataset. "
                 "I grafici mostrano, tra gli altri, la lunghezza media degli articoli per anno, il trend delle keyword, "
                 "la produttività degli autori e la distribuzione per lingua.")
)

if __name__ == "__main__":
    demo.launch()