Als txt-Datei herunterladen


# 1
# Einzelne Bücher runterladen und in 1,2,3,4 speichern.

#wget "http://gutenberg.spiegel.de/buch/5560/i" -O 1.html

# 2

#lynx -dump -assume_charset=UTF−8 −hiddenlinks=ignore -nolist -verbose 1.html > 1.txt

# 3
# Wir geben den Inhalt von 1.txt aus und leiten ihn direkt mit > in eine Datei bibel.txt um
# Die folgenden Bücher hängen wir mit Hilfe von >> an bibel.txt an

#cat 1.txt > bibel.txt cat 2.txt >> bibel.txt cat 3.txt >> bibel.txt cat 4.txt >> bibel.txt

# 4
import re
def find_longest_word(line):
    word_regex = re.compile(r'\w+')
    longest = ''
    # Wir laufen durch alle Wörter von line durch (Mit Hilfe von re.findall)
    for word in re.findall(word_regex ,line):
        # Wenn das aktuelle Wort der Zeile länger ist als das bisher größte: neues größtes Wort gefunden
         if(len(longest) < len(word)):
             longest = word
    return longest
# Wir rufen die Funktion mit einer Testzeile auf. Auf dem Bildschirm sollte "Testzeile" ausgegeben werden.
testline = "Dies ist eine Testzeile"
print(find_longest_word(testline))

# 5
import re
def count_words(line):
    word_regex = re.compile(r'\w+')
    # re.findall ist ein Objekt, welches einen 'Eintrag' für JEDES gefundene Element des regulären Ausdrucks beinhaltet.
    # In unserem Fall heißt das: Ein Eintrag für jedes Wort der Zeile (wegen \w+).
    # Zählen wir die Anzahl der Einträge mit len(), so zählen wir in diesem Fall die Wörter.
    word_count = len(re.findall(word_regex ,line))
    return word_count
# Wir rufen die Funktion mit einer Testzeile auf. Auf dem Bildschirm sollte 4 ausgegeben werden.
testline = "Dies ist eine Testzeile"
print(count_words(testline))

# 6a
import re
splitregex = re.compile(r'\w+')
bibel = open('bibel.txt', 'r')
frequenzliste = {}
for line in bibel:
    # Unser regulärer Ausruck findet alle Wörter der Zeile und läuft durch diese einzeln durch.
    for word in re.findall(splitregex,line):
        # Entfernt Komma, Punkt, etc. vom Wort
        word = word.strip()
        # Frequenzliste wie üblich erstellen.
        if (word in frequenzliste):
            frequenzliste[word] = frequenzliste[word] + 1
        else:
            frequenzliste[word] = 1
# Filestream schließen
bibel.close()
print('In der Datei kamen', len(frequenzliste),'unterschiedliche Wörter vor.')

# 6b
# Frequenzliste wie oben erstellen
import re
splitregex = re.compile(r'\w+')
bibel = open('bibel.txt', 'r')
frequenzliste = {}
for line in bibel:
    for word in re.findall(splitregex,line):
        word = word.strip()
        if (word in frequenzliste):
            frequenzliste[word] = frequenzliste[word] + 1
        else:
            frequenzliste[word] = 1
bibel.close()
# Wir sortieren die Frequenzliste nach ihrem Wert absteigend - ACHTUNG, das Ergebnis ist kein Dictionary mehr, sondern eine Liste mit Tupeln
frequenzliste = sorted(frequenzliste.items(), key=lambda x: x[1], reverse = True)
# Wir legen eine leere Liste an, in der die Zehn häufigsten groß geschriebenen Wörter gespeichert werden
most_occurences = []
# Wir lassen uns alle Elemente (Wort, Anzahl) der sortierten Liste ausgeben
for element in frequenzliste:
    # Wir wollen nur weitere Wörter suchen/anhängen, wenn in der Liste noch nicht 10 Wörter gespeichert sind
    if len(most_occurences) < 10:
        # Prüfen, ob das aktuelle Wort groß geschrieben ist - ansonsten machen wir nichts mit dem Wort
        if element[0].istitle():
            # Wort der Liste anhängen
            most_occurences.append(element[0])
# Liste ausgeben
print("Dies sind zehn häufigsten großgeschriebenen Wörter: \n", most_occurences)

# 6c
# Frequenzliste wie oben erstellen
import re
splitregex = re.compile(r'\w+')
bibel = open('bibel.txt', 'r')
frequenzliste = {}
for line in bibel:
    for word in re.findall(splitregex,line):
        word = word.strip()
        if (word in frequenzliste):
            frequenzliste[word] = frequenzliste[word] + 1
        else:
            frequenzliste[word] = 1
bibel.close()
# Wir sortieren die Frequenzliste nach ihrem Wert absteigend - ACHTUNG, das Ergebnis ist kein Dictionary mehr, sondern eine Liste mit Tupeln
frequenzliste = sorted(frequenzliste.items(), key=lambda x: x[1], reverse = True)
# Wir legen eine leere Liste an, in der die Zehn am öftesten vorkommenden klein geschriebenen Wörter gespeichert werden
most_occurences = []
for element in frequenzliste:
    if len(most_occurences) < 10:
        # Prüfen, ob das aktuelle Wort klein geschrieben ist - ansonsten machen wir nichts mit dem Wort
        if not element[0].istitle():
            # Wort der Liste anhängen
            most_occurences.append(element[0])
# Liste ausgeben
print("Dies sind zehn häufigsten klein geschriebenen Wörter: \n", most_occurences)


##Aufgabe 11-7##
#!/usr/bin/python3

import re
buchregex = re.compile(r'^\d+\. Buch \w+')  
# matcht Zeilen, die mit einer Zahl, dem Wort "Buch" und noch einem Wort beginnen
kapitelregex = re.compile(r'^Kapitel \d+')  
# matcht Zeilen, die mit dem Wort "Kapitel" und einer Zahl beginnen
versregex = re.compile(r'^   (\d+)')  
# matcht Zeilen, die mit 3 spaces und einer Zahl beginnen 
emptylineregex = re.compile(r'^\s*$')  
# matcht Zeilen, die leer sind oder nur Whitespaces enthalten

filebibel = open('bibel.txt', 'r')  # öffnet die Datei zum lesen
bibel = filebibel.readlines()

vers_zuende = False  
# Boolvariable, wird auf True gesetzt, sobald die letzte Zeile Beginn eines Verses war
for line in bibel:   # iteriert über die Zeilen der Datei
	if re.search(buchregex, line):  
		print(line) # wird eine Buchüberschrift gefunden, wird die Zeile ausgegeben
	elif re.search(kapitelregex, line):  
		print (line) # wird eine Kapitelüberschrift gefunden, wird die Zeile ausgegeben
	elif re.search(versregex, line):  
		match = re.findall(versregex, line)[0]
		# erstellt eine Liste aller Matches und speichert das erste Match in der Variablen "match"
		if (int(match) <= 3):
            # wenn der Zahlenwert der Variablen "match" höchstens 3 ist, wird die Zeile ausgegeben und die Boolvariable auf True gesetzt
			print(line)
			vers_zuende = True
	elif vers_zuende:  
        # wird nur ausgeführt, wenn die Zeile auf keinen der Regex passt und die Boolvariable True ist
		if not re.search(emptylineregex, line):  
            # wenn die Zeile nach dem Versanfang nicht leer ist, wird sie ausgegeben, weil sie zum Vers gehört
			print(line)
		else:  # eine Leerzeile merkiert das Ende des Verses, wird also nicht mit ausgegeben
			vers_zuende = False # die Boolvariable wird auf False gesetzt und damit die Schleife beendet

filebibel.close()  


##Aufgabe11-8##
#!/usr/bin/python3

import re
bibelfile = open('bibel.txt', 'r')
bibel = bibelfile.read()

sohn_regex = re.compile(r'(\w+), der Sohn (\w+)s')  
# matcht das Pattern "Name1, der Sohn Name2s"
# beide Namen werden gruppiert, um separat auf sie zugreifen zu können

vater_von = {}  
#legt ein leeres Dictionary an, in dem der Name des Sohns als Key und der Name des Vaters als Value gespeichert werden soll

for match in re.findall(sohn_regex, bibel):  
# erstellt mit re.findall eine Liste aller Matches und iteriert darüber
    vater_von[match[0]] = match[1]
    # greift auf die beiden Gruppen zu und hinterlegt den Namen des Sohnes als Key, den Namen des Vaters als Value im Dictionary

anzahl_sohn = {}  
# legt ein Dictionary an, in das in Form einer Frequenzliste füt jeden Vater die Anzahl der Söhne eingetragen wird

for sohn, vater in vater_von.items():  # iteriert durch die keys und values des Dictionarys
    if vater in anzahl_sohn:  
        anzahl_sohn[vater] += 1
        # ist der Vater bereits in der Frequenzliste, wird der Value erhöht
    else:  
        anzahl_sohn[vater] = 1

meiste_soehne = 0  
# Variable, um einen Vergleich mit der Frequenzliste durchführen zu können

for vater, sohn in anzahl_sohn.items():  
    if sohn > meiste_soehne:  # wenn der aktuelle Value größer ist als meiste_kinder
        meiste_soehne = sohn  # die Variable erhält den Wert des aktuellen Values
        gewinner_vater = vater  # der aktuelle Key wird in einer neuen Variablen gespeichert

print("Der Vater mit den meisten Söhnen ist:", gewinner_vater, "mit",meiste_soehne,"Söhnen:")  
# der Name des Vaters mit dem höchsten Score wird ausgegeben, sowie der Score selbst

for sohn in vater_von.keys():  # alle Namen der Söhne ausgeben
    if vater_von[sohn] == gewinner_vater:
        print(" -",sohn)


##Aufgabe 11-9##
#!/usr/bin/python3

import re
def shortest_word(line):  
# definiert die Funktion "shortest_word" mit dem Argument "line"
    splitregex = re.compile(r'\w+')
    sort_wörter = sorted(re.findall(splitregex, line), key=lambda x: len(x))
    # erstellt eine Liste mit allen Matches und sortiert sie nach der Länge 
    return sort_wörter[0] # gibt das erste Element zurück
testline = "Computerlinguistik LMU Student Computer Informatik"
print ('Das kürzseste Wort der Testzeile ist:"',shortest_word(testline),'".') 
# gibt den Rückgabewert der Funktion aus