| import gradio as gr
|
| import networkx as nx
|
| import matplotlib
|
| import matplotlib.pyplot as plt
|
| import random
|
|
|
|
|
| matplotlib.use('Agg')
|
|
|
|
|
|
|
|
|
|
|
|
|
| def create_twitter_network():
|
|
|
| G = nx.barabasi_albert_graph(75, 2, seed=42)
|
|
|
|
|
| mapping = {i: f"@User_{i+1}" for i in range(75)}
|
| G = nx.relabel_nodes(G, mapping)
|
| return G
|
|
|
| G = create_twitter_network()
|
|
|
|
|
| all_users = list(G.nodes())
|
|
|
|
|
|
|
|
|
| def analyze_network(target_user):
|
| fig, ax = plt.subplots(figsize=(10, 8))
|
|
|
|
|
| pos = nx.spring_layout(G, seed=42)
|
|
|
|
|
| nx.draw_networkx_edges(G, pos, alpha=0.15, ax=ax)
|
|
|
|
|
| node_colors = []
|
| node_sizes = []
|
|
|
| for node in G.nodes():
|
| if node == target_user:
|
| node_colors.append('#e74c3c')
|
| node_sizes.append(400)
|
| elif G.has_edge(target_user, node):
|
| node_colors.append('#f39c12')
|
| node_sizes.append(150)
|
| else:
|
| node_colors.append('#3498db')
|
| node_sizes.append(30)
|
|
|
| nx.draw_networkx_nodes(G, pos, node_color=node_colors, node_size=node_sizes, ax=ax)
|
|
|
|
|
| labels = {n: n for n in G.nodes() if n == target_user or G.has_edge(target_user, n)}
|
| nx.draw_networkx_labels(G, pos, labels=labels, font_size=9, font_weight="bold", ax=ax)
|
|
|
| ax.set_title("π Peta Jaringan Interaksi Twitter", fontsize=14)
|
| ax.axis('off')
|
| fig.tight_layout()
|
|
|
|
|
| degree_dict = dict(G.degree())
|
| top_influencer = max(degree_dict, key=degree_dict.get)
|
| koneksi_target = degree_dict[target_user]
|
|
|
|
|
| analisis_teks = f"""
|
| ### π Hasil Analisis Jaringan
|
| * **Top Influencer Global:** `{top_influencer}` (Akun dengan interaksi terbanyak di jaringan ini).
|
| * **Status `{target_user}`:** Memiliki koneksi langsung dengan **{koneksi_target} akun lain**.
|
| """
|
|
|
| return fig, analisis_teks
|
|
|
|
|
|
|
|
|
| with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
| gr.Markdown("""
|
| <h1 style='text-align: center;'>π¦ Twitter Network Analysis</h1>
|
| <p style='text-align: center;'>Aplikasi <i>Social Network Analysis</i> untuk memetakan penyebaran informasi, melihat hubungan antar akun, dan mendeteksi <i>Key Opinion Leaders</i> (KOL) dalam sebuah percakapan.</p>
|
| """)
|
|
|
| with gr.Row():
|
| total_nodes = G.number_of_nodes()
|
| total_edges = G.number_of_edges()
|
|
|
| gr.Textbox(value=f"{total_nodes} Akun", label="π₯ Total Partisipan", interactive=False)
|
| gr.Textbox(value=f"{total_edges} Interaksi", label="π Total Retweet/Mention", interactive=False)
|
|
|
| gr.Markdown("---")
|
|
|
| with gr.Row():
|
| with gr.Column(scale=1):
|
| gr.Markdown("### π Investigasi Akun")
|
| gr.Markdown("Pilih satu akun untuk melihat peta sebaran pengaruhnya (Koneksi tingkat pertama).")
|
|
|
| user_dropdown = gr.Dropdown(choices=all_users, value=all_users[0], label="Pilih Akun Twitter:")
|
|
|
|
|
| out_text = gr.Markdown()
|
|
|
| with gr.Column(scale=2):
|
|
|
| out_plot = gr.Plot(label="Visualisasi Graf Network")
|
|
|
|
|
| user_dropdown.change(
|
| fn=analyze_network,
|
| inputs=user_dropdown,
|
| outputs=[out_plot, out_text]
|
| )
|
|
|
|
|
| demo.load(
|
| fn=analyze_network,
|
| inputs=user_dropdown,
|
| outputs=[out_plot, out_text]
|
| )
|
|
|
| if __name__ == "__main__":
|
| demo.launch() |