Java für Computerlinguisten - Institut für Maschinelle

Werbung
Java für Computerlinguisten
3. Bibliothek/Technisches
Christian Scheible
Institut für Maschinelle Sprachverarbeitung
29. Juli 2009
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
1 / 59
Heute:
1
Besprechung der Übungen vom Dienstag
2
Technisches
3
Klassenbibliothek
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
2 / 59
Technisches
• Classpath
• Jar
• Javadoc
• JUnitTest
• eclipse
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
3 / 59
Classpath
import java.util.*;
import de.unistuttgart.ims.NeuerParser;
Classpath
• Unterschied zwischen den beiden Zeilen?
• Wo findet Java die jeweiligen Pakete?
→ Classpath: Liste von Verzeichnissen, in denen Klassen/Pakete liegen
Linux:
Windows:
Eclipse:
setenv CLASSPATH=Verzeichnis1:Verzeichnis2
set CLASSPATH=Verzeichnis1;Verzeichnis2
Sehen wir morgen
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
4 / 59
Jar
Jar
• Java Archive
• Compilierte Klassen (.class) verbrauchen Platz
• Jar fasst die Dateien zu einem Archiv zusammen
→ Übersichtlichkeit
→ Komprimierung
→ Informationen zum Inhalt werden mit eingepackt (z.B. Version)
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
5 / 59
Jar
Archiv erzeugen
jar |{z}
cvf
Modifikator
c
f
v
t
x
m
HelloWorld.jar
{z
}
|
Ziel
HelloWorld.class
|
{z
}
Dateien zum Verpacken
Archiv erzeugen
jar-Datei schreiben
Detailliertere Ausgabe
Übersicht anzeigen
Archiv auspacken
Manifest
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
6 / 59
Jar
Jar ausführen
java -jar HelloWorld.jar
Woher weiß java, welche Klasse das Hauptprogramm enthält?
→ Manifest
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
7 / 59
Jar
Manifest
• Enthält Informationen über Jar-Archiv
• Main-Class: Welche Klasse enthält das Programm?
Manifest.txt
Main-Class: HelloWorld
Archiv erzeugen
jar cvmf
Manifest.txt
Christian Scheible
HelloWorld.jar
Java für Computerlinguisten
HelloWorld.class
29. Juli 2009
8 / 59
Demo
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
9 / 59
Javadoc
Übersicht
• Dokumentation ist wichtig!
• Kommentare durchlesen ist mühsam
• Javadoc kann HTML-Dokumentationen generieren
→ z.B. Java-Online-Dokumentation
• Javadoc-Annotationen in Kommentaren vor Klasse, Interface,
Methode (durch den zweiten * im Kommentarbeginn)
/**
* Schreibt ein <i>Wort</i> in eine <i>Datei</i>
*
* @param fileName Name der Ausgabedatei
* @param wort Wort, das geschrieben werden soll
* @return true wenn erfolgreich geschrieben, ansonsten false
*/
boolean writeToFile (String fileName, Word wort) {
// ...
}
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
10 / 59
Javadoc
Annotationen (Auszug)
Tag
@author
@version
@param
@return
@exception
Ort
Klassen, Interfaces
Klassen, Interfaces
Methoden, Konstruktoren
Methoden
Bedeutung
Autor
Version des Programms
Funktionsparameter
Rückgabewert
Exceptions
• Reihenfolge wie oben einhalten!
• Beschreibung wird für alles generiert, was public ist
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
11 / 59
Demo
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
12 / 59
eclipse
Übersicht
• Entwicklungsumgebung
• Projektmanagement
• Syntax-/Semantik-Hilfe
• Eclipse Cheat Sheet [1]
Aufteilung
• Workspace
• Projekt
• .java-Dateien
• ...
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
13 / 59
Demo
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
14 / 59
Mehr?
Apache Ant
• Automatische Compilierung für große Java-Projekte
• Ähnlich wie make
JAD
• Java-Decompiler
• .class → java
• Wird nicht mehr weiterentwickelt
JUnit
• Wichtig: Tut das Programm, was es soll?
• Unit-Tests
• Einfache Erstellung von Testfällen
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
15 / 59
Datenstrukturen & Algorithmen
• Listen
• Assoziative Speicher (Maps)
• Mengen
• Algorithmen
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
16 / 59
Klassenbibliothek
• Beinhaltet viele zusätzliche Pakete, unter anderem
• Datenstrukturen
• Algorithmen
• Vollständige Liste in der Java Documentation [2]
Beispiele
java.awt
java.io
java.lang
java.net
java.util
java.swing
javax.xml
Christian Scheible
Application Window Toolkit
Dateiverarbeitung
Standard-Paket (immer eingebunden)
Internetverbindung
Datenstrukturen, Datum/Zeit
Grafische Benutzerinterfaces
XML-Verarbeitung
Java für Computerlinguisten
29. Juli 2009
17 / 59
Datenstrukturen
• Verschiedene Behälter-Strukturen
• Interfaces garantieren Standardfunktionen
• Hinzufügen
• Entfernen
• ...
• Generisch (können beliebige Referenztypen speichern)
Collection
Set
Christian Scheible
List
Map
Queue
Java für Computerlinguisten
29. Juli 2009
18 / 59
Datenstrukturen
• Warum Listen, warum nicht einfach Arrays?
→ Arrays haben feste Größe
→ Verkettete Liste für manche Anwendungen besser
Listen
• ArrayList
• java.util.ArrayList
• Array mit variabler Größe
• Vergrößerung teuer
• LinkedList
• java.util.LinkedList
• Verkettete Liste
• Zugriff teuer
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
19 / 59
Datenstrukturen
Wichtige Methoden von Listen
add(e)
get(index)
remove(index)
clear()
Element e hinzufügen
Element an Stelle index abfragen
Element an Stelle index löschen
Leeren
indexOf(e)
contains(e)
isEmpty()
size()
An welcher Stelle steht e?
Ist e enthalten?
Liste leer?
Anzahl der Elemente
iterator()
toArray()
Iterator zurückgeben
Umwandlung in Array
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
20 / 59
Datenstrukturen
Beispiel: ArrayList
ArrayList<Integer> liste = new ArrayList<Integer>();
liste.add(23);
liste.add(42);
liste.add(7);
System.out.println(liste.size()); // 3
liste.remove(1);
System.out.println(liste.size()); // 2
System.out.println(liste.get(1)); // 7
System.out.println(liste.indexOf(23)); // 0
System.out.println(liste.indexOf(1212)); // -1
Object[] zahlen = liste.toArray();
liste.clear();
System.out.println( liste.size() ); // 0
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
21 / 59
Datenstrukturen
Beispiel: LinkedList
LinkedList<Integer> liste = new LinkedList<Integer>(); // austauschbar
liste.add(23);
liste.add(42);
liste.add(7);
System.out.println(liste.size()); // 3
liste.remove(1);
System.out.println(liste.size()); // 2
System.out.println(liste.get(1)); // 7
System.out.println(liste.indexOf(23)); // 0
System.out.println(liste.indexOf(1212)); // -1
Object[] zahlen = liste.toArray();
liste.clear();
System.out.println( liste.size() ); // 0
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
22 / 59
Datenstrukturen
LinkedList<Integer> liste = new LinkedList<Integer>();
liste.add(23);
liste.add(42);
liste.add(7);
// Alle Elemente ausgeben
for (int i = 0; i < liste.size(); i++)
System.out.println( liste.get(i) );
Was stimmt hier nicht?
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
23 / 59
Datenstrukturen – Iterator
Übersicht
• java.util.Iterator;
• for-Schleifen über Listen per Indizes schlecht
→ Verkettete Liste: Kann quadratischen Aufwand haben!
ArrayList<Integer> liste = new ArrayList<Integer>();
liste.add(23);
liste.add(42);
liste.add(7);
Iterator<Integer> iter = liste.iterator();
while ( iter.hasNext() )
System.out.println( iter.next() );
// Kurzform:
for (Integer i: liste)
System.out.println( i );
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
24 / 59
Datenstrukturen
Map
Speicherung von Schlüssel-Wert-Paaren
• HashMap
• java.util.HashMap
• Hash-Tabelle mit Schlüsseln
• TreeMap
• java.util.TreeMap
• Suchbaum über Schlüssel
• LinkedHashMap
• java.util.LinkedHashMap
• Wie HashMap, aber speichert auch die Reihenfolge
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
25 / 59
Datenstrukturen
Wichtige Methoden von Maps
put(k, v)
get(k)
remove(k)
clear()
Schlüssel k mit Wert v speichern
Wert von Schlüssel k abfragen
Eintrag für Schlüssel k löschen
Leeren
containsKey(k)
containsValue(v)
Gibt es den Schlüssel k?
Gibt es den Wert v?
isEmpty()
size()
Map leer?
Anzahl der Elemente
keySet()
valueSet()
entrySet()
Menge aller Schlüssel
Menge aller Werte
Menge aller Schlüssel-Wert-Paare
Christian Scheible
Java füretwas
Computerlinguisten
Mengenoperatoren
funktionieren
umständlich.
29. Juli 2009
26 / 59
Datenstrukturen
Beispiel: HashMap
HashMap<String, Integer> alter = new HashMap<String, Integer>();
alter.put("Peter", 20);
alter.put("Hans", 65);
System.out.println( alter.get("Peter") ); // 20
System.out.println( alter.get("Michael") ); // null
for ( Map.Entry entry: alter.entrySet() ) {
System.out.println( entry.getKey() + "\t" + entry.getValue() );
}
// Peter 20
// Hans 65
Funktioniert auch für TreeMap und LinkedHashMap
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
27 / 59
Datenstrukturen
Sets
Mengen funktionieren mit den selben Strukturen wie Maps.
Aber: Assoziiertes Element wird weggelassen.
• HashSet
• java.util.HashSet
• Hash-Tabelle
• TreeSet
• java.util.TreeSet
• Suchbaum
• LinkedHashSet
• java.util.LinkedHashSet
• Wie HashSet, aber speichert auch die Reihenfolge
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
28 / 59
Datenstrukturen
Wichtige Methoden von Mengen
add(e)
remove(e)
clear()
Element e einfügen
Element e löschen
Leeren
contains(e)
isEmpty()
size()
Ist e enthalten?
Menge leer?
Anzahl der Elemente
iterator()
toArray()
Iterator zurückgeben
Umwandlung in Array
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
29 / 59
Datenstrukturen
Beispiel: Sets
Set<Integer> s1 = new Set<Integer>();
Set<Integer> s2 = new Set<Integer>();
s1.add(1);
s1.add(2);
s2.add(2);
s2.add(3)
// Operationen (destruktiv)
s1.containsAll(s2); // menge2 Teilmenge von menge1: false
s1.addAll(s2); // s1 = Vereinigung von s1 und s2
s1.retainAll(s2); // s1 = Schnitt von s1 und s2
s1.removeAll(s2); // Asymmetrischer Schnitt
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
30 / 59
Algorithmen
Übersicht
• Sortieren
• Suchen
• Sonstiges
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
31 / 59
Algorithmen
Sortieren
• java.util.Collections.sort
• Sortiert Listen
(ähnlich zu java.util.Arrays.sort)
• Implementierung: Merge-Sort
List<Integer> zahlen =
Arrays.asList(new Integer[] {15, 4, 8, 23, 42, 16 });
Collections.sort(zahlen); // 4, 8, 15, 16, 23, 42
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
32 / 59
Algorithmen
Sortieren mit selbstgemachtem Vergleich
• Interface: java.util.Comparator
class StringLengthComparator implements Comparator
{
public int compare(Object o1, Object o2)
{
String s1 = (String) o1;
String s2 = (String) o2;
return s1.length() - s2.length();
}
}
List<String> woerter =
Arrays.asList(new String[] {"laenger", "lang", "besonders lang"});
Collections.sort(woerter, new StringLengthComparator());
// "lang", "laenger", "besonders lang"
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
33 / 59
Algorithmen
Suchen
• java.util.Collections.binarySearch
• Binäre Suche
• Voraussetzung: Liste ist sortiert
List<String> zahlen =
Arrays.asList(new Integer[] {4, 8, 15, 16, 23, 42});
Collections.binarySearch(zahlen, 23); // 4
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
34 / 59
Algorithmen
Füllen
• java.util.Collections.fill(list, e)
• Setzt alle Elemente in list auf den Wert e
Kopieren
• java.util.Collections.copy(quelle, ziel)
• Kopiert alle Elemente von der Quell-Liste in die Ziel-Liste
Tauschen
• java.util.Collections.swap(list, i1, i2)
• Vertauscht die Elemente an den Stellen i1 und i2
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
35 / 59
Algorithmen
Umdrehen
• java.util.Collections.reverse(list)
• Dreht die Liste um
Mischen
• java.util.Collections.shuffle(list)
• Mischt list zufällig
Frequenz
• java.util.Collections.frequency(list, element)
• Anzahl der Vorkommen von element in list
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
36 / 59
Nützliche Klassen
• Mathematik
• Zufall
• Dateien
• Datum & Zeit
• Internet
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
37 / 59
Mathematik
Übersicht
• java.lang.Math
(automatisch importiert)
• Sammlung statischer Methoden und Konstanten
• Die meisten Methoden für alle Zahlentypen verwendbar
int i = Math.max(5, 4);
float f = Math.max(5.5, 6.5);
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
38 / 59
Mathematik
abs(x)
sin(x)
cos(x)
tan(x)
log(x)
pow(x, y)
sqrt(a)
max(x, y)
min(x, y)
random()
Betrag
Sinus
Cosinus
Tangens
loge x
xy
√
a
Maximum von x und y
Minimum von x und y
Zufallszahl 0 ≤ z < 1
PI
E
π ≈ 3.14...
e ≈ 2.7182...
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
39 / 59
Zufall
Übersicht
• java.util.Random
• Pseudozufallszahlen
• Wird in Math.random() benutzt
Random generator = new Random();
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
40 / 59
Zufall
Seed
Seed ist Basis für Generierung neuer Zahlen:
Random generator = new Random(9768687);
Typen
int z1 = generator.nextInt(); // 0 <= z1 < Integer.MAX_VALUE
int z2 = generator.nextInt(10); // 0 <= z1 < 10
double z3 = generator.nextDouble();
Gauß-Verteilung
Verteilung mit Erwartungswert 0, Standardabweichung 1:
double g = generator.nextGaussian();
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
41 / 59
Dateiverarbeitung
Übersicht
• IO-Streams: java.io
• Stream:
• Folge von Daten
• Sequenzieller Zugriff:
• Ein Byte nach dem anderen
• Ein Word nach dem anderen
• Eine Zeile nach der anderen
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
42 / 59
Dateiverarbeitung
Testdatei
schloss.txt
Es war spät abends, als K. ankam. Das Dorf lag in tiefem Schnee.
Vom Schloßberg war nichts zu sehen, Nebel und Finsternis umgaben ihn,
auch nicht der schwächste Lichtschein deutete das große Schloß an.
Lange stand K. auf der Holzbrücke, die von der Landstraße zum Dorf
führte, und blickte in die scheinbare Leere empor.
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
43 / 59
Dateiverarbeitung
Byte-Stream einlesen
• java.io.FileInputStream
• Liefert den Inhalt der Datei byteweise
• IOException behandeln!
FileInputStream input = new FileInputStream("schloss.txt");
int b;
while ((b = input.read()) != -1)
{
System.out.print((char) b); //Umwandlung in ein Zeichen
}
Problem: Es war sp~
At abends, als ...
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
44 / 59
Dateiverarbeitung
Character-Stream einlesen
• java.io.FileReader
• Liefert den Inhalt der Datei zeichenweise
• IOException behandeln!
FileReader in = new FileReader("schloss.txt");
int b;
while ((b = in.read()) != -1)
{
System.out.print((char) b);
}
Ausgabe: Es war spät abends, als ...
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
45 / 59
Dateiverarbeitung
Character-Stream ausgeben
• java.io.FileWriter
• Schreibt zeichenweise in eine Datei IOException behandeln!
FileWriter output = new FileWriter("ausgabe.txt");
String text = "Dieser Text kommt in die Datei."
for (char c:text.toCharArray()) {
output.write(c);
}
output.close();
Wichtig: Am Ende immer .close() aufrufen. Sonst können Daten
verloren gehen.
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
46 / 59
Dateiverarbeitung
Zeilenweises Einlesen
• Geht auch mit java.io.FileReader
• Zusätzlich benötigt: java.io.BufferedReader
BufferedReader input =
new BufferedReader(new FileReader("schloss.txt"));
String s;
while ((s = input.readLine()) != null) {
System.out.print(s.trim()); // Zeilenumbruch entfernen
}
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
47 / 59
Dateiverarbeitung
Character
BufferedReader
FileReader
schloss.txt
Strings
Streams können kombiniert werden.
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
48 / 59
Dateiverarbeitung
Zeilenweises Ausgeben
• java.io.FileWriter
• java.io.BufferedWriter
BufferedWriter output =
new BufferedWriter(new FileWriter("ausgabe.txt"));
String z1 = "Zeile 1\n";
String z2 = "Zeile 2\n";
output.write(z1);
output.write(z2);
output.close()
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
49 / 59
Dateiverarbeitung
Scanner
• java.util.Scanner
• Liefert einzelne Wörter
Scanner myScanner =
new Scanner(new BufferedReader(new FileReader("schloss.txt")));
while (myScanner.hasNext())
System.out.println(myScanner.next());
myScanner.close();
Es
war
spät
...
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
50 / 59
Dateiverarbeitung
Puffer
• BufferedReader und BufferedWriter verwenden Puffer zur
Zwischenspeicherung
• Festplattenzugriffe erfolgen nicht genau bei Aufruf von read() oder
write()
• Wir können die Puffer auch weglassen
→ Programm könnte langsamer werden
Scanner
new
Scanner
new
bufferedScanner =
Scanner(new BufferedReader(new FileReader("schloss.txt")));
unbufferedScanner =
Scanner(new FileReader("schloss.txt"));
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
51 / 59
Dateiverarbeitung
Object Stream
• java.io.ObjectInputStream
• java.io.ObjectOutputStream
• Schreibt Objekte in Dateien
→ z.B. Pickle in Python
ObjectOutputStream output =
new ObjectOutputStream(new FileOutputStream("ausgabe.txt"));
Date datum = new Date();
output.writeObject(datum);
ObjectInputStream input =
new ObjectInputStream(new FileInputStream("ausgabe.txt"));
Date datum_in = (Date) input.readObject();
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
52 / 59
Usereingaben
import java.io.*;
class ReadLine{
public static void main(String[] args) throws IOException
{
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
System.out.print("Dein Name: ");
String userName = br.readLine();
System.out.println("Hallo, " + userName);
}
}
InputStreamReader Konvertiert Byte-Streams vom System (z.B. stdin)
zu char-Streams
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
53 / 59
Netzwerk
URL
• java.net.URL
• Zugriff auf Webseiten
URL:
http
| {z }
Protokoll
Christian Scheible
://
www.ims.uni-stuttgart.de/
|
{z
}
Server
Java für Computerlinguisten
| scheibcn/
{z
}
Lokaler Pfad
29. Juli 2009
54 / 59
Netzwerk
URL
• java.net.URL
• Zugriff auf Webseiten
• Bei falschem Aufbau: MalformedURLException
URL imsHomepage = new URL("http://www.ims.uni-stuttgart.de/");
// Relativer Pfad fuer
// http://www.ims.uni-stuttgart.de/institut/anschrift.html.en
URL imsAnfahrt = new URL(imsHomepage, "institut/anschrift.html.en");
URL imsAnfahrt2 = new URL("http://www.ims.uni-stuttgart.de/",
"institut/anschrift.html.en");
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
55 / 59
Netzwerk
URL
URL kann einen Stream erzeugen
URL imsHomepage = new URL("http://www.ims.uni-stuttgart.de/");
BufferedReader in =
new BufferedReader(
new InputStreamReader(imsHomepage.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
56 / 59
Netzwerk
Mehr
• Apache HttpClient: Mehr Möglichkeiten für http-Zugriffe
• Tomcat Webserver
• TCP/UDP-Verbindungen
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
57 / 59
Mehr?
XML-Verarbeitung
• Parser verfügbar als
• DOM
• Push
• Pull
• Verfügbar in java.xml
Datenbanken
• MySQL
• PostgreSQL
• SQLite
• Oracle
• Microsoft SQL
• Microsoft Access
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
58 / 59
Literatur
Eclipse Cheat Sheet.
http://weblogs.goshaky.com/weblogs/lars/resource/eclipse.pdf.
Sun: JDK 6 Documentation.
http://java.sun.com/javase/6/docs/.
Sun: The Java Tutorials.
http://java.sun.com/docs/books/tutorial/.
C. Ullenboom.
Java ist auch eine Insel.
Galileo Press, 2003.
http://openbook.galileocomputing.de/javainsel8/.
Christian Scheible
Java für Computerlinguisten
29. Juli 2009
59 / 59
Herunterladen