Projektvorschläge für C++ I, WS 2013/14



Ähnliche Dokumente
Bigramm-Statistik [mittelschwer]

Programmiersprachen und Übersetzer

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Grundbegriffe der Informatik

Programmierkurs Java

15 Optimales Kodieren

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

Professionelle Seminare im Bereich MS-Office

Die Excel Schnittstelle - Pro Pack

Vorgehensweise bei Lastschriftverfahren

Theoretische Grundlagen der Informatik

Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress.

Lehrer: Einschreibemethoden

Anleitung über den Umgang mit Schildern

Zeichen bei Zahlen entschlüsseln

Fallbeispiel: Eintragen einer Behandlung

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

«/Mehrere Umfragen in einer Umfrage durchführen» Anleitung

Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0)

MdtTax Programm. Programm Dokumentation. Datenbank Schnittstelle. Das Hauptmenü. Die Bedienung des Programms geht über das Hauptmenü.

Bedienungsanleitung Anlassteilnehmer (Vereinslisten)

R ist freie Software und kann von der Website.

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten

Was ist PDF? Portable Document Format, von Adobe Systems entwickelt Multiplattformfähigkeit,

Viele Bilder auf der FA-Homepage

Anleitung zum erstellen einer PDF-Datei aus Microsoft Word

Ihre Interessentendatensätze bei inobroker. 1. Interessentendatensätze

1. So einfach ist der Excel-Bildschirm

Hilfe zur Urlaubsplanung und Zeiterfassung

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Artikel Schnittstelle über CSV

1. das es keiner Ausdrucke mehr für die Formwertrichter bedarf 2. das die Korrekturen vom Richter selbst an seinem PC durchgeführt werden können.

Grundlagen der Theoretischen Informatik, SoSe 2008

CVR Seniorentreff vom 04. und Serienbriefe/Seriendruck. Serienbriefe / Seriendruck

Was meinen die Leute eigentlich mit: Grexit?

Summenbildung in Bauteiltabellen mit If Then Abfrage

Leichte-Sprache-Bilder

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Info-Veranstaltung zur Erstellung von Zertifikaten

Datenübernahme bei Umstieg von T-Online Banking 6 auf Quicken 2010 so wird s gemacht!

Erstellen einer digitalen Signatur für Adobe-Formulare

Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER

Bezahlen von Lohn und Gehalt per SEPA

TEAMWORK-Uploader. Dokumentenaustausch mit dem PC

Excel Pivot-Tabellen 2010 effektiv

Part-of-Speech- Tagging

proles-login. Inhalt [Dokument: L / v1.0 vom ]

YouTube: Video-Untertitel übersetzen

t r Lineare Codierung von Binärbbäumen (Wörter über dem Alphabet {, }) Beispiel code( ) = code(, t l, t r ) = code(t l ) code(t r )

Übungen Programmieren 1 Felix Rohrer. Übungen

Dokumentation zum Spielserver der Software Challenge

Erstellen der Barcode-Etiketten:

Das große ElterngeldPlus 1x1. Alles über das ElterngeldPlus. Wer kann ElterngeldPlus beantragen? ElterngeldPlus verstehen ein paar einleitende Fakten

In diesem Tutorial lernen Sie, wie Sie einen Termin erfassen und verschiedene Einstellungen zu einem Termin vornehmen können.

Internet online Update (Internet Explorer)

4.9 Deterministische Kellerautomaten Wir haben bereits definiert: Ein PDA heißt deterministisch (DPDA), falls

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.

Formale Sprachen und Grammatiken

Erstellen einer PostScript-Datei unter Windows XP

teischl.com Software Design & Services e.u. office@teischl.com

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

ACDSee Pro 2. ACDSee Pro 2 Tutorials: Übertragung von Fotos (+ Datenbank) auf einen anderen Computer. Über Metadaten und die Datenbank

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Über die Internetseite Hier werden unter Download/aktuelle Versionen die verschiedenen Module als zip-dateien bereitgestellt.

1 topologisches Sortieren

Klicken Sie auf Weiter und es erscheint folgender Dialog

PowerPoint 2010 Mit Folienmastern arbeiten

Elexis-BlueEvidence-Connector

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.

Umgang mit der Software ebuddy Ändern von IP Adresse, Firmware und erstellen von Backups von ewon Geräten.

EDV-Fortbildung Kombi-Schulung Word-Excel Modul Excel. Informationen zum Programm. Die Programmoberfläche von Excel

Zertifikat in dakota einlesen Wie lese ich mein Zertifikat in dakota.le ein?

Übungen zu C++ Kapitel 1

Datensicherung. Beschreibung der Datensicherung

3. GLIEDERUNG. Aufgabe:

PVL 3 - Roulette. (5 Punkte) Abgabe bis

Funktion Erläuterung Beispiel

Verarbeitung der -Adressen

Schulberichtssystem. Inhaltsverzeichnis

Ist Excel das richtige Tool für FMEA? Steve Murphy, Marc Schaeffers

Tevalo Handbuch v 1.1 vom

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

Ablaufbeschreibung für das neu Aufsetzen von Firebird und Interbase Datenbanken mit der IBOConsole

Windows 7 Winbuilder USB Stick

Inhaltsverzeichnis. 1. Empfängerübersicht / Empfänger hinzufügen 2. Erstellen eines neuen Newsletters / Mailings 3. Versand eines Newsletters

Erklärung zum Internet-Bestellschein

Neue Steuererklärung 2013 erstellen

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Erstellen von x-y-diagrammen in OpenOffice.calc

Empfehlungen zur Nutzung der CD zum Buch: Klee & Wiemann: Beweglichkeit und Dehnfähigkeit. Schorndorf: Hofmann,

Die Erstellung eigener Strukturprofile

5.2 Neue Projekte erstellen

Im Folgenden wird Ihnen an einem Beispiel erklärt, wie Sie Excel-Anlagen und Excel-Vorlagen erstellen können.

Installation OMNIKEY 3121 USB

Anleitung - Archivierung

Einfügen von Bildern innerhalb eines Beitrages

Einstieg in Exact Online Buchungen erfassen. Stand 05/2014

Verarbeitung von ZV-Dateien im Internetbanking. Inhalt. 1. Datei einlesen Datei anzeigen, ändern, löschen Auftrag ausführen...

Transkript:

Projektvorschläge für C++ I, WS 2013/14 Weitere Projekte nach Rücksprache in Verbindung mit dem Kurs Endliche Automaten in der CL ausgewählt werden. Beachten Sie, dass damit auch ein doppelter Zeitaufwand einhergeht.

Tokenizer-Klasse für Zahlen, Wörter und Satzzeichen [4] Tokenizer bilden üblicherweise die erste Stufe der Verarbeitung von schriftlichen Daten. Aufgabe des Tokenizers ist die Bestimmung und Klassifikation bedeutungsvoller Einheiten (tokens) im Eingabetext. Tokenizer arbeiten meist auf der Basis endlicher Automaten, die man entweder manuell erzeugt oder sich mit geeigneten Werkzeugen aus regulären Ausdrücken generiert. Zu erstellen ist ein einfacher Tokenizer für das Deutsche, der mindestens die Tokenklassen Wort, Zahl, Satzzeichen und Datumsausdruck (in den verschiedenen im Dt. gängigen Formen wie 9.2.2014, 09.02.2014, 9.2.14, 9. Februar 2014, 9. Feb. 2014) erkennt. // Erstellt eine Instanz des Tokenizers Tokenizer tokenizer; // Verarbeitet die Datei Text.txt und erzeugt eine Datei Test.txt.tokens. // Diese enthält pro Zeile ein Token und nach einem Tab-Zeichen die dazu- // gehörige Klasse tokenizer.process("test.txt","test.txt.tokens"); Zusatzpunkte für die Erweiterung des Tokenizers auf weitere Klassen wie Datum, http-adresse.

Textkonkordanz [5] Zu erstellen ist eine Klasse zur Repräsentation und Ausgabe einer Textkonkordanz. Hierunter wird hier eine indexartige Übersicht über die verschiedenen Wörter in einem Text verstanden, samt der Information, in welcher Zeile sie auftreten. Die Ausgabe soll anschließend mittels einer Methode im HTML-Tabellenformat erfolgen. Diese Tabelle weist 3 Spalten auf: Wort, Häufigkeit, Folge der Nummern derjenigen Zeilen, in denen das Wort vorkommt. Voraussetzung ist ein Tokenizer. // Erstellt eine Konkordanz auf der Grundlage // des Textes in der Datei "Zeit.txt". Concordance cc("zeit.txt"); cc.output_statistics("concordance.html"); Als Datenstruktur eignet sich eine Trie-ähnliche Struktur. Das jeweilige Wort definiert dabei einen Pfad im Trie. Die jeweiligen Fundstellen des Worts können dann dem erreichten Endzustand zugeordnet werden. M.a.W.: der Endzustandsvektor enthält statt boolscher Werte Listen, deren Elemente jeweils Zeilennummern (unsigned) sind. Hinzu kommt wie immer der next-zeiger der Liste. Soll ein neues Paar (w,pos) hinzugefügt werden, folgt man zunächst dem Pfad von w im Trie. Möglicherweise müssen hierbei neue Trie-Übergänge geschaffen werden. Der mit w erreichte Zustand ist ein Endzustand, dessen zugeordneter Liste man pos hinzufügt. Die Länge der Liste ergibt die absolute Häufigkeit, mit der w im Text vorkommt. Zur Ausgabe der Statistik muss der Trie systematisch durchlaufen werden. Hierzu eignet sich entweder eine rekursive Methode oder eine Lösung die Backtracking-Informationen explizit auf einem Stack speichert. Ein Stack kann wiederum auf der Basis einer verketteten Liste realisiert werden.

Levensthein-Distanz [6] Zu erstellen ist eine Klasse zur Berechnung der Levensthein-Distanz (Editierabstand zwischen zwei Wörtern). int main(int argc, char* argv[]) // Eine Instanz der Distanzklasse erzeugen EditDistanceComputer ed; // Distanz zweier von der Befehlszeile übergebener Wörter berechnen. std::cout << argv[1] << "\t" << argv[2] << ed.distance(argv[1],argv[2]) << "\n"; Als Erweiterung kann man auf dieser Grundlage eine einfache Meinten-Sie-Funktion implementieren.

Cocke-Younger-Kasami-Parser [6] Erstellt werden soll ein CYK-Parser, der neben binären Grammatikregeln auch unäre (Ketten-) Regeln handhaben kann. Die Verwendung der Parser-Klasse ist in etwa wie folgt (selbstverständlich werden Dateinamen etc. nicht in das Programm kodiert sondern über die Befehlszeile übergeben): // Parser konstruieren und Grammatik und Lexikon einlesen CYKParser parser("grammar1.grm","lexicon_dt.lex"); // Satz parsen parser.parse("die Maus jagt die Katze"); // Parse-Tabelle im HTML-Format ausgeben (<table> </table>) parser.output_parse_table("cyk.html"); Die Grammatik soll im Prolog-DCG-Format vorliegen (ohne Argumente); das Lexikon als Liste von Paaren Wort-Kategorie. Die Parse-Tabelle kann als statische Matrix ausreichender Größe (etwa 50x50) oder dynamisch realisiert werden. In beiden Fällen enthalten die Matrixzellen Zeiger auf Listen von Nichtterminalen (ASCIIZ-Zeichenketten, besser aber noch Zahlen, die bijektiv Nichtterminale kodieren). Der eigentliche Parsalgorithmus ist einfach (die üblichen 3 verschachtelten Schleifen). Die Behandlung von Kettenregeln muss hinzukommen (vgl. z.b. Lange/Leiss, http://www.informatica-didactica.de/cmsmadesimple/uploads/artikel/langeleiss2009/langeleiss2009.pdf ) Zur Initialisierung der Parse-Matrix wird der Eingabesatz tokenisiert und jedes Wort im Lexikon nachgeschlagen. Nach dem Parsing erfolgt die Ausgabe der Parse-Tabelle im HTML-Format. Zusatzpunkte: schöner als eine Ausgabe der Parse-Tabelle ist eine Ausgabe aller Bäume (im Prolog-Wishtree/Showtree-Format), die der Ausgabe zugeordnet werden können. Sie können dann z.b. mit showtree visualisiert werden. Hinweis: zum Extrahieren der Bäume eignet sich z.b. eine rekursive Funktion, die die Parse-Tabelle rückwärts (vom Startsymbol zu den Wörtern) durchläuft.

Sprachmodell [6] Implementiert werden soll die Funktionalität eine Trigramm-Sprachmodells auf Wortbasis. Hierzu werden in einem ersten Durchlauf über das Trainingskorpus (hierzu wird ein Tokenisierer benötigt) jeweils Tries für Unigramme, Bigramme und Trigramme erstellt, die für jedes N-Gramm dessen Frequenz festhalten. Nach dem Einlesen des Trainingskorpus wird nun für jedes Bi/Trigramm seine bedingte Wahrscheinlichkeit p nach der MLE-Methode bestimmt (Maximum likelihood estimation): p(c ab) = f(abc) / f(ab) und p(b a) = f(ab) / f(a) f(x) gibt jeweils die Frequenz des N-Gramms x an. Die Verwendung der LanguageModel-Klasse soll etwa so aussehen: // Schritt 1: erzeugt Frequenzstatistiken für 1,2,3-Gramme LanguageModel lm("trainings.corpus"); // Schritt 2: Bestimmt bedingte W keiten lm.do_mle(); // Ausgabe der N-gramme und ihrer bedingte W keiten in eine Textdatei lm.print_lm();

Textkompression durch statisches Huffman-Enkodieren [8] Die Idee der Huffman-Enkodierung besteht darin, auf der Grundlage der Häufigkeitsverteilung der einzelnen Symbole (z.b. ASCII) in einem Text eine Umkodierung vorzunehmen, so dass Symbole, die häufiger im Text vorkommen, mit weniger Bits kodiert werden als solche, die seltener vorkommen (dieselbe Idee steht übrigens auch hinter der Berechnung der sog. relativen Entropie eines Textes). Der resultierende Code hat die Präfix- Eigenschaft: kein Präfix von ihm ist selbst ein gültiger Code. Das gleiche gilt z.b. auch für Telefonnummern: kein Präfix der Nummernfolge ist selbst eine gültige Telefonnummer, sonst würde man ja beim Eingeben der Ziffern quasi aus Versehen andere Leute anrufen. Bei der Huffman-Enkodierung wird nach einem ersten Durchlauf durch den zu komprimierenden Text, der eine Häufigkeitsverteilung generiert, ein Trie mit dem Alphabet 0 und 1 aufgebaut. Der umkodierte Text soll in eine XML-Datei ausgegeben werden. Beim statischen Huffman- Enkodieren ist es zudem nötig, den Code ebenfalls zu Beginn der umkodierten Datei zu speichern. // Instanz des Huffman-Encoders erzeugen HuffmanEncoder huffman_encoder; // Einen gegebenen Text komprimieren und im XML-Format in einen Stream ausgeben. std::ofstream encode_out("zeit1.encoded.xml"); huffman_encoder.encode("zeit1.txt",encode_out); encode_out.close(); // Liest den umkodierten Text (und den Code) aus der XML-Datei und // stellt den Original-Text wieder her std::ofstream decode_out("zeit1.kopie.txt"); huffman_encoder.decode("zeit1.encoded.xml",decode_out); Literatur: Crochemore, M.; Rytter, W. (2003): Jewels of Stringology. Text Algorithms. World Scientific. Kap. 10.2. [kann bei mir kopiert werden]

Ein robuster Mustererkenner [7] A.V. Aho & M. Corasick haben 1975 ein sehr interessantes Verfahren entwickelt, mit dem man parallel nach einer Menge von Suchausdrücken in einem Text suchen kann. Hierzu wird eine Trie-Struktur entwickelt, die um zwei Funktionen - output und failure - erweitert wird. Die Funktion output ist für Endzustände definiert und enthält die Menge der gefundenen Suchausdrücke, während failure für jeden Zustand s angibt, in welchem Zustand man fortfahren kann, wenn man in s mit der Verarbeitung scheitert. // Liste von Suchausdrücken aufbauen StringList search_patterns; search_patterns.add("haus"); search_patterns.add("häuser"); search_patterns.add("hauses"); search_patterns.add("häusern"); // Instanz des Mustererkenners auf der Basis der gegebenen // Suchausdrucksliste erzeugen ACPatternMatcher acpm(search_patterns); // Text verarbeiten und gefundene Muster auf std::cout ausgeben acpm.process_text("zeit1.txt"); // Mustererkenner als DOT-Datei speichern acpm.draw("acpm.dot"); Der Konstruktor des Mustererkenners soll eine Liste von Suchausdrücken erhalten und auf deren Grundlage die Datenstrukturen aufbauen. Anschließend können ASCII-Texte verarbeitet werden. Die Suchergebnisse sollen dabei auf einen übergebenen ostream in der Form <begin,word,end> ausgegeben werden: von der Textposition begin bis zur Textposition end wurde das Wort word gefunden. Literatur: Aho, A.V.; Corasick, M. (1975): "Efficient string matching. An aid to bibliographic search". Comm. ACM 18 (1975): 333-340.

Mustererkennung mit Suffix-Tries [8] Wenn man ein und denselben Text häufiger durchsucht, kann es praktisch sein, diesen Text einer Vorverarbeitung zu unterziehen, die das Suchen erleichtert. Eine Möglichkeit hierfür ist, eine spezielle Trie-Struktur aufzubauen, die alle Suffixe des gegebenen Texts enthält. Damit man dabei nicht zu viele Zustände erzeugt, muss man auf die Übergänge eine sog. Pfadkompression anwenden, bei der nicht verzweigende Pfade maximaler Länge durch einen einzigen Übergang ersetzt werden, der mit einer Zeichenkette statt mit einem einzelnen Zeichen etikettiert ist. Die Suche nach einem Wort ist dann ganz einfach: man fängt an der Wurzel des Tries an und folgt den Übergängen. Kann man dabei das Wort ganz abarbeiten, so ist das Wort ein Präfix eines Suffixes des Textes und somit im Text enthalten. // Instanz des Mustererkenners auf der Basis eines // gegebenen Texts erzeugen SuffixTrie st("zeit.txt"); // Nach einem Teilstring suchen und // gefundene Positionen auf std::cout ausgeben st.lookup("suchwort"); Literatur: Crochemore, M.; Rytter, W. (2003): Jewels of Stringology. Text Algorithms. World Scientific. Kap. 4. [kann bei mir kopiert werden]

Chart-Parser [9] Grammatik und Lexikon sollen vorzugsweise im Prolog-DCG-Format vorliegen und bei der Konstruktion einer Parserinstanz übergeben werden. Ausgabe des Parsers soll eine Text-Datei mit den der Eingabe zugewiesenen Bäumen im Wishtree/showtree-Format sein. Extrapunkte für die Behandlung von Tilgungsregeln, Lookahead, Verwendung eines Parswalds, Verwendung einer Agenda. Voraussetzung ist ein Tokenizer. // Erstellt einen Chart-Parser auf der Grundlage einer Grammatik // und eines Lexikons. ChartParser parser("germangrammar.pl","germanlexicon.pl"); // Parse den Satz und schreibe die erzeugten Bäume in die Datei trees.txt // Vor dem Parsen muss der Satz natürlich tokenisiert werden. parser.parse("farblose grüne Ideen schlafen rasend","trees.txt");

Top-Down-Backtracking-Parser [8] Zu implementieren ist ein Top-Down-Backtracking-Parser. Grammatik und Lexikon sollen vorzugsweise im Prolog-DCG-Format vorliegen und bei der Konstruktion einer Parserinstanz übergeben werden. Top-Down-Backtracking-Parser arbeiten mit zwei Stapeln: auf dem einen liegen die Symbole, die während einer Linksableitung darauf gelegt werden, auf dem anderen Stapel liegen Informationen darüber, welche Regelalternativen für einzelnen Nichtterminale noch ausprobiert werden müssen. Ausgabe des Parsers soll eine Text-Datei mit den der Eingabe zugewiesenen Bäumen im Wishtree/showtree-Format sein. Voraussetzung ist ein Tokenizer. Literatur: A.H. Aho & J.D. Ullman (1972): The Theory of Parsing, Translation, and Compiling. Vol. I, S. 289 ff. // Erstellt einen TDB-Parser einer Grammatik und eines Lexikons, jeweils // im Prolog-Format (die Grammatik z.b. als DCG) TDPParser parser("germangrammar.pl","germanlexicon.pl"); // Parse den Satz und schreibe die erzeugten Bäume in die Datei trees.txt // Vor dem Parsen muss der Satz natürlich tokenisiert werden. parser.parse("farblose grüne Ideen schlafen rasend","trees.txt");

Ein Compiler von regulären Ausdrücken in deterministische endliche Automaten [10] Zu implementieren ist ein Compiler, der reguläre Ausdrücke im Unix grep-stil in deterministische endliche Automaten umsetzt, die dann Suchen in Texten ausführen. // Erstellt eine Instanz eines Regex-Compilers RE2DFA re_compiler; // Übersetze einen reg. Ausdruck... DEA dea = re_compiler.compile("[a-z]+(ä ö ü)ck"); //... und wende den erzeugten Automaten auf einen Beispieltext an // (die Ausgabe der Fundstellen erfolgt auf std::cout) dea.lookup("beispiel.txt");

LR(1)-Parsergenerator [10] Zu erstellen ist ein LR(1)-Parsergenerator, der eine in Prolog-DGC-Format vorliegende kontextfreie Grammatik nimmt und daraus die Steuertabelle eines Parsers generiert. Diese soll von einem LR-Parser eingelesen werden, der einen Satz auf der Basis dieser Steuertabelle parst und den Syntaxbaum ausgibt. Literatur: Aho, A.V.; Sethi, R. Ullman. J.D. (1986): Compilers. Principles, Techniques and Tools. Addison-Wesley.

C4.5- Klassifikationsalgorithmus [7-8] Der C4.5 Algorithmus lernt Entscheidungsbäume aus Ereignisdaten. Der Entscheidungsbaum realisiert dabei einen Klassifikator, der mittels einer endlichen Folge von (standardmäßig binären) Fragen ein Datum einer Klasse zuordnet. C4.5 hat Anwendungen beim maschinellen Lernen, aber auch beispielsweise beim Tagging. Literatur: Quinlan, J. R. C4.5: Programs for Machine Learning. Morgan Kaufmann Publishers, 1993. http://en.wikipedia.org/wiki/c4.5_algorithm