• Keine Ergebnisse gefunden

Implementation eines Rankingverfahrens in Perl - Dokumentation und Evaluation -

N/A
N/A
Protected

Academic year: 2023

Aktie "Implementation eines Rankingverfahrens in Perl - Dokumentation und Evaluation -"

Copied!
24
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Implementation eines Rankingverfahrens in Perl - Dokumentation und Evaluation -

Hausarbeit zum Blockkurs

” Information Retrieval“

Wintersemester 2004/2005

Seminarleitung: Prof. Dr. Klaus U. Schulz

Verfasserinnen:

Michaela Geierhos, Susanne O’Shaughnessy, Andrea Stubbe

Centrum f¨ur Informations- und Sprachverarbeitung LMU M¨unchen

19. Dezember 2004

(2)

Inhaltsverzeichnis

1 Dokumentation zu ranking.perl 1

1.1 Wie benutzt man es? . . . 1

1.1.1 Installation des Programms . . . 1

1.1.2 Einige Worte zur Handhabung . . . 2

1.2 Wie funktioniert es? . . . 3

1.2.1 Das langsamere snailIndexing(). . . 3

1.2.2 Das schnelle fastIndexing() . . . 4

1.2.3 Auf dem Weg zum invertieren File . . . 5

1.2.4 Das effiziente postingFileRanking(). . . 5

1.2.5 Das schnellere invertedFileRanking() . . . 6

1.2.6 Eine weitere Anfrage mit inputNewQuery() . . . 7

1.2.7 Stemming mit dem Modul porter.pm. . . 7

1.2.8 Das Hauptprogramm . . . 8

2 Evaluation des IR-Systems 9 2.1 Die vier Anfragen . . . 9

2.2 Precision, Recall und Fallout . . . 9

2.3 Precision bei Standardrecallwerten . . . 11

A Der Quellcode von ranking.perl 13

B Der Quellcode von evaluate.perl 20

i

(3)

Kapitel 1

Dokumentation zu ranking.perl

1.1 Wie benutzt man es?

1.1.1 Installation des Programms

Da es sich um ein Betriebssystem unabh¨angiges Programm handelt, das bereits auf Windows XP und Unix getestet wurde, ist es nur erforderlich Perl ab der Version 5.8.0 installiert zu haben.

Desweiteren sollten folgende Perl Module zur Verf¨ugung stehen:

POSIX

locale

Getopt::Std

Storable

File::Path

Data::Dumper

Zur Ausf¨uhrung des Programms ranking.perl sollte man sich die erforderlichen Dateien lokal auf seine Festplatte kopieren.

Dazu muss man lediglich ein Verzeichnis auf seinem PC anlegen und die Daten der beige- legten CD-ROM1 in dieses Verzeichnis transferieren. Allerdings ist es empfehlenswert die Struktur der Daten beizubehalten.

Somit hat man nun alles so installiert, dass man problemlos mitranking.perlarbeiten kann.

1Die CD-Rom befindet sich am Ende des Evaluationsteils.

1

(4)

1.1.2 Einige Worte zur Handhabung

Das Programm sucht innerhalb einer (selbst gew¨ahlten) Dokumentensammlung diejenigen Dokumente aus, die zur gestellten Anfrage passen, d.h. dieser Anfrage am ¨ahnlichsten sind.

Beim Aufruf des Programms m¨ussen eine Abfrage -q und das Verzeichnis, in dem die zu durchsuchenden Dokumente liegen (-d) angegeben werden.

Optional kann man zus¨atzlich eine eigene Stoppwortliste angeben (-s) und/oder bestimmen, wie viele Treffer h¨ochstens ausgegeben werden sollen (-l), sowie auf gestemmten Texten mit gestemmten Anfragen arbeiten (-p).

Diese Anwendungsweisen lassen sich auch durch Eingabe von -h in der Hilfe anzeigen.

Mit Angabe der Option -v druckt das Programm seine Versionsnummer aus.

Nach der Ausgabe der Treffer k¨onnen noch beliebig viele neue Anfragen gestellt werden.

Durch die Eingabe von q wird das Programm beendet.

(5)

KAPITEL 1. DOKUMENTATION ZU RANKING.PERL 3

1.2 Wie funktioniert es?

Anfangs wird in createStopHash() ein Stoppworthash erzeugt, der jeweils als Key ein Stoppwort und als Value 1 hat.

Anschließend wird in der Subroutine choosingMethod() eine von zwei Arten ausgew¨ahlt, Indexing und Ranking durchzuf¨uhren:

1. Bei ¨uber 8000 Dokumenten geschieht das mit Hilfe vonsnailIndexing(), also langsa- mer Indexierung. Dabei werden bei der Indexierung der Dokumentenbasis Postingfiles in Form von Dateien angelegt, da bei so vielen Dokumenten der Arbeitsspeicher eines durchschnittlichen Computers ¨uberfordert w¨are. Dadurch wird das Verfahren verlang- samt. Das Ranking geschieht dann mittels postingFileRanking().

2. Bei einer kleineren Anzahl von Dokumenten wird eine schnellere Indexierungsmethode (fastIndexing()) verwendet. Diese Methode nutzt den Arbeitsspeicher des Compu- ters, um einen virtuellen Index aufzubauen. Hier ist danach invertedFileRanking() f¨ur das Rankingverfahren zust¨andig.

Durch diese Aufspaltung wird die Ausf¨uhrungszeit des Programms f¨ur eine beliebige Zahl von Dokumenten (mehr als zehntausende wurden bis jetzt nicht getestet) optimiert.

1.2.1 Das langsamere snailIndexing()

Nach dem ¨Offnen des Verzeichnisses wird in einer Schleife jedes Dokument zun¨achst mit der Subroutine getDocText($) als ein String in der Variable $text gespeichert. Anschließend wird mit Hilfe von createTermFrequencyHash($) Wort f¨ur Wort in den Hash %tmp freq geschrieben.

(6)

Dieser enth¨alt die W¨orter (mit Ausnahme der Stoppw¨orter) des gerade gelesenen Dokuments, sowie deren H¨aufigkeit.

Um Probleme mit Groß- und Kleinschreibung zu vermeiden (d.h. eventuell mehrfache Eintr¨age f¨ur das gleiche Wort), werden in %tmp freq alle W¨orter nur in Kleinschreibung eingetragen.

Mit Hilfe dieses Hashes kann man nun Postingfiles anlegen bzw. erweitern:

In einer Schleife wird jedes Wort$itemim Hash durchlaufen (also alle Keys). Zun¨achst wird ein neuer, leerer Hash %item hashangelegt. Wenn schon ein Postingfile f¨ur $item existiert, werden die Informationen mit retrieveaus dieser Datei geholt und an %item hash¨uberge- geben. Anschließend wird %item hash um den aktuellen Dokumentnamen als Key und die H¨aufigkeit von $item als Value erweitert.

War vorher kein Postingfile f¨ur das Wort vorhanden, dann ist dies der einzige Eintrag im Hash. Danach wird der Inhalt von %item hash wieder in das Postingfile gespeichert, das ggf. neu angelegt wird.

Im n¨achsten Schleifendurchlauf wird der Hash wieder geleert.

Diese Schleife ¨uber die Keys von %tmp freq dient außerdem dazu, f¨ur jedes Dokument

$tf max, also die maximale Term Frequency, zu bestimmen, die f¨ur sp¨atere Berechnungen ben¨otigt wird. Dazu wird zus¨atzlich ein Hash %tfmax angelegt, der f¨ur jedes Dokument den Wert von $tf max speichert.

Nachdem dieser Vorgang beendet ist, wird der Inhalt von %tmp freq wieder gel¨oscht, bevor zum n¨achsten Dokument gegangen wird. Es wurde f¨ur jedes Wort ein Postingfile (in diesem Fall eine Datei) angelegt, in dem man nachlesen kann, wie oft und in welchen Dokumenten das entsprechende Wort auftritt.

Damit hat das snailIndexing() seine Aufgabe erf¨ullt, und die Dokumente werden in postingFileRanking() gerankt.

1.2.2 Das schnelle fastIndexing()

Nach dem ¨Offnen des gew¨ahlten Verzeichnisses wird, analog zumsnailIndexing(), in einer Schleife f¨ur jedes Dokument der Wort-H¨aufigkeits-Hash %tmp freq erstellt, und nach Ge- brauch wieder gel¨oscht.

Jedes Wort in%tmp freqwird zusammen mit dem aktuellen Dokument der while-Schleife so- wie seiner H¨aufigkeit in diesem Dokument in das Array @doc freqgepusht. Daraufhin wird die maximale Term Frequency $tf max f¨ur das Dokument ermittelt und im Hash %tfmax zusammen mit dessen Namen gespeichert.

(7)

KAPITEL 1. DOKUMENTATION ZU RANKING.PERL 5 Anschließend wird die Subroutine createInvertedFile() aufgerufen, die aus @doc freq das invertierte File erstellt.

1.2.3 Auf dem Weg zum invertieren File

Die Erzeugung eines invertierten Files geschieht mit createInvertedFile().

Das Array @doc freq wird in einer Schleife durchlaufen. Hierbei werden jeweils drei aufein- anderfolgende Eintr¨age den Skalaren $key, $value1 und $value2 zugewiesen, so dass das jedes Tripel von @doc freq, bestehend aus Wort, Dokumentname und Vorkommensh¨aufig- keit den Variablen zugeordnet wird. An den Hash %inv hash wird als Value f¨ur $key ein Array aus den Werten von $value1und $value2 angeh¨angt.

Mit dem Befehl store wird %inv hash in der Datei $inv file als Referenz der Daten- struktur abgelegt, damit man sp¨ater mit retrieve wieder einfach darauf zugreifen kann.

Abschließend wird das invertierte File in eine Datei mit dem Namen invertedFile mittels Data::Dumper geschrieben (mit Hilfe der Subroutine printInvertedFile($)).

1.2.4 Das effiziente postingFileRanking()

postingFileRanking() berechnet die ¨Ahnlichkeit zwischen der Query und den einzelnen Dokumenten. Dazu werden alle Terme der Query in einer Schleife durchlaufen und die ermittelten ¨Ahnlichkeiten f¨ur jedes Dokument zum entsprechenden Eintrag im Akkumulator- Hash (%akk) addiert.

Dazu wird mit Hilfe der Subroutine getQueryTermsWithFrequency() zun¨achst ein Hash

%tf q erzeugt, der die W¨orter der Anfrage (unter Auslassung der Stoppw¨orter), zusammen mit ihrer H¨aufigkeit speichert. Dabei wird die gr¨oßte dieser H¨aufigkeiten als maximale Termh¨aufigkeit in $tf max q gespeichert.

F¨ur die Berechnung des Rankings braucht man nun die Termgewichte f¨ur jeden Term t der Anfrage q, die mit der Formel

wt = tf

tf max ·log N df

bestimmt werden, wobei tf max von q ($tf max q), die Term Frequency tf der Key des Terms in %tf q, N die Anzahl des Dokumente ($num docs) und dft (im Programm $dft) die Document Frequency (Anzahl der Dokumente, in denen der Term t auftritt) ist.

Nur $dft muss noch ermittelt werden. Dazu ¨ubergibt man den Inhalt des Postingfiles des Terms an %pf. $dft ist dann die Anzahl der Keys von%pf plus 1 (weil jeder Anfragetermt in der Anfrage vorkommt).

Der Wert von wt des Terms $item in der Anfrage wird in$wtq{$item}gespeichert.

Um das Gewicht der Anfrageterme $item in jedem Dokument zu berechnen, in dem es

(8)

vorkommt, braucht man die gleiche Formel. tf gibt hier an, wie oft$item im aktuell durch- laufenen Dokument vorkommt und wird bestimmt, indem einfach aus%pf(der Hash, der den Inhalt des Postingfile f¨ur $item wiedergibt) der Key des Dokuments gesucht wird. tf max ist ebenfalls bekannt. Bei N und dft werden genau wie eben $num docs bzw. $dft in die Formel eingesetzt. Daraus ergibt sich dann $wtd.

Im Akkumulator-Hash %akk wird schließlich bei jedem Schleifendurchlauf noch f¨ur das ak- tuelle Dokument der Value um $wtq{$item} · $wtd erh¨oht.

Je h¨oher der Wert eines Dokuments im Akkumulator-Hash, desto ¨ahnlicher ist es der Anfrage.

Dementsprechend werden die Dokumente, die die Anfrageterme bzw. den Anfrageterm ent- halten, nach ihrer ¨Ahnlichkeit sortiert und unter Angabe ihrer Ranking-Werte ausgegeben.

Hat man beim Aufruf des Programms die Option -l angegeben, werden maximal so viele Treffer ausgegeben wie gew¨unscht. Dies kontrolliert die Variable $new line, die bei der Ausgabe nach unten z¨ahlt. Wenn sie den Wert 0 erreicht hat, werden keine weiteren Treffer mehr angezeigt.

1.2.5 Das schnellere invertedFileRanking()

Das Ranking des invertierten Files wird von invertedFileRanking()durchgef¨uhrt.

Analog zum Verfahren in postingFileRanking() wird der Hash %tf q erzeugt, der die W¨orter der Anfrage (ohne Stoppw¨orter) samt H¨aufigkeit enth¨alt. $tf max q ist dabei der maximale Wert.

Danach wird ein leerer Hash %invfile angelegt, dem der Inhalt des invertierten Files

$inv file zugewiesen wird, sofern dieses existiert. Nun wird Wort f¨ur Wort%tf qdurchge- gangen, und ¨uberpr¨uft, ob die W¨orter ¨uberhaupt in den Dokumenten (sprich in %invfile) vorkommen. Wenn nicht, wird die Schleife abgebrochen.

Andernfalls werden Document Frequency und Term Weight folgendermaßen berechnet:

$dft (document frequency of term) ist die L¨ange des zum aktuellen Term geh¨orenden Arrays in%invfiledurch 2 geteilt (da im Array nicht nur das Dokument, sondern auch die Vorkommensh¨aufigkeit gespeichert ist), und 1 dazu addiert (weil ein Anfrageterm immer auch in der Anfrage vorkommt).

$wtq (weight of term in query) wird, wie beim postingFileRanking() nach der For- mel wtq= tf maxtf ·log df tN bestimmt; Dabei isttf in der Anfrage$tf q{$item}f¨ur jedes Wort $item, tf max ist $tf max q, N ist$num docs und dft ist$dft.

Jedes Wort wird zusammen mit seinem Gewicht in der Anfrage auf STDERR ausgegeben.

(9)

KAPITEL 1. DOKUMENTATION ZU RANKING.PERL 7 Um einen Akkumulator-Hash %akk anzulegen, der f¨ur alle Dokumente die ¨Ahnlichkeit zur Anfrage festlegt, muss zun¨achst wtd (term weight in document) nach der Formel f¨ur Termge- wichte berechnet werden. tf ist hier jedes 2. Element des Key-Arrays von t (im Programm:

$item).

tf max ist der Value des %tfmax-Hash f¨ur das jeweils 1. Element. N ist wieder $numdocs, dft ist $dft.

Die Akkumulator-Zelle eines Dokuments enth¨alt dann als ¨Ahnlichkeitswert die Summe der Multiplikation von wtd und wtq f¨ur jeden Term der Anfrage.

Die Dokumente in %akk werden nun der Reihe nach zusammen mit ihren Gewichten ausge- geben, das ¨Ahnlichste (mit dem h¨ochsten Wert) zuerst.

Wer beim Programmaufruf die Option -l gew¨ahlt hat, bekommt nur so viele Ergebnisse pr¨asentiert wie angegeben.

Die gew¨unschte Anzahl wurde in $limit gespeichert, $new limit zugewiesen, damit der Wert pro ausgegebenem Treffer um eins erniedrigt werden kann und trotzdem der Wert der urspr¨unglichen Anzahl erhalten bleibt.

1.2.6 Eine weitere Anfrage mit inputNewQuery()

Sowohl beim postingFileRanking() als auch beim invertedFileRanking() wird zuletzt noch die Subroutine inputNewQuery() aufgerufen, die es dem Benutzer erm¨oglicht, weitere Anfragen zu stellen. Dabei werden die bereits erstellten Postingfiles bzw. das invertierte File verwendet, was das Verfahren erheblich beschleunigt.

Durch Eingabe von q wird das Programm beendet.

1.2.7 Stemming mit dem Modul porter.pm

Hat man beim Programmstart die Option-p gesetzt, so m¨ochte man, dass die Anfrageterme in gestemmter Form untersucht werden.

Dazu verwendet die FunktiongetQueryTermsWithFrequency()das Modulporter.pm2beim Funktionsaufruf porter($1) und stemmt die W¨orter, welche in der Anfrage vorkamen. So- mit werden schon die gestemmten W¨orter in den Hash geschrieben.

Außerdem sucht man dann auch in gestemmten Texten, so dass auch die Subroutine createTermFrequencyHash($) die Funktion porter bei gesetzter Option-p verwendet.

2Dieses Modul von Daniel van Balen (vdaniel@ldc.usb.ve) implementiert den Porter Stemming Algorith- mus f¨ur das Englische und kann als Open Source unter http://www.ldc.usb.ve/∼vdaniel/porter.pm herun- tergeladen werden.

(10)

1.2.8 Das Hauptprogramm

Hier wird mit der Variable $success gepr¨uft, ob der Benutzer das Programm korrekt auf- gerufen und eine der m¨oglichen Kombinationen von Optionen angegeben hat.

Ist das der Fall, wird zun¨achst eine Mitteilung auf STDERR ausgegeben, dass die Stoppw¨orter bearbeitet werden, und unter Aufruf von createStopwordHash()das dazu n¨otige Verfahren durchgef¨uhrt.

Daraufhin erscheint eine weitere Ausgabe auf STDERR, die die Bearbeitung des Indexing ank¨undigt.

choosingMethod() sorgt dann daf¨ur, dass das f¨ur die Dokumentmenge geeignete Verfahren gew¨ahlt wird, und ruft wiederum die Subroutinen auf, die f¨ur eine weitere Bearbeitung n¨otig sind, wie bereits beschrieben.

(11)

Kapitel 2

Evaluation des IR-Systems

Um die Effektivit¨at unseres Programms, d.h. die Qualit¨at der Retrievalergebnisse zu er- mitteln, wurden f¨ur vier Anfragen jeweils Precision, Recall, Fallout sowie die Precision bei bestimmten festgelegten Recall-Werten berechnet.

2.1 Die vier Anfragen

Die ausgew¨ahlten Anfragen waren:

”victory and defeat in the team plays“

”accident, accusation and achievement in sports“

”american novel reviews“

”fight and war in history“

2.2 Precision, Recall und Fallout

Die Berechnungen zur Evaluation wurden durch das Perl-Programm evaluate.perl vorge- nommen, welches in Anhang B abgedruckt ist.

Dabei gab evaluate.perlfolgende Ergebnisse f¨ur Precision, Recall und Fallout aus:

Anfrage 1 - ”victory and defeat in the team plays“

The statistical results of query no. 1 Precision: 0.333333333333333

Recall: 0.625

Fallout: 0.105263157894737

9

(12)

Anfrage 2 - ”accident, accusation and achievement in sports“

The statistical results of query no. 2 Precision: 0.222222222222222

Recall: 0.444444444444444 Fallout: 0.148936170212766

Anfrage 3 - ”american novel reviews“

The statistical results of query no. 3 Precision: 0.13953488372093

Recall: 0.857142857142857 Fallout: 0.385416666666667

Anfrage 4 - ”fight and war in history“

The statistical results of query no. 4 Precision: 0.257142857142857

Recall: 0.9

Fallout: 0.279569892473118 Schlussfolgerungen

Die Werte f¨ur den Recall, also das Maß daf¨ur, wie viele der relevanten Dokumente tats¨achlich gefunden werden, ist besonders bei der vierten Anfrage,

”fight and war in history“ mit 0,9 erstaunlich hoch. Aber auch bei den anderen Anfragen zeigt sich, dass die meisten relevanten Dokumente als Treffer ausgegeben werden.

Der Recall-Wert geht jedoch auf Kosten der Precision: der Anteil an relevanten Dokumenten unter den gefundenen ist gering.

Allgemein l¨asst sich sagen, dass ein hoher Recall und zugleich ein hohe Pr¨azision wohl sehr schwer zu erreichen sind. Es stellt sich auch die Frage, ob das ¨uberhaupt erstrebenswert ist, oder ob man nicht - je nach Verwendungszweck des Informations-Retrieval-Systems - einem der Werte einen h¨oheren Stellenwert einr¨aumen sollte.

Ebenfalls untersucht wurde der Maßstab, der die Menge an unbrauchbaren gefundenen Do- kumente im Verh¨altnis zur Gesamtanzahl aller nicht relevanten Dokumente im Dokumen- tenbestand angibt: der Fallout. Dieser ist bei den Anfragen mit den besten Recall-Werten am h¨ochsten. Eine Erkl¨arung daf¨ur ist, dass in den Anfragen Schlagw¨orter wie ”american“

und ”sports“ verwendet werden, die in einer amerikanischen Zeitung, wie in diesem Fall der New York Times, verh¨altnism¨aßig oft vorkommen.

(13)

KAPITEL 2. EVALUATION DES IR-SYSTEMS 11 Bei einer Gesamtzahl von 103 Dokumenten wie hier ist ein hoher Fallout noch kein Problem, bei einer gr¨oßeren Menge erh¨alt man jedoch so viel ”M¨ull“, dass die wirklich interessanten Retrievalergebnisse in der Masse untergehen.

2.3 Precision bei Standardrecallwerten

Bei diesem Verfahren geht es darum, die Precision unter Annahme bestimmter vorher fest- gelegter Recall-Werte zu berechnen. Im Unterschied zu den vorherigen Verfahren werden nur die zehn am h¨ochsten gerankten Dokumente als Ergebnismenge betrachtet.

Folgende Werte wurden hierbei ermittelt:

Anfrage 1 - ”victory and defeat in the team plays“

Precision: 1 for Recall: 0.1 Precision: 0.666666666666667 for Recall: 0.2 Precision: 0.6 for Recall: 0.3 Precision: 0.6 for Recall: 0.4 Precision: 0.5 for Recall: 0.5 Precision: 0 for Recall: 0.6 Precision: 0 for Recall: 0.7 Precision: 0 for Recall: 0.8 Precision: 0 for Recall: 0.9

Precision: 0 for Recall: 1

Anfrage 2 - ”accident, accusation and achievement in sports“

Precision: 1 for Recall: 0.1 Precision: 1 for Recall: 0.2 Precision: 1 for Recall: 0.3 Precision: 1 for Recall: 0.4 Precision: 0 for Recall: 0.5 Precision: 0 for Recall: 0.6 Precision: 0 for Recall: 0.7 Precision: 0 for Recall: 0.8 Precision: 0 for Recall: 0.9 Precision: 0 for Recall: 1

(14)

Anfrage 3 - ”american novel reviews“

Precision: 0.333333333333333 for Recall: 0.1 Precision: 0.5 for Recall: 0.2 Precision: 0.5 for Recall: 0.3 Precision: 0.5 for Recall: 0.4 Precision: 0 for Recall: 0.5 Precision: 0 for Recall: 0.6 Precision: 0 for Recall: 0.7 Precision: 0 for Recall: 0.8 Precision: 0 for Recall: 0.9

Precision: 0 for Recall: 1

Anfrage 4 - ”fight and war in history“

Precision: 1 for Recall: 0.1 Precision: 1 for Recall: 0.2 Precision: 1 for Recall: 0.3 Precision: 0 for Recall: 0.4 Precision: 0 for Recall: 0.5 Precision: 0 for Recall: 0.6 Precision: 0 for Recall: 0.7 Precision: 0 for Recall: 0.8 Precision: 0 for Recall: 0.9 Precision: 0 for Recall: 1 Schlussfolgerungen

Bei drei der vier Anfragen betr¨agt die Precision bei einem Recall von 10% 1. Das bedeutet, dass zehn Prozent der relevanten Dokumente, n Dokumente, an den n ersten Pl¨atzen des Ranking stehen. Dieser (h¨ochste) Wert wird bei zwei Anfragen noch bis zu einem Recall von 30 bis 40% aufrechterhalten. Allerdings, und dies zeigt sich besonders bei der vierten An- frage,

”fight and war in history“, ist der Punkt, an dem keine weiteren relevanten Dokumente unter den ersten 10 Treffern auftauchen, sehr schnell (hier bei 40%) erreicht. Die Precision betr¨agt deshalb 0, weil keine Aussage dazu getroffen werden kann. H¨ochstens 50% der rele- vanten Dokumente (wie bei Anfrage 1) befinden sich in den obersten 10 Retrievalergebnissen.

Man kann also davon ausgehen, dass das System zwar brauchbare (relevante) Dokumente sehr hoch im Ranking einstuft. Das gilt jedoch nur f¨ur einen kleinen Prozentsatz. Die ande- ren Dokumente, die noch interessant w¨aren, befinden sich entweder weiter unten im Ranking oder sie wurden nicht gefunden.

(15)

13

(16)

Anhang A

Der Quellcode von ranking.perl

(17)

ANHANG A. DER QUELLCODE VON RANKING.PERL 15

(18)
(19)

ANHANG A. DER QUELLCODE VON RANKING.PERL 17

(20)
(21)

ANHANG A. DER QUELLCODE VON RANKING.PERL 19

(22)

Anhang B

Der Quellcode von evaluate.perl

20

(23)

ANHANG B. DER QUELLCODE VON EVALUATE.PERL 21

(24)

Referenzen

ÄHNLICHE DOKUMENTE

—— 4„ Gitter aus dem runden Thurm in Kopenhagen (1643).. Musterbuch

n = w, dann wird die Methode reallocate aufgerufen, die ein neues Array der Größe n anlegt und alle alten Elemente in das neue Array kopiert.. Anschließend wird das neue

Der Baum T ist ein fast vollständiger Binärbaum, wenn T entweder nur aus der Wurzel besteht oder wenn die ersten t 1 Level gemeinsam einen vollständigen Binärbaum bilden, und

Zeichnen Sie den durch die Operation entstehenden AVL-Baum, und schreiben Sie dazu, ob keine Rotation, ob eine Rotation oder ob eine Doppelrotation durchgeführt wurde... c Führen

Beim Löschen von Elementen aus inneren Knoten wird üblicherweise versucht, entweder den symmetrischen Vorgänger oder symmetrischen Nachfolger intelligent zu wählen.. Für

4 Aufgabe 12.2 P Dijkstra Führen Sie den Algorithmus von Dijkstra auf dem folgenden Graphen durch, um jeweils einen kürzesten Weg von s zu jedem anderen Knoten zu

Especially when working with children with autism, therapists should clearly understand how trauma manifests in children with autism to make appropriate adaptions of TF-CBT (Peterson

quantite d'eclats recueillis dans les «totalisateurs» sections Ib, IIb et Illb et peses deux fois par an avril et octobre confirme d'une part, Ie recul rapide des parois ä Chäteau