Automatisierte Texte#

Wir automatisieren Texte und lernen dabei:

  • mit strings und ihren Methoden umzugehen

  • Vergleichsoperatoren und deren Verknüpfung

  • neue Kontrollstrukturen, wie die if-else Bedingungen, kennen

Automatisierte Wahlberichterstattung#

  • Ergebnisse der Landtagswahlen für jeden Wahlkreis und jede Gemeinde in NRW

  • über 500 Artikel in unterschiedlichen Zuständen (Vorbericht, vorläufiges Ergebnis, amtliches Endergebnis)

  • redaktionell ist dies am Wahlabend nicht umsetzbar

Automatisierte Wahlberichterstattung - WDR

Los geht’s…#

titel = 'Wahlen in Leipzig'
print(titel)
Wahlen in Leipzig
# mit veränderbarem Stadtnamen
stadt = 'Görlitz'
titel = f'Wahlen in {stadt}'
print(titel)
Wahlen in Görlitz
stadt = 'Görlitz'
titel = f'Wahlen in {stadt}'
teaser = f'In {stadt} wurde heute gewählt. ...'
print(titel, teaser, sep='\n\n')
Wahlen in Görlitz

In Görlitz wurde heute gewählt. ...

Wie können wir den Titel in Großbuchstaben ausgeben?

stadt = 'Görlitz'
titel = f'WAHLEN IN {stadt}'
teaser = f'In {stadt} wurde heute gewählt. ...'
print(titel, teaser, sep='\n\n')
WAHLEN IN Görlitz

In Görlitz wurde heute gewählt. ...
stadt = 'Görlitz'
titel = f'Wahlen in {stadt}'
teaser = f'In {stadt} wurde heute gewählt. ...'
print(titel.upper(), teaser, sep='\n\n')
WAHLEN IN GÖRLITZ

In Görlitz wurde heute gewählt. ...

Titel und Teaser…#

…diesmal mit .format() anstatt f-strings

# Titel und Teaser
stadt = 'Görlitz'

titel = 'Wahlen in {}'.format(stadt)
teaser = 'In {} wurde heute gewählt.'.format(stadt)

print(titel, teaser, sep='\n\n')
Wahlen in Görlitz

In Görlitz wurde heute gewählt.
# Text
kandidatin = 'Marianne Klingenstein'
prozent = 37.4

text = '{} gewinnt mit {} Prozent der Stimmen.'.format(kandidatin, prozent)

print(text)
Marianne Klingenstein gewinnt mit 37.4 Prozent der Stimmen.
artikel = teaser + text

print(titel.upper(), artikel, sep='\n\n')
WAHLEN IN GÖRLITZ

In Görlitz wurde heute gewählt.Marianne Klingenstein gewinnt mit 37.4 Prozent der Stimmen.
artikel = teaser + ' ' + text

print(titel.upper(), artikel, sep='\n\n')
WAHLEN IN GÖRLITZ

In Görlitz wurde heute gewählt. Marianne Klingenstein gewinnt mit 37.4 Prozent der Stimmen.

Was wenn mehrere Kandidat:innen antreten?#

kandidatin1 = 'Helmut Wiese'
prozent1 = 23.8

kandidatin2 = 'Gundula Lobrecht'
prozent2 = 17.4

text = '{} gewinnt mit {} Prozent der Stimmen.'

if prozent1 > prozent2:
    text = text.format(kandidatin1, prozent1)
else:
    text = text.format(kandidatin2, prozent2)
    
print(text)
Helmut Wiese gewinnt mit 23.8 Prozent der Stimmen.

Was passiert bei Gleichstand?#

kandidat1 = 'Helmut Wiese'
prozent1 = 29.5

kandidat2 = 'Gundula Lobrecht'
prozent2 = 29.5

text = '{} gewinnt mit {} Prozent der Stimmen.'

if prozent1 > prozent2:
    text = text.format(kandidat1, prozent1)
else:
    text = text.format(kandidat2, prozent2)
    
print(text)
Gundula Lobrecht gewinnt mit 29.5 Prozent der Stimmen.
kandidat1 = 'Helmut Wiese'
prozent1 = 29.5

kandidat2 = 'Gundula Lobrecht'
prozent2 = 29.5

text = '{} gewinnt mit {} Prozent der Stimmen.'

if prozent1 > prozent2:
    text = text.format(kandidat1, prozent1)
elif prozent1 < prozent2:
    text = text.format(kandidat2, prozent2)
else:
    text = 'Die Wahl ist unentschieden. {} und {} erhalten beide {} Prozent der Stimmen.'
    text = text.format(kandidat1, kandidat2, prozent1)
    
print(text)
Die Wahl ist unentschieden. Helmut Wiese und Gundula Lobrecht erhalten beide 29.5 Prozent der Stimmen.
stadt = 'Görlitz'
titel = 'Wahlen in {}'.format(stadt)

kandidat1 = 'Helmut Wiese'
prozent1 = 9.25

kandidat2 = 'Gundula Lobrecht'
prozent2 = 41.5

text = '{} gewinnt mit {} Prozent der Stimmen.'

if prozent1 > prozent2:
    text = text.format(kandidat1, prozent1)
elif prozent1 < prozent2:
    text = text.format(kandidat2, prozent2)
else:
    text = 'Die Wahl ist unentschieden. {} und {} erhalten beide {} Prozent der Stimmen.'
    text = text.format(kandidat1, kandidat2, prozent1)
    

print(titel.upper(), text, sep='\n\n')
WAHLEN IN GÖRLITZ

Gundula Lobrecht gewinnt mit 41.5 Prozent der Stimmen.

Ein bisschen mehr Kontext…#

Wie groß ist der Vorsprung der führenden Kandidatin oder des führenden Kandidaten?

stadt = 'Görlitz'
titel = 'Wahlen in {}'.format(stadt)

kandidat1 = 'Helmut Wiese'
prozent1 = 59.5

kandidat2 = 'Gundula Lobrecht'
prozent2 = 49.5

text_gewinner = '{} gewinnt mit {} Prozent der Stimmen.'
text_vorsprung = 'Dies entspricht einem Vorsprung von {} Prozentpunkten zu {}.'

if prozent1 > prozent2:
    vorsprung = prozent1 - prozent2
    text_vorsprung = text_vorsprung.format(vorsprung, kandidat2)
    text_gewinner = text_gewinner.format(kandidat1, prozent1)   
elif prozent1 < prozent2:
    vorsprung = prozent2 - prozent1
    text_vorsprung = text_vorsprung.format(vorsprung, kandidat1)
    text_gewinner = text.format(kandidat2, prozent2)   
else:
    text_vorsprung = 'Die Wahl ist unentschieden. {} und {} erhalten beide {} Prozent der Stimmen.'
    text_gewinner = text.format(kandidat1, kandidat2, prozent1)
    
print(titel.upper(), text_gewinner + ' ' + text_vorsprung, sep='\n\n')
WAHLEN IN GÖRLITZ

Helmut Wiese gewinnt mit 59.5 Prozent der Stimmen. Dies entspricht einem Vorsprung von 10.0 Prozentpunkten zu Gundula Lobrecht.

Neu strukturiert…#

stadt = 'Görlitz'
titel = 'Wahlen in {}'.format(stadt)

kandidat1 = 'Helmut Wiese'
prozent1 = 29.8
kandidat2 = 'Gundula Lobrecht'
prozent2 = 32.7

if prozent1 == prozent2:
    text = 'Die Wahl ist unentschieden. {} und {} erhalten beide {} Prozent der Stimmen.'
    text = text.format(kandidat1, kandidat2, prozent1)
else:
    text_gewinner = '{} gewinnt mit {} Prozent der Stimmen.'
    text_vorsprung = ' Dies entspricht einem Vorsprung von {} Prozentpunkten.' 
    gewinner = kandidat1
    gewinner_prozent = prozent1
    vorsprung = round(prozent1 - prozent2, 1)
    
    if prozent2 > prozent1:
        gewinner = kandidat2
        gewinner_prozent = prozent2
        vorsprung = round(prozent2 - prozent1, 1)

    text_gewinner = text_gewinner.format(gewinner, gewinner_prozent)
    text_vorsprung = text_vorsprung.format(vorsprung)
    text = text_gewinner + text_vorsprung
        
print(titel.upper(), text, sep='\n\n')
WAHLEN IN GÖRLITZ

Gundula Lobrecht gewinnt mit 32.7 Prozent der Stimmen. Dies entspricht einem Vorsprung von 2.9 Prozentpunkten.

Ein bisschen mehr Kontext#

Wie kann der Vorsprung von dem:der Erstplatzierten zu dem:der Zweitplatzierten bewertet werden?

Ist er minimal, knapp oder erheblich?

# Und noch ein bisschen Kontext
stadt = 'Görlitz'
titel = 'Wahlen in {}'.format(stadt)

kandidat1 = 'Helmut Wiese'
prozent1 = 29.5

kandidat2 = 'Gundula Lobrecht'
prozent2 = 28.7


if prozent1 == prozent2:
    text = 'Die Wahl ist unentschieden. {} und {} erhalten beide {} Prozent der Stimmen.'
    text = text.format(kandidat1, kandidat2, prozent1)
else:
    text = '{} gewinnt mit {} Prozent der Stimmen.'
    vorsprung = ' Dies ist ein {} Vorsprung von {} Prozentpunkten.'
    gewinner = kandidat1
    prozent = prozent1
    differenz = prozent1 - prozent2
    
    if prozent2 > prozent1:
        gewinner = kandidat2
        prozent = prozent2
        differenz = prozent2 - prozent1
        
    text = text.format(gewinner, prozent)
    
    # bestimme das Ausmaß des Abstands zwischen Gewinner:in und Zweitplatzierter:m
    differenz = round(differenz, 1)
    
    if differenz >= 0 and differenz <= 1:
        ausmass = 'minimaler'
    elif differenz > 1 and differenz < 3:
        ausmass = 'knapper'
    elif differenz >= 3 and differenz < 5:
        ausmass = ''
    elif differenz >= 5:
        ausmass = 'erheblicher'
    vorsprung = vorsprung.format(ausmass, differenz)
    
article = text + vorsprung   
print(titel, article, sep='\n\n')
Wahlen in Görlitz

Helmut Wiese gewinnt mit 29.5 Prozent der Stimmen. Dies ist ein minimaler Vorsprung von 0.8 Prozentpunkten.

Ein bisschen mehr Kontext..#

Ein Satz zum:zur neuen Amtsinhaber:in der Stadt

# Und noch ein bisschen Kontext
stadt = 'Görlitz'
titel = 'Wahlen in {}'.format(stadt)

kandidat1 = 'Helmut Wiese'
prozent1 = 29.5

kandidat2 = 'Gundula Lobrecht'
prozent2 = 28.7


if prozent1 == prozent2:
    text = 'Die Wahl ist unentschieden. {} und {} erhalten beide {} Prozent der Stimmen.'
    text = text.format(kandidat1, kandidat2, prozent1)
else:
    text = '{} gewinnt mit {} Prozent der Stimmen.'
    vorsprung = ' Dies ist ein {} Vorsprung von {} Prozentpunkten.'
    gewinner = kandidat1
    prozent = prozent1
    differenz = prozent1 - prozent2
    
    if prozent2 > prozent1:
        gewinner = kandidat2
        prozent = prozent2
        differenz = prozent2 - prozent1
        
    text = text.format(gewinner, prozent)
    
    # bestimme das Ausmaß des Abstands zwischen Gewinner:in und Zweitplatzierter:m
    differenz = round(differenz, 1)
    
    if differenz >= 0 and differenz <= 1:
        ausmass = 'minimaler'
    elif differenz > 1 and differenz < 3:
        ausmass = 'knapper'
    elif differenz >= 3 and differenz < 5:
        ausmass = ''
    elif differenz >= 5:
        ausmass = 'erheblicher'
    vorsprung = vorsprung.format(ausmass, differenz)
    
    amtsinhaber = ' {} wird neuer Bürgermeister von {}.'
    amtsinhaber = amtsinhaber.format(gewinner, stadt)
    
article = text + vorsprung + amtsinhaber    
print(titel, article, sep='\n\n')
Wahlen in Görlitz

Helmut Wiese gewinnt mit 29.5 Prozent der Stimmen. Dies ist ein minimaler Vorsprung von 0.8 Prozentpunkten. Helmut Wiese wird neuer Bürgermeister von Görlitz.
# Und noch korrekt gegendert
stadt = 'Görlitz'
titel = 'Wahlen in {}'.format(stadt)

kandidat1 = 'Helmut Wiese'
prozent1 = 29.5

kandidat2 = 'Gundula Lobrecht'
prozent2 = 38.7


if prozent1 == prozent2:
    text = 'Die Wahl ist unentschieden. {} und {} erhalten beide {} Prozent der Stimmen.'
    text = text.format(kandidat1, kandidat2, prozent1)
else:
    text = '{} gewinnt mit {} Prozent der Stimmen.'
    vorsprung = ' Dies ist ein {} Vorsprung von {} Prozentpunkten.'
    gewinner = kandidat1
    prozent = prozent1
    differenz = prozent1 - prozent2
    
    if prozent2 > prozent1:
        gewinner = kandidat2
        prozent = prozent2
        differenz = prozent2 - prozent1
        
    text = text.format(gewinner, prozent)
    
    # bestimme das Ausmaß des Abstands zwischen Gewinner:in und Zweitplatzierter:m
    differenz = round(differenz, 1)
    
    if differenz >= 0 and differenz <= 1:
        ausmass = 'minimaler'
    elif differenz > 1 and differenz < 3:
        ausmass = 'knapper'
    elif differenz >= 3 and differenz < 5:
        ausmass = ''
    elif differenz >= 5:
        ausmass = 'erheblicher'
    vorsprung = vorsprung.format(ausmass, differenz)
    
    amtsinhaber = ' {} wird neuer Bürgermeister von {}.'
    amtsinhaber = amtsinhaber.format(gewinner, stadt)
    if gewinner == kandidat2:
        amtsinhaber = amtsinhaber.replace('neuer Bürgermeister', 'neue Bürgermeisterin')
    
article = text + vorsprung + amtsinhaber    
print(titel, article, sep='\n\n')
Wahlen in Görlitz

Gundula Lobrecht gewinnt mit 38.7 Prozent der Stimmen. Dies ist ein erheblicher Vorsprung von 9.2 Prozentpunkten. Gundula Lobrecht wird neue Bürgermeisterin von Görlitz.

Automatisierte Wahlberichterstattung mit Funktionen#

Funktionen helfen uns den Code übersichtlich zu halten und wiederkehrende Aufgaben effizient zu lösen.

# Erhalte Gewinner basierend auf den Prozent
def get_gewinner(kandidat1, prozent1, kandidat2, prozent2):
    if prozent1 > prozent2:
        return kandidat1, prozent1
    return kandidat2, prozent2

# Berechne die Differenz zweier Zahlen
def berechne_differenz(num1, num2):
    return round(abs(num1 - num2), 1)

# Bewerte den Vorsprung in Prozentpunkten
def get_ausmass(differenz):
    if differenz >= 0 and differenz <= 1:
        ausmass = 'minimaler'
    elif differenz > 1 and differenz < 3:
        ausmass = 'knapper'
    elif differenz >= 3 and differenz < 5:
        ausmass = ''
    elif differenz >= 5:
        ausmass = 'erheblicher'
    return ausmass
    
# Passe den Text dem Geschlecht an    
def gender(text):
    return text.replace('neuer Bürgermeister', 'neue Bürgermeisterin')
# Wahldaten
stadt = 'Görlitz'
titel = 'Wahlen in {}'.format(stadt)

kandidat1 = 'Helmut Wiese'
prozent1 = 32.5

kandidat2 = 'Gundula Lobrecht'
prozent2 = 29.5

# SKript
if prozent1 == prozent2:
    # Gleichstand
    text = 'Die Wahl ist unentschieden. {} und {} erhalten beide {} Prozent der Stimmen.'
    text = text.format(kandidat1, kandidat2, prozent1)
else:
    # Gewinner Text
    text = '{} gewinnt mit {} Prozent der Stimmen.'
    gewinner, prozent = get_gewinner(kandidat1, prozent1, kandidat2, prozent2)        
    text = text.format(gewinner, prozent)
    
    # Vorsprung Text
    vorsprung = ' Dies ist ein {} Vorsprung von {} Prozentpunkten.'
    differenz = berechne_differenz(prozent1, prozent2)
    ausmass = get_ausmass(differenz)
    vorsprung = vorsprung.format(ausmass, differenz)
    
    # Amtsinhaber:in Text
    amtsinhaber = ' {} wird neuer Bürgermeister von {}.'
    amtsinhaber = amtsinhaber.format(gewinner, stadt)
    if gewinner == kandidat2:
        amtsinhaber = gender(amtsinhaber)


    text = text + vorsprung + amtsinhaber 
    
print(titel.upper(), text, sep='\n\n')
WAHLEN IN GÖRLITZ

Helmut Wiese gewinnt mit 32.5 Prozent der Stimmen. Dies ist ein  Vorsprung von 3.0 Prozentpunkten. Helmut Wiese wird neuer Bürgermeister von Görlitz.