02-uebung - JULIE Lab

Werbung
02-uebung
April 12, 2016
1
Softwarepraktikum — Übungsblatt 2
Sitzung vom 15.04.2016
Abgabe bis 20.04.2016
Abgabe im Notebook-Format (.ipynb) per E-Mail an:
[email protected]
1.0.1
Aufgabe 1: Implementierung der F-Score Metrik
Führen Sie sich noch einmal die Definitionen für Precision, Recall & F-Score vor Augen:
Precision =
|R∩A|
|A|
Recall =
|R∩A|
|R|
F-Score =
2 × Precision × Recall
Precision + Recall
(1)
Im Folgenden werden Sie Python-Funktionen für die einzelnen Metriken schreiben.
a) Funktionen in Python Wie in der CL Vorlesung werden Funktionen in Python mit def eingeleitet
worauf ein Funktionsname folgt. Jedoch wird anders als bekannt die Rückgabe nicht auch in der daruffolgenden Klammer definiert sondern lediglich die verschiedenen möglichen (bzw. benötigten) Eingaben
(Argumente):
def FUNKTIONSNAME( ARGUMENT1, ARGUMENT2, ...):
Die Rückgabe wird explizit im Funktionskörper mit return angegeben:
def FUNKTIONSNAME( ARGUMENT1, ARGUMENT2, ...):
[...]
return RÜCKGABE
Um das zu verdeutlichen, sei nochmal die Ihnen aus der CL-Übung bekannte Funktion zur Vokalzählung
wiederholt:
def vokale(↓wort, ↑counter):
counter ← 0
for buchstabe in wort:
if buchstabe ist ein Vokal:
counter ← counter + 1
In Python übersetzt sieht diese Funktion so aus:
1
In [ ]: def vokale(wort):
counter = 0
for buchstabe in wort:
if buchstabe in vok:
counter = counter + 1
return counter
Wenn Sie jetzt die folgende Zelle ausführen, wird der Python-Interpreter einen Fehler melden, dass
vok nicht definiert ist. Was für einen Wert muss vok haben, damit die Funktion keinen Fehler erzeugt?
Verändern Sie die obige Funktion entsprechend (und denken Sie daran, die Zelle erneut auszuführen, damit
die Änderungen eingelesen werden).
In [ ]: vokale("Donaudampfschifffahrtskapitän") == 9
b) Python ‘Sets’ Für die Implementation der drei Metriken benötigen Sie eine Möglichkeit, Mengen in
Python zu verwenden. Dazu können Sie die built-in Set Klasse verwenden (kein import notwendig). Lesen
Sie sich das verlinkte Tutorial durch und überlegen Sie, welche set-Methode geeignet ist um die Schnittmenge
(∩) zweier Sets zu erhalten. Des Weiteren müssen Sie eine Möglichkeit finden, die Kardinalität eines Sets
zu berechnen.
c) Precision, Recall, F-Score
Vervollständigen Sie die beiden Funktionen für Precision und Recall.
In [ ]: def precision(a, r):
r = set(r)
a = set(a)
...
return precision
In [ ]: def recall(a, r):
r = set(r)
a = set(a)
...
return recall
Die folgenden Zellen können zum Testen Ihrer Funktionen ausgeführt werden. Die letzten beiden müssen
True ergeben, wenn ihre Funktionen richtig arbeiten.
In [ ]: gefunden = [1,2,3,3,4,7]
richtig = [1,2,6]
In [ ]: precision(gefunden, richtig) == 2/5
In [ ]: recall(gefunden, richtig) == 2/3
Erstellen Sie abschließend eine Funktion um den F-Score zu berechnen. Sie müssen dazu natürlich nicht
noch einmal Precision und Recall berechnen, sondern können die bereits erstellten innerhalb Ihrer neuen
Funktion verwenden.
In [ ]: def fscore( ... ):
...
2
1.0.2
Aufgabe 2: Whitespacetokenizer
In dieser Aufgabe werden Sie einen eigenen Tokenisierer erstellen, der einer heuristischen Annahme folgt und
Tokens in einem Fließtext anhand von einem oder mehreren Leerzeichen unterscheidet.
a) Reguläre Ausdrücke Zuerst sollten Sie sich mit Regulären Ausdrücken in Python 3.5 vertraut machen.
Erstellen Sie daraufhin einen Regulären Ausdruck, der eine beliebige Anzahl sog. Whitespaces “erkennt”:
ws = re.compile(’some_pattern’)
Schauen Sie sich dazu die ‘Zellen’* unter diesen Anweisungen an; die erste beinhaltet ein sog. import
statement für die RegEx-Bibliothek (Reguläre Ausdrücke) von Python (re) und drei Variablenzuweisungen*
(test sentence, check1 & check2).
Die darauffolgende Zelle enthält lediglich eine dummy-Anweisung für das Erstellen eines Regulären Ausdrucks.
Diese sollen Sie verändern um die folgenden Anweisungen zu erfüllen.
Wenn Sie den Ausdruck auf den Testsatz anwenden
ws.findall(test_sentence)
sollten Sie eine Liste zurückbekommen, die nur die Leerzeichen enthält (check1 muss True sein):
[’
’, ’ ’, ’
’, ’ ’]
Überlegen sie nun, wie Sie den Ausdruck ändern können, um die eigentlichen Token zu bekommen (check2
muss True sein).
[’Dieser’, ’Satz’, ’soll’, ’tokenisiert’, ’werden.’]
In [ ]: import re
test_sentence = "Dieser Satz soll
tokenisiert werden."
check1 = [’ ’, ’ ’, ’
’, ’ ’]
check2 = [’Dieser’, ’Satz’, ’soll’, ’tokenisiert’, ’werden.’]
check1
In [ ]: ws1 = re.compile(’some_pattern’)
In [ ]: check1 == ws1.findall(test_sentence)
check2
In [ ]: ws2 = re.compile(’some_other_pattern’)
In [ ]: check2 == ws2.findall(test_sentence)
Anmerkungen:
• Zellen im Notebook werden seperat voneinander ausgeführt, teilen aber den gleichen ‘Code-Raum’.
D.h. wenn Sie die zweite Zelle vor der ersten ausführen, werden Sie einen Fehler gemeldet bekommen,
dass re nicht definiert ist. Sobald Sie jedoch die erste Zelle einmal ausgeführt haben, stehen sowohl
die re Bibliothek als auch die Variablen in Ihrer Sitzung zur Verfügung
• Sie können Zellen beliebig bearbeiten und dann erneut ausführen um Ihre Veränderungen wirksam zu
machen, damit ist das Notebook eine sehr viel komfortablere Variante um interaktiv zu arbeiten als
bspw. die iPython-Konsole.
• Um eine ausgewählte Zelle auszuführen, können Sie <Strg>+<Enter>, <Shift>+<Enter> oder
<Alt>+<Enter> drücken. (Was ist der Unterschied?) Über den Menüpunkt Cell haben Sie auch die
Möglichkeit alle Zellen auszuführen etc.
• Anders als vielleicht aus der CL-Vorlesung gewohnt, werden in Python Variablenzuweisungen mit
einem ‘=’ und nicht mit ‘←’ vorgenommen. Das führt außerdem dazu, dass Gleichheitsabfragen mit
‘==’ durchgeführt werden.
3
Herunterladen