3. Praktische Aufgabe: Indexer
Bearbeitungszeit: 2 Wochen |
Ausgabe: 26.06.08 |
Abnahme: 10.07.08 |
Die letzte Programmieraufgabe beschäftigt sich mit der Speicherung und Abfrage der durch Crawler und Lexer extrahierten Informationen. Dazu wird eine vereinfachte Datenbank verwendet, die über eine entsprechende Schnittstelle die Indizierung von features der Dokumente anbietet. Gespeichert werden pro Dokument die gefilterten Wortstämme mit ihrer entsprechenden Termgewichtung:
- Wortstamm des Features
- RTF Gewicht (relative Termhäufigkeit) des Features im Dokument
Die Speicherung und Indexierung weiterer Informationen (extrahierte Links aus den Dokumenten, Wörter und deren Positionen im Text des Dokuments) ist optional.
Zur Beantwortung von Suchanfragen soll ein einfacher Query Prozessor auf dem indizierten Datenbestand implementiert werden. Der Query Processor verarbeitet Suchanfragen in der einfachen Syntax und gibt top-10 Rangliste der besten Treffer, sortiert nach dem vorgegebenen Relevanz-Kriterium, zurück.
Die Anfrage, die der Query Prozessor verarbeiten soll, besteht aus positiven und auszuschliessenden Suchbegriffen, getrennt durch Leerzeichen (d.h ein Treffer soll passende Features zu allen positiven Wörtern enthalten und darf keine Negativ-Features enthalten). Man kann davon ausgehen, dass jede Query mindestens einen 'positiven' Suchbegriff enthalten soll.
Der Query Prozessor soll:
- die Anfrage analysieren (z.B. Sonderzeichen entfernen, String.toLowerCase() anwenden, etc.) und einzelne Suchbegriffe extrahieren;
- Stoppwörter aus der Query entfernen;
- die restlichen Keywords in Wortstämme mit Hilfe des Stemmers umwandeln;
- die Anfrage auf eine SQL-Query abbilden und diese auf der Datenbank ausführen;
- die Top-10 der Trefferliste (URLs der gefundenen Dokumente) sortiert nach Relevanz zurückgeben;
Format der Suchanfrage:
[-]key_1 [-]key_2 ... [-]key_n mit:
key - Treffer soll den Wortstamm des Suchbegriffs enthalten.-key - Treffer darf den Wortstamm des Suchbegriffs nicht enthalten.Mögliche Beispiele einer Query:
- Anfrage "retrieval course": Dokument soll Wörter "retrieval" UND "course" (bzw. ähnliche Wörter mit gleichen Wortstämmen) enthalten.
- Anfrage "FOOTBALL germany -turkey": Dokument soll passende Features zu "football" UND "germany" enthalten, Wortstamm von "turkey" darf NICHT vorkommen.
Als Relevanzmaß (Ähnlichkeit) verwenden wir den Kosinus-Maß zwischen dem Query-Vektor und dem Featurevektor des Dokuments. Die Query wird in unserem Modell durch den Vektor ihrer Positiv-Features (jeweils mit Gewicht 1.0) dargestellt, für die Gewichtung der Features in den Dokumenten soll tf*idf Maß benutzt werden. Die Negativ-Features der Query werden bei der Berechnung der Relevanz nicht berücksichtigt.
Der Query-Prozessor soll als Ergebnis die URLs der Top-10 Treffer, absteigend sortiert nach Relevanz, zurückgeben. Bei sehr selektiven Anfragen, die insgesamt weniger als 10 Treffer finden, ist die Ergebnisliste entsprechend kleiner.
Die Lösung soll die Pflichtklasse
public class IRIndex implements IRIndexInterface {
...
}
enthalten, die die vorgeschriebene Funktionalität nach Vorgaben des Interfaces IRIndexInterface realisiert.
public interface IRIndexInterface {
void addFeature(String document, String feature, double weight);
java.util.List answerQuery(String query);
}
Der Aufwand kann durch die Verwendung der Indexierungs- und Retrieval-Funktionalität von Lucene (bzw. einer Datenbank Ihrer Wahl) wesentlich reduziert werden.
Verbinden sie den Indexer mit dem Crawler und dem Parser und testen Sie die korrekte Funktionsweise, indem Sie einige Dokumente crawlen und Testanfragen an das System stellen.
Kontakt