Kurs Python richtig lernen/Aufgabe 1: Shakespeare

Aus Geoinformation HSR
Wechseln zu: Navigation, Suche

Zurück zu Kurs_Python_richtig_lernen

anteil_hamlet.py

Siehe Kap. 2.6.3:

  • Einlesen von Hamlet und gesammelte Werke von Shakespeare (enthalten in Musterloesungen.zip)
  • Ausrechnen des Hamlet-Anteils an den gesammelten Werken, basierend auf der Anzahl Buchstaben
  • Ausrechnen des Hamlet-Anteils an den gesammelten Werken, basierend auf der Anzahl Wörter
  • Herausfinden wieviele Male Shakespeare das Wort 'ghost', 'Ghost', 'GHOST' oder ähnlich in seinem Leben benutzt hat
  • Das häufigste Wort in Shakespeare's gesammelten Werken herausfinden
  • Das häufigste Wort mit mindestens 5 Buchstaben in Shakespeare's gesammelten Werken herausfinden

Rechnet den Hamlet-Anteil an den gesammelten Werken Shakespeare's aus, basierend auf der Anzahl Buchstaben und Wörter

# -*- coding: utf-8 -*-

# Einlesen von Hamlet und den gesammelten Werken Shakepeare's:
hamlet_file = open('pg1524.txt')
hamlet = hamlet_file.read()
shakespeare_file = open('pg100.txt')
shakespeare = shakespeare_file.read()

# Der Anteil von Hamlet an den gesammelten Werken basierend auf der Anzahl
# Buchstaben ist ganz einfach zu erhalten. Aufpassen nur mit dem Float...:
anteil_hamlet_buchstaben = float(len(hamlet)) / len(shakespeare) * 100.

# Nun müssen wir die Anzahl Wörter bestimmen. Dafür trennen wir ganz einfach
# den Text in eine Liste auf basierend auf den Leerschlägen:
hamlet_woerter = hamlet.split(' ')
shakespeare_woerter = shakespeare.split(' ')
anteil_hamlet_woerter = float(len(hamlet_woerter)) / len(shakespeare_woerter) * 100.

# Nun können wir das Resultat ausgeben:
print "Anteil von Hamlet an Shakespeare's Werken, basierend auf der Anzahl Buchstaben: %f Prozent" % anteil_hamlet_buchstaben
print "Anteil von Hamlet an Shakespeare's Werken, basierend auf der Anzahl Woerter: %f Prozent" % anteil_hamlet_woerter
 

Hinweis: im Kap. 2.6.3 unten gibt es ein Code-Fragment für eine Variante mit direktem Web-Zugriff.

geister.py

Zählt wie viele Male Shakespeare das Wort 'ghost', 'Ghost', 'GHOST' oder ähnlich verwendet hat in seinem Leben.

# -*- coding: utf-8 -*-

import time

# Einlesen von Shakepeare's gesammelten Werken:
f = open('pg100.txt')
shakespeare = f.read()

# Zuerst mal alles in Kleinbuchstaben umwandeln, damit wir alle Varianten von
# 'ghost' abfangen:
shakespeare = shakespeare.lower()

# Nun haben wir zwei Möglichkeiten:
# 1. Den Text in eine Liste Wörter auftrennen, und die Wörter zählen wo 'ghost'
#    vorkommt.
# 2. Die Funktion find() gibt uns ja den Index zurück wo das Wort gefunden 
#    wurde. find() hat auch ein optionales Argument 'start', wo man sagen kann
#    von welcher Stelle im String an gesucht werden soll. Durch intelligentes
#    Definieren einer Variablen können wir so die Geister auch zählen.
# Hier folgen beide Möglichkeiten... Damit wir wissen, welche Methode schneller
# ist haben wir noch die Zeit für beide Möglichkeiten gemessen. Das geht ganz
# einfach mit dem time-Modul. Die Funktion time im time-Modul gibt die Anzahl
# Sekunden (mit ein paar Dezimalstellen) die seit dem Anfang der Computer-Epoche
# vergangen sind (normalerweise der 1.1.1970 auf Linux-Systemen)

# Möglichkeit 1 mit Wörter auftrennen
start_zeit_1 = time.time()
woerter = shakespeare.split(' ')
anzahl_geister = 0
for wort in woerter:
    if wort.find('ghost') > -1:
        anzahl_geister += 1

end_zeit_1 = time.time()

# Möglichkeit 2 mit String durchlaufen
start_zeit_2 = time.time()
anzahl_geister_2 = 0
string_index = 0    # Das ist diese 'intelligente' Variable
while True:
    geist = shakespeare.find('ghost', string_index)
    if geist < 0:   # Falls keinen Geist mehr, brechen wir aus der Schlaufe aus
        break
    anzahl_geister_2 += 1
    string_index = geist + 1    # String Index vorwärts schieben

end_zeit_2 = time.time()


# Nun sind wir fertig, also Resultat ausgeben
print "Shakepeare brauchte %i Geister in seinem Leben" % anzahl_geister
print "Shakepeare brauchte wirklich %i Geister" % anzahl_geister_2

print "Die 1. Moeglichkeit Geister zu zaehlen (Woerter auftrennen) brauchte %f Sekunden" % (end_zeit_1 - start_zeit_1, )
print "Die 2. Moeglichkeit Geister zu zaehlen (String durchlaufen) brauchte %f Sekunden" % (end_zeit_2 - start_zeit_2, )
print "Moeglichkeit 2 ist um ein Faktor %f schneller!" % ((end_zeit_1 - start_zeit_1) / (end_zeit_2 - start_zeit_2), )

print '''"Die ich rief, die Geister,\nWerd' ich nun nicht los."\n(Nein, das ist nicht von Shakespeare!)'''
 

haeufigste_woerter.py

Findet das häufigste Wort in Shakespeare's gesammelten Werken. Findet auch das häufigste Wort das länger ist als 5 Buchstaben.

# -*- coding: utf-8 -*-

# Einlesen von Shakepeare's gesammelten Werken:
f = open('pg100.txt')
shakespeare = f.read()

# Alles in Kleinbuchstaben umwandeln, da dies ja dasselbe Wort bleibt...
shakespeare = shakespeare.lower()

# In Wörter auftrennen
woerter = shakespeare.split(' ')

# Einzelne Wörter zählen mit Hilfe eines Dictionnaires
word_count = {}
for wort in woerter:
    w = wort.strip()    # Leerzeichen um das Wort entfernen
    if len(w) > 0:
        word_count[w] = word_count.get(w, 0) + 1

# Nun haben wir alle Wörter gezählt und wir können nochmals durch den
# Dictionnaire gehen und schauen was das häufigste Wort ist.
haeufigstes_wort = ''
anzahl_vorkommen = 0
for wort in word_count:
    if word_count[wort] > anzahl_vorkommen:
        haeufigstes_wort = wort
        anzahl_vorkommen = word_count[wort]

print "Das haeufigste Wort ist '%s' mit %i Vorkommen." % (haeufigstes_wort, anzahl_vorkommen)

# Und nun noch alle Wörter mit mindestens 5 Buchstaben: sehr ähnlich!
haeufigstes_wort = ''
anzahl_vorkommen = 0
for wort in word_count:
    if len(wort) >= 5 and word_count[wort] > anzahl_vorkommen:
        haeufigstes_wort = wort
        anzahl_vorkommen = word_count[wort]

print "Das haeufigste Wort mit mindestens 5 Buchstaben ist '%s' mit %i Vorkommen." % (haeufigstes_wort, anzahl_vorkommen)