ASDL:Handbuch für das ASDL-Tool
From Wiki
Endbericht des ASDL-Projekts
Inhaltsverzeichnis | Hauptseite des ASDL-Projekts
Contents |
Anpassen der Anzahl der Vorschläge im Tool
Der Reasoning-Agent generiert eine Liste von Vorschlägen zur Suchunterstützung, welche nach ihrer vermuteten Brauchbarkeit/Nützlichkeit für den konkreten Fall „geranked“ sind. Im Normalfall wird diese Liste eher kurz gehalten sein, um den Anwender nicht mit einer Flut der Vorschläge zu überlasten – aber lang genug, dass sicher ein brauchbarer Vorschlag dabei ist. Da eine optimale Länge der Liste ohne Evaluierung nicht zu bestimmen ist, ist die des ASDL-Tools (im Auslieferungszustand) 20 Elemente lang. Da z.Z. nur 12 Vorschläge vorhanden sind, werden immer alle 12 geliefert.
Um die Zahl der Vorschläge zu ändern, ist eine Modifizierung im ReasoningRequest notwendig. Der Wertprivate int simCasesCount = 20;steuert die Zahl der Vorschläge (hier 20).
Anpassen des Ähnlichkeitsmaßes
Neues Ähnlichkeitsmaß hinzufügen
Der Case-Klasse kann ein neues Ähnlichkeitsmaß hinzugefügt werden. Die neugeschriebene Klasse muß das Interface SimilarityMeasure implementieren. Die Klasse Case hat eine statische Methode setSimilarityMeasure(SimilarityMeasure sm), mit der man ein neues Ähnlichkeitsmaß setzen kann.
Gewichtung im Standardähnlichkeitsmaß (Kosinusmaß)
Das Ranking der Vorschläge geschieht über eine Berechnung mittels Kosinusmaß, wobei einzelne Parameter miteinander "verrechnet" werden. Man kann den Parametern unterschiedliches Gewicht geben: Stellt man fest, das die Zahl der "hits" 3 mal so wichtig ist wie alle anderen Parameter, dann passt man die Gewichtung im StandardSimilarityMeasure entsprechend an, indem man aus der 10ten Eins eine Drei macht.
public class StandardSimilarityMeasure implements SimilarityMeasure { /** * Reihenfolge: author[0], title[1], freetext[2], year[3], dllist[4], * extrAuthor[5], extrTerms[6], extrConferences[7], extrJournals[8], * hits[9], operators[10], answeringtime[11] */ private final int[] weight = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
Gewichtung der generischen Cases
Die Startdatenbank enthält eine gewisse Zahl von Fällen (s. generischen Cases), damit der CBR-Zyklus anfangs arbeiten kann. Diese Fälle haben einen speziellen Parameterwert "Egal" der in die Berechnung des Rankings mit einfließt. Der Wert wurde bewusst nicht zu hoch gewählt, damit diese Startfälle mit der Zeit von tatsächlich aufgetretenen Fällen überlagert werden. Ist das nicht gewünscht, ist der Wert im StandardSimilarityMeasure dementsprechend zu erhöhen.
/** * Gibt den Ähnlichkeitswert für den $ bzw. -1 in der DB stehen. */ private final float genericValue = 0.15f;
Änderung der Datenbasis
Hinzufügen eines Cases halbautomatisch
Ist die Datenbasis zu erweitern, z.B. um eine neue Suggestion zu unterstützen, müssen auch weitere Fälle einfügt werden. Ein pragmatischer Ansatz ist, eine Suche zu starten und einen beliebigen Vorschlag anzunehmen und als gut zu bewerten. In der Datenbank-GUI sind nun einfach in der Tabelle ASDL_Cases die Suggestion_ID des entsprechenden Cases durch die ID Ihrer neuen Suggestion auszutauschen. Für Entwicklungszwecke nun die exakt gleiche Suche nochmals starten. So bekommt man die neue Suggestion sehr hoch geranked. Für den Produktivbetrieb hinterher ist dieses Vorgehen nicht zu gebrauchen, da mit großer Wahrscheinlichkeit keine hinreichende Ähnlichkeit zwischen dem "Entwicklungs-Case" und dem tatsächlichem Case des Benutzers (für den die neue Suggestion passend wäre) besteht. Um diese Ähnlichkeit zu erhöhen, ist es ratsam den "Entwicklungs-Case" in einem generischen Case zu überführen. Unter Umständen sind mehrere generische Cases für die gleiche Suggestion sowie eine Anpassung des Wertes für den Parameters "Egal" sinnvoll.
Hinzufügen eines Cases
Im folgenden wird aufgezeigt, wie man einen neuen Case per Hand hinzufügt. Dieses (umständliche) Verfahren sollte nicht zur Nachahmung anspornen, sondern vielmehr aufzeigen wie die Datenbank "im Inneren" funktioniert.
Wichtig: Es ist dafür zu sorgen, dass im Bearbeitungszeitraum keine Cases als gut bewertet werden! Dies würde zu einer Vermischung der IDs und damit zu einer Inkonsistenz in der Datenbasis führen.
Man muss eine noch nicht verwendete Case-ID bestimmen. Da diese (Integer-)Zahl möglichst fortlaufend sein soll, kann man am besten die nächste freie oder eine (auch nicht in den Untertabellen) nicht mehr verwendete ID verwenden. Dann legt man mit Hilfe der der Datenbank-GUI einen neuen Case in der Tabelle ASDL_Cases an und füllt die restlichen Spalten der Tabelle aus. Was die Inhalte der Spalten sind, zeigt der Abschnitt Datenbank (das gilt auch für alle folgenden Tabellen). Die Werte aus der Suchanfrage sind mit einem Leerzeichen getrennt, z.B. "kriewel sascha fuhr norbert", wenn die Autoren der Anfrage "Sascha Kriewel" und "Norbert Fuhr" waren. Die Reihenfolge spielt dabei keine Rolle, so sind "fuhr norbert sascha kriewel" und "kriewel fuhr sascha norbert" gleichbedeutend. Die Antwortzeit wird in Millisekunden gemessen. Der Timestamp ermöglicht es, eine zeitliche Reihenfolge der Cases zu ermitteln. Alle anderen Zahlenwerte sollten Integerwerte sein. Nun müssen die IDs für die Spalten DLList_ID und Extractedterms_ID mit dem gleichen Verfahren wie für Case_ID in den jeweiligen Tabellen bestimmt werden. Abschließend muss noch ein Timestamp, sowie eine zum Case passendende (und in der Tabelle ASDL_Suggestions vorhandene) Suggestion_ID hinzugefügt werden.
Es ist (mind.) ein Eintrag in der Tabelle DLList passend zu Ihrer DLList_ID mit den entsprechenden Werten zu erstellen. Es muss (genau) ein Eintrag in der Tabelle Extractedterms mit der entsprechenden Extractedterms_ID eingefügt werden. Alle anderen IDs in der Tabelle bestimmt man mit bekanntem Verfahren. Sollten man immer die gleiche ID (für einen Case) ermitteln, ist das kein Fehler! Abschließend ist dafür zu sorgen, dass in den Tabellen der entsprechenden Tools (mind.) ein Eintrag mit der entsprechenden ID und den nötigen Werten eingefügt wird.
Entfernung eines schlechten Cases
Sollten es notwendig werden, einen Case zu entfernen, muss analog wie bei der Anlage verfahren werden (nur mit Löschen statt Anlegen). Da dies sehr aufwendig ist, kann ein Case auch durch diese Methode im ResoningRequest gelöscht werden.
public void wartungCaseLoeschen(int caseID)
Ist es gewünscht, mehrere Cases zu löschen (z.B. aufgrund von viel "falschem" Benutzer-Feedback), dann ist eine Löschung mittels Datenbank-GUI angeraten. Zur Orientierung für diesen Fall hilft ein Blick in den Anhang und der Hinweis, dass die Cases einen Timestamp haben.
Fallbeispiel: Neue Suggestion hinzufügen
Suggestion
Eine neue Suggestion muss in die Tabelle ASDL_Suggestion eingetragen werden. Ein solcher Eintrag besteht aus einer Suggestion-ID (Suggestion_ID), der Sprache ("Language", z.B. "de"), einer Kurzerklärung ("TipText") und einer Langerklärung ("Explanation"). Für jede Suggestion muss so ein Eintrag in mindestens englischer Sprache vorhanden sein.
Zugehöriger Case/Generic Case
Damit die neue Suggestion auch vorgeschlagen werden kann, muss in der DB ein mindestens ein Case mit dieser Suggestion-ID eingetragen sein. Hierbei kann man auch Elemente eines generischen Falls nutzen. Sinnvollerweise sollte ein solcher Case sehr ähnlich zu einer Situation sein, in der diese Suggestion sinnvoll ist.
Ausführbare Suggestion
Wenn eine Suggestion ausführbar sein soll, muss für die Funktionalität eine eigene Klasse implementiert werden. Im Projekt ASDL gibt es einen Unterordner "src", und hier ein Package namens "de.unidue.daffodil.asdl.suggestions". Hier sind alle bisherigen Suggestions abgelegt. Neue Suggestions sollten also auch hier gespeichert werden. Die neue Suggestion muss nun von der Klasse Suggestion abgeleitet werden, damit alle hier implementierten Funktionen auch in der neuen Suggestion verfügbar sind. Hier sei insbesondere auf die Methode "isExecutable" hingewiesen, denn diese muss true zurückliefern, damit der Vorschlag dann später als ausführbar angezeigt wird und ausgeführt werden kann.
Wie eine solche Suggestion aussehen kann, zeigen wir exemplarisch an der "AddCurrentYearToQuerySuggestion", die der aktuellen Suche das aktuelle Jahr hinzufügt.
/** * Fügt das aktuelle Jahr zur Suchanfrage hinzu. * * @author Jan Engler * */ public class AddCurrentYearToSearchSuggestion extends Suggestion { public AddCurrentYearToSearchSuggestion() { } public AddCurrentYearToSearchSuggestion(Element sugg, Element context) { super(sugg, context); } private String year = ""; public void initialize(Element sugg, Element context) { super.initialize(sugg, context); GregorianCalendar cal = new GregorianCalendar(); cal.setTimeZone(TimeZone.getTimeZone("ECT")); year = String.valueOf(cal.get(Calendar.YEAR)); } @Override public void execute() { ToolController tc = ToolController.getInstance(); SearchTool searchTool = (SearchTool) tc.getTool(SearchTool.class); if (searchTool != null) { searchTool.addToQuery(new SimpleDataTransfer(year, "term", year), 31); searchTool.search(); // notify change of query NotifyQueryChanged n = new NotifyQueryChanged(this, ToolController.getInstance().getSessionId(), Integer.toString(DQueryRegistry.YEAR), this.getClass().getName(), year); n.dispatchYourSelf(); } super.execute(); } public boolean isExecutable() { return true; } }
Wie man sehen kann, ist die Hauptfunktionalität der Vorschläge in der überschriebenen "execute"-Methode verwirklicht. In der initialize(Element sugg, Element context)-Methode muss mit super.initialize(sugg, context) die Methode aus der Oberklasse aufgerufen werden, denn hieraus werden die Variablen "explanation", "text", "id" und "weight" ausgelesen, die dann nachher im eigentlichen Tool angezeigt werden.
Wie oben schon angedeutet, wird die eigentliche Funktionalität in der execute-Methode programmiert. Da neue Vorschläge sehr vielfältiger Natur sein können, kann an dieser Stelle nur darauf hingewiesen werden, dass die Zeilen
ToolController tc = ToolController.getInstance(); SearchTool searchTool = (SearchTool) tc.getTool(SearchTool.class);
eine Referenz auf das Searchtool in eine Variable "searchTool" speichern, und damit addressierbar machen.
Als letztes muss der Klassename und die Suggestion-ID der ausführbaren Suggestion in der Datenbank in der Tabelle SuggestionClass eingetragen werden, also z. B.
1 | de.unidue.daffodil.asdl.suggestions.AddCurrentYearToSearchSuggestion
