ASDL:Reasoning-Agent

From Wiki

Jump to: navigation, search

Endbericht des ASDL-Projekts
Inhaltsverzeichnis | Hauptseite des ASDL-Projekts

4.1 Observer-Agent <<<<< | 4.2 Reasoning-Agent | >>>>> 4.3 Datenbank

Bild 1: Aufbau des Reasoning-Agenten
Bild 1: Aufbau des Reasoning-Agenten
Bild 2: Klassendiagramm des Reasoning-Agenten
Bild 2: Klassendiagramm des Reasoning-Agenten

Contents

Aufgabe des Agenten

Der Reasoning-Agent konstruiert aus den vom ersten Agenten geschickten Kontextdaten einen Case und berechnet die ähnlichsten Cases. Dann schickt er an den Output-Agenten (dritter Agent) die AvailableSuggestions-Nachricht. Wenn er dann die GetSuggestions-Nachricht vom dritten Agenten erhält, werden die Suggestions mit den Kontextdaten an ihn verschickt. Bekommt er die AcceptedSuggestion-Nachricht, wird der daraus resultierende Case in der DB abgespeichert. Die DB wird nur wieder komplett eingelesen, wenn sich neue Daten in ihr befinden oder der Reasoning-Agent neu gestartet wird.

"contextdata"-Nachricht

Der Reasoning-Agent empfängt die Kontextdaten vom Observer-Agenten. Jetzt können die ähnlichsten Fälle berechnet werden. Diese werden beim Erzeugen des Requests aus der Datenbank eingelesen und durch die Klasse Case repräsentiert und im Reasoning-Agenten abgespeichert. Die Datenbank braucht allerdings nur neu eingelesen werden, wenn entweder die Agenten neugestartet werden oder sich der Inhalt der DB geändert hat. Dazu existiert im Agenten die boolesche Variable databaseHasChanged, die immer dann auch auf true gesetzt wird, wenn sich an der DB etwas ändert oder die Agenten neugestartet werden.

Die Case-Klasse kann sich mithilfe der ResultSets (rsCases, rsDLList etc.) konstruieren:

Case c = new Case(rsCases, rsDLList, rsTerms, rsAuthors, rsConferences, rsJournals);

Die Konstante similarCasesCount gibt an, wieviele ähnliche Fälle bzw. Suggestions berechnet werden sollen. Zur Zeit sind 20 eingestellt. Da es aber nur 12 verschiedene Suggestions gibt, werden natürlich auch nur 12 vorgeschlagen. Doppelte Vorschläge werden bereits automatisch herausgefiltert. Nachdem die ähnlichsten Cases berechnet sind, wird die suggestionsavailable-Nachricht an den Output-Agenten verschickt.

Performative: TELL (3)
From: ASDLReasoner
To: ASDLOutput
Request: senAnswer#1a.-46b4b6c6:10c87c25ab4:-7fee@ea192.168.1.4:5678#ASDLObservation@SEN2
Message:
<availablesuggestions count="12" useragentid="$*0-10c87c13b3f@DaffodilMTA"
 sessionid="4.-2c57cac4:10c87b03628:-7ffd@UA"/>

Die Kontextdaten und die Suggestions werden im Agenten zwischengespeichert.

"getsuggestions"/"suggestions"-Nachrichten

Wenn der Agent die "getsuggestion"-Nachricht bekommt, werden die zwischengespeicherten Suggestions, d.h. ihre IDs, und die Kontextdaten an den dritten Agenten verschickt. Zuvor werden noch aus der Datenbank die Lang- bzw. Kurzerklärung zur passenden Sprache ausgelesen. Diese Information befindet sich in der eingetroffenen Nachricht. Ist die angeforderte Sprache nicht in der DB vorhanden, wird standardmäßig Englisch ausgewählt.

Performative: ASK (2)
From: ASDLOutput
To: ASDLReasoner
Request: 1d.-46b4b6c6:10c87c25ab4:-7feb@ea192.168.1.4:5678
Message:
<getsuggestions sessionid="4.-2c57cac4:10c87b03628:-7ffd@UA"
useragentid="$*0-10c87c13b3f@DaffodilMTA" language="de"/>
<suggestions useragentid="$*0-10c87c13b3f@DaffodilMTA" sessionid="4.-2c57cac4:10c87b03628:-7ffd@UA">
<contextdata>...</contextdata>
<suggestion weight="0.17250001" id="3" 
class="de.unidue.daffodil.asdl.suggestions.BrowseConferencesSuggestion">
<text>In Konferenzen suchen</text><explanation>hr Suchergebnis ist 
möglicherweise nicht zufrieden stellend. Versuchen Sie einen Themenüberblick 
oder einen neuen Suchansatz zu bekommen, indem Sie in Konferenzen suchen. 
Die am häufugsten extrahierte Konferenz ist "%".</explanation>
</suggestion>
<suggestion weight="0.24285714" id="2" class="">
<text>Finden Sie einen spezielleren Suchbegriff</text>
<explanation>Ihre Suche hat zu viele Ergebnisse. Fügen Sie einen spezielleren 
Suchbegriff hinzu. Hilfestellung: Im Thesaurus einen Unterbegriff wählen.</explanation>
</suggestion>
<suggestion weight="0.18461539" id="1" 
class="de.unidue.daffodil.asdl.suggestions.AddTermToFreetextSuggestion">
<text>Häufigster extrahierter Term der Freitext-Suche hinzufügen</text>
<explanation>Ihre Suche hat möglicherweise zu viele Ergebnisse. Fügen 
sie den am häufigsten extrahierten Begriff der Freitextsuche hinzu ("%").</explanation>
</suggestion>
</suggestions>

"acceptedsuggestion"-Nachricht

Wenn der Agent die acceptedsuggestion-Nachricht erhält, kann die mitgelieferte Suggestion-ID in die Datenbank abgespeichert werden. Der dazugehörige Case wird aus den Kontextdaten der Nachricht konstruiert.

<acceptedsuggestion id="7"><contextdata>...</contextdata></acceptedsuggestion>

Da ein anderer Reasoning-Request erst wieder die Fremdschlüssel berechnen darf, wenn der aktuelle Request einen Case fertig abgespeichert hat, ist das Abspeichern für diese Zeit mit Hilfe der in Java 5.0 verfügbaren Semaphoren blockiert:

public static final Semaphore DB_ACCESS = new Semaphore(1,true);
...
...
...
try {
      //
	ReasoningRequest.DB_ACCESS.acquire();
      // -neue Fremdschlüssel bestimmen
      // -Fall in DB speichern
    }
catch(InterruptedException e){
    //
} finally {
    ReasoningRequest.DB_ACCESS.release();
}

Sonst könnten zwei verschiedene Requests denselben neuen Fremdschlüssel erhalten. Das würde genau dann passieren, wenn Request 1 bereits die calculateNewMaxID()-Methode abgeschlossen, aber nocht nichts vollständig abgespeichert hat. Request 2 würde dann ebenfalls denselben Wert wie Request 1 erhalten.

Die Case-Klasse

Die Klasse Case ist dazu da, einen aktuellen Fall zu repräsentieren. Ein Case kann entweder aus den ResultSets der DB oder aus den Kontextdaten, die als Document vorliegen, erzeugt werden. Außerdem kann die Methode toContextDataXML() den Case wieder zu Kontextdaten machen, die man dann wieder leicht in eine Nachricht packen kann.

Jeder Case besitzt ein Ähnlichkeitsmaß, das es ermöglicht durch die compare()-Methode die Ähnlichkeit zu einem anderen Case zu bestimmen.

Das Ähnlichkeitsmaß

Das Ähnlichkeitsmaß liefert Werte zwischen 0 und 1, wobei 0 bedeutet, daß die beiden Cases absolut unähnlich sind und eins, daß sie gleich sind. Das Ähnlichkeitsmaß ermöglicht es, durch die compare()-Methode die Ähnlichkeit zu einem anderen Case zu bestimmen. Hierzu wird für die Werte Author, Title, Freetext, Year der Suchanfrage, die DL-List und den extrahierten Autoren, Termen, Konferenzen, Journalen das Kosinusmaß berechnet.

Kos(a,b) = a*b / |a|*|b|   mit a,b Vektoren

Einfache Integer-Werte wie die Anzahl der Suchergebnisse werden wie folgt berechnet:

similarity(a,b) = min(a,b)/max(a,b)

Danach werden alle Werte mit einem Gewichtungsfaktor multipliziert und dann durch die Summe der Gewichtungen geteilt.

private final int[] weight = {1,1,1,1,1,1,1,1,1,3,1,1}

Als eine gute Einstellung hat sich bewährt, die 1 überall zu belassen und das Gewicht der Trefferanzahl auf 3 zu setzen. Allerdings besteht wohl noch Raum für das Finden einer noch besseren Einstellung, was aber wohl eine für unser Projekt zu große Evaluationsphase benötigen würde.

Fazit

Da der Reasoning-Agent, nicht nur mit XML-Nachrichten umgehen musste, sondern auch mit der Datenbank, war einiges Wissen darüber gefragt. Glücklicherweise beinhaltete die Gruppe, die den Agenten entwickelt hat, jemanden, der sich mit Datenbanken recht gut auskennt. Außerdem konnte bereits auf Erfahrungen des ersten Agenten zurückgegriffen werden.


4.1 Observer-Agent <<<<< | 4.2 Reasoning-Agent | >>>>> 4.3 Datenbank

Personal tools