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)