Übung zur Vorlesung “Einführung in die Computerlinguistik und Sprachtechnologie” Wintersemester 2015/2016, Prof. Dr. Udo Hahn, Franz Matthies Übungsblatt 5 vom 08.12.2015 Abgabe bis 14.12.2015, 23.59 Uhr; per Email (möglichst PDF) an [email protected] Aufgabe 1 : Algorithmen verstehen (4 Punkte) a) Beschreibung (2 Punkte) Beschreiben Sie präzise in ganzen Sätzen, was der folgende Algorithmus für die englische Sprache macht. Gehen Sie dabei vor allem auf die Gesamtaufgabe des Programms ein. Würden Sie einen präziseren Namen als "umwandlung" vorschlagen? umwandlung ( ↓ e i n g a b e w o r t , ↑ a u s g a b e w o r t ) endung ← e i n g a b e w o r t [ l e n g t h ( e i n g a b e w o r t ) −3: l e n g t h ( e i n g a b e w o r t ) ] i f endung = " i e s " a u s g a b e w o r t ← e i n g a b e w o r t [ 0 : l e n g t h ( e i n g a b e w o r t ) −3] ausgabewort ← ausgabewort + "y" else ausgabewort ← eingabewort Lösung: Der Algorithmus nimmt ein Wort als eingabewort entgegen und speichert die letzten drei Zeichen des Wortes in der Variablen endung. Diese Variable wird daraufhin untersucht, ob sie die Zeichenkette "ies" enthält. Ist dies der Fall, wird diese Endung durch "y" ersetzt und das Ergebnis in ausgabewort gespeichert. Damit werden Wörter, die auf ”ies“ enden so umgeformt, dass ”ies“ entfernt und durch ”y“ ersetzt wird. Das bedeutet, dass englische Substantive, die im Singular auf ”y“ und im Plural auf ”ies“ enden (city, baby, party...nicht zu verwechseln mit den eingedeutschten Varianten, die im Deutschen auch im Plural auf ”ys“ enden (”Handys“)), korrekt von ihrer Plural- auf ihre Singularform zurück geführt werden. Ebenso mit Verben, die im Infinitiv auf ”y“ und in der dritten Person Singular auf ”ies“ enden. Andere Wörter bleiben unmodifiziert. b) Identifikation von Fehlerquellen (2 Punkte) Hat der Algorithmus aus der vorigen Teilaufgabe Unzulänglichkeiten? Welche? Beschreiben Sie informell, wie die Probleme das Algorithmus’ behoben werden könnten. Benutzen Sie auch hier bitte ganze Sätze! Lösung: Unabhängig von der linguistischen Interpretation ist der Algorithmus anfällig für Eingaben mit weniger als 3 Zeichen. Allgemein geht der Algorithmus für Wörter fehl, die zwar auf ”ies“ enden, deren Rückführung auf eine ”y“ Endung aber keinen Sinn ergibt. Beispiele dafür sind einige Verben wie ”lie“ (he lies) oder ”die“ (he dies). Lösungsansatz hierfür wäre etwa ein Wörterbuch, in dem unregelmäßige Formen aufgeführt sind und gegen das abgeglichen werden kann. Zudem könnte es helfen, die Wortart des Eingabewortes zu kennen und die Reduktion nur für Substantive und Verben durchzuführen. Falls ein Substantiv vorliegt, wäre es zudem hilfreich zu wissen, ob es überhaupt im Plural steht. Außerdem könnte ein Grundformwörterbuch helfen: Man könnte testen, ob eine zurückgeführte Wortform im Grundformwörterbuch zu finden ist. Falls nicht, könnte man davon ausgehen, es mit einem Sonderfall zu tun zu haben und die Reduktion nicht durchführen. Der Algorithmus könnte für solche Fälle das Wort unverändert zurück geben. Damit würde davon ausgegangen, dass Wörter, die nicht bearbeitet werden können, bereits in ihrer Grundform stehen oder zumindest in keiner Form, die dieser Algorithmus bearbeitet. 1 Aufgabe 2 : Algorithmus zur Satzsegmentierung (6 Punkte) Eine der grundlegendsten Aufgabe in der Computerlinguistik ist es, in einem Fließtext Sätze zu erkennen. Ein Programm zur Satzerkennung bekommt als Eingabe einen Text, beispielsweise “Peter lief nach draußen. Seine Jacke wurde vom Regen durchweicht.”. Die Ausgabe des Programms wären dann die Sätze “Peter lief nach draußen.” und “Seine Jacke wurde vom Regen durchweicht.” a) (1 Punkt) Eine naive Herangehensweise zur Satzerkennung ergibt sich, wenn jeder Punkt im Text als Satzgrenze aufgefasst wird. Welche Probleme sehen Sie bei diesem Vorgehen? Nennen Sie Beispiele. Lösung: Der Punkt ist in seiner graphematischen Bedeutung ambig. Obwohl die meisten Punkte in gewöhnlichen Texten tatsächlich ein Satzende markieren, führen Punkte von • Abkürzungen • Datumsangaben • Zeitangaben • Dezimalangaben (1.000) • etc. zur fälschlichen Satztrennung. Als Unteraufgabe der Satzerkennung gilt es daher, diejenigen Punkte zu identifizieren, die kein Satzende markieren. b) (3 Punkte) Geben Sie einen einfachen Algorithmus an, der einen Text entgegen nimmt und diesen satzweise ausgibt. Hinweise: • Als Hilfestellung sei die Funktion getWords(text) gegeben. Diese Funktion bekommt einen Text, trennt ihn an Leerzeichen und gibt die so erhaltenen Wörter (ggf. mit Interpunktion!) in einer Liste zurück. Die Leerzeichen selbst gehen dabei verloren. Beispiel: words ← getWords("Peter lief nach draußen.") zerlegt den eingegeben Satz in die Elemente "Peter", "lief", "nach" und "draußen." (man beachte, dass das letzte Element auch den Punkt enthält, da er nicht durch ein Leerzeichen abgetrennt ist). Die Variable words enthält nun alle diese Wörter. Wie gehabt kann mit words[0] auf das 1te Wort, mit words[1] auf das 2te Wort etc. zugegriffen werden. • Als weitere Hilfe sei eine Liste aller Titel titleList gegeben. Diese Liste enthalte beispielsweise “Dr.”, “Prof.”, “Dipl.” etc. Diese Liste kann verwendet werden, um zu überprüfen, ob ein Wort eine Abkürzung oder ein Satzende darstellt. Bsp: if wort in titleList: ... • Eine einzelne Variable kann beliebig viele Zeichen und Wörter enthalten. Betrachten Sie folgendes Beispiel: wort1 ← " P e t e r " wort2 ← " l i e f " s a t z ← wort1 + " " + wort2 Die Variable satz enthält nun die Zeichenkette "Peter lief" (man beachte das Leerzeichen, das wieder hinzugefügt werden muss). • Eine Variable kann “geleert” werden, indem man ihr die leere Zeichenkette zuweist: satz ← "". 2 Lösung: t e x t ← <eingabe > words ← g e t W o r d s ( t e x t ) sentence ← "" f o r i from 0 t o l e n g t h ( words )−1 : # a u c h m o e g l i c h m i t : f o r word i n words s e n t e n c e ← s e n t e n c e + " " + words [ i ] i f words [ i ] [ l e n g t h ( words [ i ] ) − 1 ] = ’ . ’ : i f words [ i ] n o t i n t i t l e L i s t t h e n : print sentence sentence ← "" c) (2 Punkte) Verfeinern Sie ihren Algorithmus indem sie versuchen die Probleme, die Sie in Teilaufgabe a) identifiziert haben, zu lösen. Ihnen stehen dafür alle Mittel zur Verfügung wie beispielsweise weitere Listen mit bestimmten Wörtern oder Funktionen zur Identifikation bestimmter problematischer Strukturen. Falls Sie Listen oder Funktionen verwenden, geben Sie detailliert deren Inhalt bzw. deren Funktionsweise an! Hinweis: Sie können die Teilaufgaben b) und c) auch mit einem einzelnen Algorithmus lösen. Es erweist sich jedoch oft als hilfreich, zunächst mit einem einfacheren Algorithmus zu beginnen und diesen anschließend weiter auszubauen. Lösung: t e x t ← <eingabe > words ← g e t W o r d s ( t e x t ) sentence ← "" f o r i from 0 t o l e n g t h ( words )−1 : # a u c h m o e g l i c h m i t : f o r word i n words s e n t e n c e ← s e n t e n c e + " " + words [ i ] i f c o n t a i n s D o t ( words [ i ] ) t h e n : i f words [ i ] n o t i n t i t l e L i s t and n o t i s D a t e ( words [ i ] ) and n o t i s T i m e ( words [ i ] ) and n o t i s D e c i m a l ( words [ i ] ) : print sentence sentence ← "" containsDot(word) nimmt ein Wort entgegen und sucht nach einem Punkt irgendwo im Wort. Wird einer gefunden, gibt die Funktion TRUE zurück, ansonsten FALSE. isDate(word)nimmt ein Wort entgegen und gibt zurück, ob dieses eine Datumsangabe darstellt (TRUE/FALSE). isTime(word)nimmt ein Wort entgegen und gibt zurück, ob dieses eine Zeitsangabe darstellt (TRUE/FALSE). isTime(word)nimmt ein Wort entgegen und gibt zurück, ob dieses eine Dezimalzahl darstellt (TRUE/FALSE). 3
© Copyright 2024 ExpyDoc