Aufgabenstellung

Werbung
Praktischer Teil des Seminars
Gruppe C
 Sebastian Raßmann
 Christian Michele
Aufgabenstellung
•
•
•
•
•
•
•
6 Aufgaben:
DTF vs. DTF max. 5
DL vs. CORI 5
DTF: BM 25 vs. TF.IDF
CORI: nur BM25
nur DTF: c=1 vs. c=0.5
nur DTF: P0=1
Lösung der 6 Aufgaben


Starten der Versuchsreihe über ein Shell
Skript
Verschiedene Parameter erzeugen die
gewünschten Testläufe:
–
–
public ComputeForTopic(double c, double P0,
String usedStemen, int flagDTF)
Dadurch ist war es möglich die gesamte
Aufgabenreihe zu automatisieren
Lösung der 6 Aufgaben
/* Args[0] = c Parameter
* Args[1] = p0 Parameter
* Args[2] = stemen
* Args[3] = maxNumDTF(5),maxNumDTF(10), maxNumDTF()
*/
new ComputeForTopic(
Double.parseDouble(args[0]),
Double.parseDouble(args[1]),
args[2],
Integer.parseInt(args[3]));
}
Aufgabenstellung

Vorbereitung einmalig:
–
–

Indexierung der 24 Kollektionen
Ressource Descriptions erstellen
Für 100 Topics:
–
–
–
Kosten berechnen
Ressource Selection
Retrieval
Allgemeines zu Anfang

Java:
–
–
–

Über 100 Klassen im Package
Sehr unübersichtlich (Navigation im fremden Code)
Benötigte Klassen und Methoden nicht ausreichend
dokumentiert
Aufgabenstellung
–
Es wurde nicht ausreichend klar, was getan werden musste
Allgemeines zu Anfang


Testlauf über 24 Collections mit jeweils 100 Topics
Lösung in Java:
–
Collections:
–
ap88_1a – ap88_8c mit jeweils Topic: 051 – 150
for(int i=1; i<9; i++){
for(int j=0; j<3; j++){
String abc = "";
if(j==0){abc="a";}
if(j==1){abc="b";}
if(j==2){abc="c";}
String coll= „ap88_“+i+abc
for (int h = 51; h<151; h++){
String collNr=h;
if (h<100){ collNr = „0“+h;}
Indexierung

Aufgabenstellung:
–
–
Veränderung der Klasse IndexCollection.java
Aufteilung der Dokumente in




Doc ID
Attribute Name (hier: „Text“)
Attribut Wert (hier: Textinhalt)
Lösung:
–
für jede Collection über einen Tokenizer Aufteilung in die geforderten Parameter
–
CODE:
StringTokenizer st = new StringTokenizer(content, "<>" );
String[] tokens = new String[3];
int i = 0;
tokens[0] = "";
tokens[2] = "";
while (st.hasMoreTokens()){
tokens[i] = st.nextToken();
i++;
}
ir.addToIndex(tokens[0]);
ir.addToIndex(tokens[0],"text",tokens[2]);
Indexierung

aufgetretene Fehler:
–
nach Ablauf der Experimente und unklaren
Ergebnissen durch Nachfrage ergeben, dass bei
der Indexierung ein Fehler aufgetreten ist:
fehlende Gewichtung bei der Indexierung
TF IDF

Aufgabenstellung:
–

TF IDF implementieren
Lösung:
–
in der Klasse TextExpDT.java:

If Bedingung mit STEMEN_TFIDF erweitert um eine neue
Bedingung:
–



rule = Parser.parseRule("maxtf(D,M) :- max(M,TF,{ tf(D,~,TF) }).");
Hier musste das TF im Code durch eine Variable ersetzt
werden, die dann das Präfix enthält
auch das MAXTF musste durch eine entsprechende Variable
ersetzt werden.
Der restliche Code konnte von STEMEN_BM25 kopiert
werden.
TF IDF

aufgetretene Fehler
–
zuerst haben wir die TFIDF und MAXTF nicht als
Variable eingefügt und folgenden Fehler erhalten:
java.sql.SQLException: General error message from server: "Table 'exp_c.tf' doesn't exist"
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1997)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1167)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1278)
at com.mysql.jdbc.MysqlIO.sqlQuery(MysqlIO.java:1224)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2248)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2196)
at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1259)
at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1205)
Starten der Indexierung - Probleme



Starten der Indexierung über Putty.
Starten der Indexierung auf dem Unix Rechnerpool.
Probleme:
–
–

Eine Netzwerkverbindung muss über die gesamte Zeit der
Indexierung vorhanden sein da Putty die Session schließt und alle
Jobs beendet. (Kein Test vom Laptop möglich -> Zeitaufwand!)
Der Unix Rechnerpool ist schwer zu durchschauen Es ist möglich
sich mit royanne auch auf z.B charlotte Server einzulogen.
Es ist schwer zu erkennen, dass auf den Workstations ein
Starten nicht möglich ist:
–
–
–
Fehlermeldung:
Tabellen werden leer erzeugt.
Falsch einloggen: Fehler: die TMP Dateien werden nicht erzeugt.
Retrieval

Aufgabenstellung:
–
–
–

Kosten berechnen
Ressource Selection
Retrieval
Lösung
–
Umschreiben der Klasse ComputeForTopic.java
Kosten berechnen

Implementieren von ComputeCosts
–
–
–
–
–
ursprünglicher Code von Testcollection auf die
24 Collections angepasst
PIRE Object für aktuelle Collection erzeugen
in HashMap die Zuordnung von PIRE auf DL speichern
dann Parameter p0 und c speichern
für jede der 150 Topics nun die Kosten berechnen
PIRE pire = ExpUtils.createPIRE1(coll);
DTFPDatalogConfig config = new DTFPDatalogDefaultConfig("exp_",
pire.getSchema(),
ExpUtils.getDB());
DTFPDatalogRDStorage storage = new DTFPDatalogRDStorage(config);
DTFCostEstimator costEstimator = new DTFRPCostEstimator(storage);
// DL Objekt von aktueller Kollektion betrachten
DL dl = new GenericDL(coll);
dls.add(dl);
dlAufPire.put(dl,pire);
// Parameter setzen
storage.deleteParameters(dl,"parameter('c1','_').");
storage.deleteParameters(dl,"parameter('P0','_').");
storage.storeParameters(dl,"parameter('c1'," + c + ").");
storage.storeParameters(dl,"parameter('P0'," + P0 + ").");
for(int k=51; k<=150; k++){
String topicName = k+"";
if(k<100){topicName="0"+topicName;}
String queryID = topicName;
WSumQuery query = Queries.getWSumQuery(queryID, "text", usedStemen);
// Kosten berechnen
Map costs = costEstimator.estimateCosts(dls, query);
Ressource Selection

Implementieren von ComputeRS
–
–
Ursprünglicher Code von Testcollection auf die 24 Collections angepasst
FlagDTF:
 Flag für die variable Gestaltung der MaxNumDLDTFRS(*) auch hier
für jede der 150 Topics
// Resource selection
RS rs = null;
switch(flagDTF){
case 1: rs = new MaxNumDLDTFRS(5);break;
case 2: rs = new MaxNumDLDTFRS(10);break;
default: rs = new DTFRS();break;
}
PropertyMap cp = new HashPropertyMap();
cp.setDouble("rs.costs.relevance", 1);
ResourceSelection sel = rs.computeSelection(dls, costs, 300, cp);
Retrieval

Implementieren von PerformRetrieval
–
–
–
angepasst an die 24 Collections und für jede der 150 Topics wird der folgende Code
ausgeführt
die Schleife durchläuft die in der Ressource Selection gefundenen DL Objekte und
ermittelt anhand der Hash Map die entsprechenden PIRE Objekte
es wird das Ergebnis des Queries in einer Datei gespeichert
for (Iterator iter = sel.keys(); iter.hasNext();) {
dl = (DL) iter.next();
int numDocs = sel.getNumDocs(dl);
query.setNumDocs(numDocs);
PIRE ir = (PIRE)dlAufPire.get(dl);
List result = ir.getResult(query);
// TODO: ausgabedatei individuell gemacht
TRECResult.writeResult(
new File("result_c_"+c+"_p0_"+P0+"_"+topicName+"_"+usedStemen),
queryID,
result,
true);
}
Probleme

Beim Erzeugen der
ComputeForTopic.java sind folgende
Probleme aufgetreten:
–
Das erzeugte PIRE Objekt wird zwar in einer Hash Map
gespeichert, aber beim Kosten berechnen wird nur jeweils
ein PIRE Objekt verwendet; für eine Liste von DL Objekten
 Sinn??
–
Sinnvolles Speichern der Datei ? (viele Schleifendurchläufe
notwendig)
Weitere Probleme

Weitere Probleme hatten wir leider mit der
Linux Umgebung
–
–
–
–
–
–
Befehle der Shell sind/waren uns unbekannt
Zusammenhang Java – SQL Datenbank
Prozess / Java Prog. (nicht) erfolgreich?
Hilfe von Kollegen mit Shell Skript, dadurch aber neu Probleme
(Rechte, Fehlermeldungen)
Speicherort
Datenmenge (140 MB und das nur für einen Aufgabenteil)
Herunterladen