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