<jupyter_start><jupyter_text>fontanenetzwerke In diesem Notebook findet sich der zugehörige Python-Code für meinen demnächstveröffentlichten Blogpost, in dem ich Figurennetzwerke für <NAME> Roman '<NAME>' bespreche.<jupyter_code>import pandas as pd
import networkx as nx
from pyvis.network import Network
import operator
import matplotlib.pyplot as plt<jupyter_output><empty_output><jupyter_text>Wer spricht mit wem?<jupyter_code>def get_edges_from_df(df, columnname1, columnname2):
      edges = []
      for number in range(len(df)-1):
        edges.append((df[str(columnname1)].iloc[number], df[str(columnname2)].iloc[number]))
      return edges

def get_weighted_edges_from_edges(edges):
      weighted_edges = []
      already_counted = []
      for entry in edges:
          if entry not in already_counted:
              weighted_edges.append((entry[0], entry[1], edges.count(entry)))
              already_counted.append(entry)
      return weighted_edges
# Einlesen der Daten zur Property 'Sprecher:innen'
df_sprecher = pd.read_csv("sprechakt_sprecher.csv", sep=";")
df_sprecher[:5]
#Verhältnis der direkten Sprechakte zum Gesamttext berechnen (nach Wörtern)
sprechakte = ""
for i in range(0, len(df_sprecher)):
    sprechakte = sprechakte + str(df_sprecher["text"].iloc[i])
    
cleaned_sprechakte = [token.strip('.,:;«»[]-?!/()1234567890') for token in sprechakte.split()]
datei = open('stechlin.txt','r') # Die hier und auch für die Annotation verwendete txt-Datei ist zu finden auf TextGrid Repository
full_stechlin = datei.read()
cleaned_full_stechlin = [token.strip('.,:;«»[]-?!/()1234567890') for token in sprechakte.split()]

print("Der Anteil von Sprechakten an Fontanes Der Stechlin beträgt ca. " + str(len(sprechakte)/len(full_stechlin)))
# Einlesen der Daten zur Property 'Gegenüber"
df_gegenueber = pd.read_csv("sprechakt_gegenueber.csv", sep=";")
df_gegenueber[:5]
# Zusammenführung der beiden Datensätze
df_sprechakt = pd.merge(df_sprecher, df_gegenueber, on='id')
df_sprechakt[:5]
#Auslesen der Kanten # Das separate Erfassen von Knoten und Katen ermöglicht später die Färbung in vers. Farben
edges_sprechakt= get_edges_from_df(df_sprechakt, "Sprecher", "Gegenueber")
#edges_sprechakt[:5]
#Auslesen der Knoten
names = {entry for entry in df_sprechakt.Sprecher}.union({entry for entry in df_sprechakt.Gegenueber})
#print("Menge der Knoten: " + str(len(names)))
# Gerichtetes Netzwerk
G_sprechakt = nx.DiGraph()

for name in names:
    G_sprechakt.add_node(name, size=5)

for entry in edges_sprechakt:
    G_sprechakt.add_edge(entry[0], entry[1], color="grey")

ngd_sprechakt = Network("600px", "800px", directed=True)
ngd_sprechakt.from_nx(G_sprechakt)
ngd_sprechakt.show_buttons(filter_=['physics'])
ngd_sprechakt.show("ngd_sprechakt.html")

# Stufenweise Gewichtung des Netzwerks
edges_sprechakt_wei = get_weighted_edges_from_edges(edges_sprechakt)
edges_sprechakt_wei[:5]

# Netzwerk mit Kantendicke nach Gewichtung
G_sprechakt_gewichtet = nx.DiGraph()

for name in names:
    G_sprechakt_gewichtet.add_node(name, size=5)

for entry in edges_sprechakt_wei:
    if entry[2] == 1:
        G_sprechakt_gewichtet.add_edge(entry[0], entry[1], weight=entry[2], width=0.5, color="grey")
    elif entry[2] < 5:
        G_sprechakt_gewichtet.add_edge(entry[0], entry[1], weight=entry[2], width=1, color="grey")
    elif entry[2] < 10:
        G_sprechakt_gewichtet.add_edge(entry[0], entry[1], weight=entry[2], width=2, color="grey")
    else:
        G_sprechakt_gewichtet.add_edge(entry[0], entry[1], weight=entry[2], width=5, color="grey")
    
  
ngd_sprechakt_gewichtet = Network("600px", "800px", directed=True)
ngd_sprechakt_gewichtet.from_nx(G_sprechakt_gewichtet)
ngd_sprechakt_gewichtet.show_buttons(filter_=['physics'])
ngd_sprechakt_gewichtet.show("ngdg_sprechakt.html")<jupyter_output><empty_output><jupyter_text>Einfärben der Knoten des Netzwerks nach verschiedenen Parametern<jupyter_code># Einlesen der Figurenuebersicht, in der Wohnort, Geschlecht etc. über die Figuren erfasst wurde
df_figurenuebersicht = pd.read_csv("Figurenuebersicht.csv", sep=";")
df_figurenuebersicht[:5]
# Netzwerk gefärbt nach Wohnort
G_sprechakt_whnrt = nx.DiGraph()

for i in range(0, len(df_figurenuebersicht)):
    if df_figurenuebersicht["Wohnort"].iloc[i] == "Berlin":
        G_sprechakt_whnrt.add_node(df_figurenuebersicht["Figur"].iloc[i], size=5, color="blue")
    elif df_figurenuebersicht["Wohnort"].iloc[i] == "Stechlin":
        G_sprechakt_whnrt.add_node(df_figurenuebersicht["Figur"].iloc[i], size=5, color="red")
    elif df_figurenuebersicht["Wohnort"].iloc[i] == "Wutz":
        G_sprechakt_whnrt.add_node(df_figurenuebersicht["Figur"].iloc[i], size=5, color="yellow")
    elif df_figurenuebersicht["Wohnort"].iloc[i] == "Mark":
        G_sprechakt_whnrt.add_node(df_figurenuebersicht["Figur"].iloc[i], size=5, color="orange")
    else: 
        G_sprechakt_whnrt.add_node(df_figurenuebersicht["Figur"].iloc[i], size=5, color="grey")

for entry in edges_sprechakt:
    G_sprechakt_whnrt.add_edge(entry[0], entry[1], width=0.4, color="grey")
    
ngd_sprechakt = Network("600px", "800px")
ngd_sprechakt.from_nx(G_sprechakt_whnrt)
ngd_sprechakt.show_buttons(filter_=['physics'])
ngd_sprechakt.write_html("ngd_sprechakt_col_wohnort.html")
# Netzwerk gefärbt nach Adel/Nicht-Adel
G_sprechakt_adl = nx.DiGraph()
for i in range(0, len(df_figurenuebersicht)):
    if df_figurenuebersicht["Schicht"].iloc[i] == "Adel":
        G_sprechakt_adl.add_node(df_figurenuebersicht["Figur"].iloc[i], size=5, color="orange")
    else:
        G_sprechakt_adl.add_node(df_figurenuebersicht["Figur"].iloc[i], size=5, color="blue")
for entry in edges_sprechakt:
    G_sprechakt_adl.add_edge(entry[0], entry[1], width=0.4, color="grey")
    
ngd_sprechakt = Network("600px", "800px")
ngd_sprechakt.from_nx(G_sprechakt_adl)
ngd_sprechakt.show_buttons(filter_=['physics'])
ngd_sprechakt.show("ngd_sprechakt_col_adel.html")
# Netzwerk gefärbt nach Gender
G_sprechakt_gender = nx.DiGraph()

for i in range(0, len(df_figurenuebersicht)):
    if df_figurenuebersicht["Geschlecht"].iloc[i] == "w":
        G_sprechakt_gender.add_node(df_figurenuebersicht["Figur"].iloc[i], size=5, color="red")
    else:
        G_sprechakt_gender.add_node(df_figurenuebersicht["Figur"].iloc[i], size=5, color="yellow")

for entry in edges_sprechakt:
    G_sprechakt_gender.add_edge(entry[0], entry[1], width=0.4, color="grey")

  
ngd_sprechakt = Network("600px", "800px")

ngd_sprechakt.from_nx(G_sprechakt_gender)
ngd_sprechakt.show_buttons(filter_=['physics'])
ngd_sprechakt.show("ngd_sprechakt_col_gender.html")<jupyter_output><empty_output><jupyter_text>Berechnung der Zentralitätsmaße<jupyter_code>degree_centrality = nx.degree_centrality(G_sprechakt)
degree_centrality = dict(sorted(degree_centrality.items(), key=operator.itemgetter(1),reverse=True))

values = [wert for wert in degree_centrality.values()]
values = pd.Series.from_array(values)

x_labels = degree_centrality.keys()

# Plot the figure.
plt.figure(figsize=(15, 8))
ax = values.plot(kind='bar', fontsize="7")
ax.set_title("Degree Centralities für Netzwerktyp 1")
ax.set_xlabel('Figuren')
ax.set_ylabel('Degree Centrality')
ax.set_xticklabels(x_labels)
rects = ax.patches
plt.savefig("dc_sprechakt.png")
betweenness_centrality = nx.betweenness_centrality(G_sprechakt)
betweenness_centrality = dict(sorted(betweenness_centrality.items(), key=operator.itemgetter(1),reverse=True))

values = [wert for wert in betweenness_centrality.values()]
values = pd.Series.from_array(values)

x_labels = betweenness_centrality.keys()

# Plot the figure.
plt.figure(figsize=(15, 8))
ax = values.plot(kind='bar', fontsize="7")
ax.set_title("Betweenness Centralities für Netzwerktyp 1")
ax.set_xlabel('Figuren')
ax.set_ylabel('Betweenness Centrality')
ax.set_xticklabels(x_labels)
rects = ax.patches
plt.savefig("bc_sprechakt.png")
closeness_centrality = nx.closeness_centrality(G_sprechakt)
closeness_centrality = dict(sorted(closeness_centrality.items(), key=operator.itemgetter(1),reverse=True))

values = [wert for wert in closeness_centrality.values()]
values = pd.Series.from_array(values)

x_labels = closeness_centrality.keys()

# Plot the figure.
plt.figure(figsize=(15, 8))
ax = values.plot(kind='bar', fontsize="7")
ax.set_title("Closeness Centralities für Netzwerktyp 1")
ax.set_xlabel('Figuren')
ax.set_ylabel('Closeness Centrality')
ax.set_xticklabels(x_labels)
rects = ax.patches
plt.savefig("cc_sprechakt.png")<jupyter_output>/Users/agneshilger/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:5: FutureWarning: 'from_array' is deprecated and will be removed in a future version. Please use the pd.Series(..) constructor instead.
  """<jupyter_text>Referenzen auf Figuren<jupyter_code>df_rnd= pd.read_csv("Referenz_referierende_Figuren.csv", sep=";")
df_rnd[:5]
df_rt= pd.read_csv("Referenz_referierte_Figuren.csv", sep=";")
df_rt[:5]
df_rt_rnd = pd.merge(df_rnd, df_rt, on='id')
df_rt_rnd[:5]
#Auslesen der Kanten
edges_rfz= get_edges_from_df(df_rt_rnd, "referierende_Figur", "referierte_Figur")
#edges_rfz[:5]
#Auslesen der Knoten
names = {entry for entry in df_rt_rnd.referierende_Figur}.union({entry for entry in df_rt_rnd.referierte_Figur})
# Netzwerk der Referenzen
G_rfz = nx.DiGraph()

for name in names:
    G_rfz.add_node(name, size=5, color="purple")

for entry in edges_rfz:
    G_rfz.add_edge(entry[0], entry[1], color="grey")

  
ngd_rfz = Network("600px", "800px", directed=True)
ngd_rfz.from_nx(G_rfz)
ngd_rfz.show_buttons(filter_=['physics'])
ngd_rfz.show("ngd_rfz.html")

# Netzwerk der Referenzen nur mit handelnden Figuren

handelnde_figuren = [figur for figur in df_figurenuebersicht["Figur"]]
edges_rfz_cleared = [edge for edge in edges_rfz if edge[0] in handelnde_figuren and edge[1] in handelnde_figuren]


G_rfz_cleared = nx.DiGraph()

for name in handelnde_figuren:
    G_rfz_cleared.add_node(name, size=5, color="purple")#die separate Erfassung der Knoten ermöglicht später die Färbung in vers. Farben

for entry in edges_rfz_cleared:
    G_rfz_cleared.add_edge(entry[0], entry[1], color="grey")

  
ngd_rfz_cleared = Network("600px", "800px", directed=True)
ngd_rfz_cleared.from_nx(G_rfz_cleared)
ngd_rfz_cleared.show("ngd_rfz_cleared.html")<jupyter_output><empty_output><jupyter_text>Berechnung der Zentralitätsmaße für das Referenzen-Netzwerk<jupyter_code>degree_centrality = nx.degree_centrality(G_rfz_cleared)
degree_centrality = dict(sorted(degree_centrality.items(), key=operator.itemgetter(1),reverse=True))
values = [wert for wert in degree_centrality.values()]
values = pd.Series.from_array(values)
x_labels = degree_centrality.keys()

# Plot the figure.
plt.figure(figsize=(15, 8))
ax = values.plot(kind='bar', color="darkgreen", fontsize="7")
ax.set_xlabel('Figuren')
ax.set_ylabel('Degree Centrality')
ax.set_title("Degree Centralities für Netzwerktyp 2")
ax.set_xticklabels(x_labels)
rects = ax.patches
plt.savefig("dc_rfz.png")

betweenness_centrality = nx.betweenness_centrality(G_rfz_cleared)
betweenness_centrality = dict(sorted(betweenness_centrality.items(), key=operator.itemgetter(1),reverse=True))

values = [wert for wert in betweenness_centrality.values()]
values = pd.Series.from_array(values)

x_labels = betweenness_centrality.keys()

# Plot the figure.
plt.figure(figsize=(15, 8))
ax = values.plot(kind='bar', color="darkgreen", fontsize="7")
ax.set_title("Betweenness Centrality für Netzwerktyp 2")
ax.set_xlabel('Figuren')
ax.set_ylabel('Betweenness Centrality')
ax.set_xticklabels(x_labels)
rects = ax.patches
plt.savefig("bc_rfz.png")
closeness_centrality = nx.closeness_centrality(G_rfz_cleared)
closeness_centrality = dict(sorted(closeness_centrality.items(), key=operator.itemgetter(1),reverse=True))

values = [wert for wert in closeness_centrality.values()]
values = pd.Series.from_array(values)

x_labels = closeness_centrality.keys()

# Plot the figure.
plt.figure(figsize=(15, 8))
ax = values.plot(kind='bar', color="darkgreen", fontsize="7")
ax.set_title("Closeness Centralities für Netzwerktyp 2")
ax.set_xlabel('Figuren')
ax.set_ylabel('Closeness Centrality')
ax.set_xticklabels(x_labels)
rects = ax.patches
plt.savefig("cc_rfz.png")<jupyter_output>/Users/agneshilger/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:5: FutureWarning: 'from_array' is deprecated and will be removed in a future version. Please use the pd.Series(..) constructor instead.
  """
{'fraction_non_alphanumeric': 0.13041727082326407, 'fraction_numerical': 0.014821975189302401, 'mean_word_length': 7.009677419354839, 'pattern_counts': {'":': 6, '<': 27, '<?xml version=': 0, '>': 25, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '647237', 'license': 'MIT', 'n_tokens_mistral': 5010, 'n_tokens_neox': 4982, 'n_words': 815, 'path': 'fontanenetzwerke.ipynb', 'repo_name': 'agneshilger/fontanenetzwerke', 'size': '12430'}