Benutzer:Loki/Recherchehilfe: Globale Textsuche

Aus Shadowhelix
Zur Navigation springen Zur Suche springen

Die hier vorgestellte Methode Globale Textsuche ist ein Vorschlag zur Vereinfachung der Recherche in Shadowrunquellen. Kurz gesagt, geht es darum nach einem Schlagwort parallel in mehreren Quellen oder Quellenindizierungen zu suchen. Ermöglicht wird dies im Wesentlichen durch zwei Umstände die Verfügbarkeit von Quellenmaterial in maschinenlesbarer Form und einer Suchfunktion, die zum Durchsuchen einer größeren Zahl von Textdateien geeignet ist, daher auch die Bezeichnung als "Globale Textsuche".

Der Wert des Suchsystems liegt darin, dass man viele Quellen parallel durchsuchen kann, also nicht jede einzeln durchgehen muss. Über den Zeitgewinn hinaus, kann man dadurch auch die Quellen schnell durchsuchen, die man für eine Einzelsuche sonst gar nicht in Betracht ziehen würde, weil sie nicht vielversprechend genug sind. So erzielt man immer wieder unverhoffte Treffer. Schließlich eröffnet eine Suchfunktion mit einer gewissen Mächtigkeit ganz neue Möglichkeiten Suchanfragen zu stellen.

Im Folgenden werden zunächst geeignete Materialen vorgeschlagen und dann die Aufbereitung dieser Materialen in einem "Suchsystem" sowie die Benutzung dieses Systems vorgestellt. Anschließend folgt eine Anleitung für die Implementation der Globalen Textsuche in einer Linux-Umgebung mit geeigneten Werkzeugen, notwendigen Arbeitsschritten und Skripten.

Prinzip

Vorschläge für Materialen

Geeignet sind grundsätzlich alle Materialien, die sich in eine maschinenlesbare Form überführen lassen. Sinnvoll ist außerdem mehr als nur die Verwendung der eigentlichen Quellen. Je mehr auch periphere Informationen man einbindet, desto größer die Chance auf Treffer.

Ebooks

Das Ebook-Format, in dem heute viele Quellen veröffentlicht werden, ist sehr gut für Recherchezwecke geeignet und kann auch ohne Aufbereitung für Globale Textsuche verwendet werden.

Previews

Previews von Quellenbüchern gibt es im Allgemeinen im gleichen Format wie die Ebooks und damit sind sie genauso geeignet. Zwar beinhalten die Previews auch immer ein paar Seiten des eigentlichen Inhalts und hier kann durchaus eine gesuchte Information enthalten sein, ihre größte Nützlichkeit beziehen die Previews allerdings aus dem Inhaltsverzeichnis. Insbesondere wenn man nicht die Ebook- sondern die Printversionen verschiedener Quellen besitzt, sind die zugehörigen oder ggf. anderssprachigen Previews eingebunden in ein Suchsystem eine gute Ergänzung für das Arbeiten mit Print.

Zusatzmaterialien

Zusatzmaterialien sind das meist frei verfügbare, periphere Quellmaterial. Dazu gehören zum Beispiel Outtakes, Kurzgeschichten, Abenteuer oder Errata. Es gibt natürlich auch ganze Materialsammlungen wie shadowrunberlin.de.

Indizes, Zusammenfassungen

Unter einem Index soll man hier eine Auflistung von verkürzten Quelleninhalten verstehen, die auf den Ort umfangreicherer Informationen hinweist. Insbesondere sind hier die Inhaltsverzeichnisse und die Indizes von Quellenbüchern gemeint. Allerdings können auch alle anderen indexartigen Zusammenstellungen zu Spezialthemen, von denen man im Netz einige finden kann, eingebunden werden. Gerade die Inhaltsverzeichnisse kann man sich aus der Shadowhelix (oder einem anderen Wiki) bzw. aus Previews auch für solche Quellen holen, die man nicht selbst besitzt. Außerdem sind die verschiedenen Wikis auch wieder eine Quelle von Indizes. In der Shadowhelix sei zum Beispiel auf die Seiten Medien der Sechsten Welt und Werke der Sechsten Welt verwiesen. Diese Informationszusammenstellungen kann man sich für das lokale Suchsystem spiegeln, was den Vorteil hat, dass sie sich parallel zu allen anderen Quellen durchsuchen lassen.

Zusammenfassungen meint in Abgrenzung zum Index, also dem Verweis auf Informationen, eine Aggregation von Informationen eventuell mit Bewertungen oder anderen Kommentaren angereichert. Umfangreichere Reviews mit Inhaltsangabe können sich gut für die Recherche eignen. Besonders erwähnenswert sind in diesem Zusammenhang die Romandossiers von Mason's Shadowrun Page, die besonders detaillierte Informationen enthalten und neben Plotzusammenfassung, Personen und Orten auch allgemein interessante Fakten aus den Romanen zusammenstellen. Erreichbar ist diese Ressource noch über die Wayback-Machine (members.aol.com/masn/novels/sr01.html bis members.aol.com/masn/novels/sr19.html eingeben). Neben Reviews gibt es auch allgemeinere Zusammenfassungen, die sich bestimmten Themenkomplexen widmen, und Informationen aus mehreren Quellen zusammenführen, im Prinzip genauso wie es das Wiki anstrebt. Das beste Beispiel hierfür sind die Ancient Files.

UPDATE: Die ancientfiles-Subdomain von Dumpshock existiert nicht mehr. Robert Derie, der Autor der Ancient Files, hat den Inhalt der Webseite als gepackte Datei zur Verfügung gestellt: https://rapidshare.com/files/3503920800/ancientfiles.tgz Der Dumpshock-Nutzer Fatum hat die Seite außerdem unter folgender Adresse gespiegelt: http://danvolodar.ru/ancientfiles/index.html Er erwartet aber noch auf eine Zusage von Derie, ob dieser dem Hosting zustimmt (siehe Diskussion auf Dumpshock). Insofern würde ich empfehlen, sich eine Kopie des Archivs zu sichern, obwohl es wahrscheinlich ist, dass man mit etwas Recherche die Dateien auch in Zukunft wiederfinden wird.

Print

Printversionen erfüllen zunächst nicht das Kriterium maschinenlesbar zu sein, allerdings kann man sie durch Scannen und Optical Character Recognition (OCR) oder klassisch, aber vermutlich weniger praxisrelevant, durch Abtippen in eine solche Form überführen. Dabei sollte jedem klar sein, dass die Verbreitung der Textversion genauso Urheberrechtsbeschränkungen unterliegt wie die einer digitalen Kopie des Originals.

Die Überführung ist sehr aufwendig und man sollte sie wenn vielleicht eher selektiv betreiben. Seiten, die viele Informationen zusammenfassen, sind damit lohnenswerte Ziele. Insbesondere der Index am Ende eines Buches, der im Gegensatz zum Inhaltsverzeichnis auch nicht über andere Quellen zu beziehen ist, ist ein solches lohnenswertes Ziel. Gerade für alte Bücher, die nicht im Ebook-Format erhältlich sind und häufig über einen Index verfügen, ist er eine gute Ergänzung des Suchsystems. Perspektivisch werden vermutlich viele alte Bücher auch kommerziell als Ebook-Version mit OCR-Text zu beziehen sein. Viele Zusatzmaterialien dagegen existieren nur im Printformat, zum Beispiel in Magazinen, diese sind meist auch nicht so umfangreich und damit für Scannen und OCR gut zugänglich.

Die Qualität von OCR schwankt muss man leider auch mit Hinblick auf einige der heute zu beziehenden Ebooks sagen. Für das Ziel des Suchsystems, die Generierung von Treffern, ist das allerdings eher ein Problem falschnegativer (nicht erkannte Treffer) denn falschpositiver Ergebnisse (Treffer, die keine sind). Typische OCR-Artefakte führen nicht so häufig zu neuen sinnhaften Wortbedeutungen.

Aufbau des Suchsystems

Das, was hier als Suchsystem bezeichnet wird, ist im Prinzip einfach eine Verzeichnisstruktur zur Ablage des Quellenmaterials sowie seine Formatierung, beides um die Benutzung von Globaler Textsuche zu unterstützen.

Die simpelste Form eines Suchsystems wäre ein einzelner Ordner, in dem man zum Beispiel die Ebooks als wichtigste Quellen unterbringt und den man anschließend mit einer Methode zur Suche in mehreren pdf-Dateien durchsucht. Das hier vorgestellte Suchsystem ist elaborierter und für viele normale Anwender vielleicht schon zu aufwendig, allerdings ist sie auch für die Recherche für das Hintergrundwiki entwickelt worden. Hier also die verschiedenen Elemente des Suchsystems:

Gemeinsames Format

Es wird vorgeschlagen alle in das Suchsystem eingefügten Materialien im gleichen Format zu halten, da sie so sehr einfach mit der gleichen Suchfunktion erfasst werden können. Wenn man eine gleichzeitige Suche über verschiedene Dokumenttypen implementieren kann, ist eine Umwandlung nicht unbedingt nötig, allerdings könnte das die Umsetzung der im folgenden vorgestellten Partitionierung erschweren. Als gemeinsames Format bietet sich Plaintext an.

Partitionierung

Unter Partitionierung wird hier die Unterteilung von Material in Untereinheiten verstanden. Ein Beispiel wäre die Unterteilung eines Ebooks im pdf-Format in eine Textdatei je Seite. Das Ziel, das damit verfolgt wird, ist es Informationen über die Strukturierung des Materials aus der einzelnen Datei in die Dateistruktur zu überführen, um so einen besseren Überblick zu gewinnen.

Verzeichnisstruktur

Die Verwendung einer ausführlichen Verzeichnisstruktur mit mehreren Unterverzeichnissen verfolgt das gleiche Ziel wie die Partitionierung: Die Unterstützung der Suche durch mehr Übersichtlichkeit. Hier wird das durch eine Zusammenfassung gleichartiger Materialien erreicht, die es einer Suchfunktion mit der entsprechenden Mächtigkeit zudem erlaubt selektiv in bestimmten Teilbereichen zu suchen.

Diese Beispielverzeichnisstruktur ist eine Möglichkeit, die Materialien zu organisieren:

sr_recherche/
|-- indizes
|   `-- inhaltsverzeichnisse
|-- previews
|-- quellen
|   |-- englisch
|   |   |-- augmentation
|   |   `..
|   `-- französisch
|       |-- enclaves_corporatistes
|       `..
|-- zusammenfassungen
|   |-- ancient_files
|   `-- novel_reviews
`-- zusatzmaterial
    |-- abenteuer
    |-- kurzgeschichten
    `-- outtakes

Verwendung des Suchsystems

Die Verwendung des Suchsystems soll an einem einfachen Beispiel erläutert werden. Zunächst gehen wir davon aus, dass wir folgendes nach den oberen Kriterien gestaltetes Suchsystem vorliegen haben:

sr_recherche/
|-- indizes
|   `-- inhaltsverzeichnisse
|       |-- arsenal
|       `-- dragons_of_the_sixth_world
|-- quellen
|    `-- englisch
|       `-- sixth_world_almanac
|           |-- 002
|           |-- 003
|           `..
`-- zusammenfassungen
   `-- ancient_files
       |-- immortals
       `-- VR2

Die Textdateien sind rot markiert: arsenal und dragons_of_the_sixth_world, die Inhaltsverzeichnisse der entsprechenden Quellenbücher, 002, 003 usw., dabei handelt es sich um die Seiten des Sixth World Almanac, und immortals und VR2 zwei Seiten aus den Ancient Files, einmal "Immortals Elves and Great Dragons" und "The Annotated Things to Come".

Nun verwende ich eine Suchfunktion um in allen Textdateien parallel nach dem Begriff "Lofwyr" zu suchen. Je nachdem wie die Ausgabe der Suchfunktion genau aussieht, sollte dabei etwa folgendes Ergebnis entstehen:

indizes/inhaltsverzeichnisse/dragons_of_the_sixth_world
quellen/english/sixth_world_almanac/023
quellen/english/sixth_world_almanac/053
..
quellen/english/sixth_world_almanac/142
zusammenfassungen/ancient_files/immortals

Es werden alle Vorkommen des Begriffs aufgelistet, im Inhaltsverzeichnis des Arsenal, im Dokument "The Annotated Things to Come" und auf etlichen Almanac-Seiten kommt der Begriff "Lofwyr" nicht vor. Nun kann man zu den eigentlichen Quellen zurückgehen (man muss nicht die mit unter schlechter formatierten Textversionen verwenden) und die Information genauer nachlesen.

Linux-Implementierung

Werkzeuge

Linux stellt viele der Werkzeuge bereit, einige andere müssen zusätzlich installiert werden. Die einzelnen Programme werden über die Kommandozeile angewendet.

Aufbereitung Materialien

Grundsätzlich gilt man sollte nur mit Kopien der Materialien arbeiten, insbesondere natürlich bei denen für die man bezahlt hat, da bei der Aufbereitung auch mal etwas schief gehen kann.

Umwandlung von Ebooks

Der einfachste Weg ein Ebook im PDF-Format in eine Textdatei umzuwandeln ist pdftotext:

pdftotext Quellenbuch.pdf

Wenn man auch die oben angesprochene Partitionierung verwenden will, bietet sich an, ein Skript zu benutzen. Das folgende Skript erzeugt in einem Ordner von pdf-Dateien Unterordner, die die einzelnen Seiten 001, 002 usw. als Textdatei enthalten:

for i in $(find *.pdf)
do
	PAGES=$(pdftk $i dump_data output | grep NumberOfPages | awk -F ': ' '{print $2}')
	DIR=$(echo $i | sed 's/.*\///' | sed 's/.pdf//')

	mkdir $DIR

	echo "processing $i"

	for j in `seq 1 $PAGES`
	do
		pdftk $i cat $j output page.pdf
		pdftotext page.pdf $DIR/$(echo $j | awk '{printf("%03d", $j)}')
		rm page.pdf

		echo "page $j is processed"
	done
done

1. Nebenbemerkung: Voraussetzung für die Funktionsfähigkeit des Skriptes ist es, dass die PDF-Dateien im Dateinamen keine Leerzeichen enthalten, dies kann man mit rename erreichen:

rename 's/ /_/g' *

2. Nebenbemerkung: Man tut sich selbst einen Gefallen, wenn man dafür sorgt, dass die Nummerierung der Seiten im Ebook (und damit die Nummerierung der Textdateien) mit der tatsächlichen Nummerierung im Buch übereinstimmt. Bei vielen Ebooks ist die zweite Seite die Rückseite des Buches oder es gibt Bildseiten, die nicht mitgezählt werden, wodurch die Nummerierung sich verschiebt. Dies kann man unter Zuhilfenahme von pdftk korrigieren. Ein Beispiel, angenommen man will die zweite Seite in einem PDF an das Ende kopieren:

pdftk Quellenbuch.pdf cat 1 3-end 2 output Quellenbuch_modifiziert.pdf

Quellenbuch_modifiziert.pdf enthält die gleichen Seiten wie Quellenbuch.pdf aber die bisherige Seite Nummer 2 befindet sich nun am Ende.

Umwandlung von HTML, DOC

Für die Umwandlung von HTML-Dateien kann html2text verwendet werden:

html2text Zusatzinfo.htm > zusatzinfo

Für die Umwandlung von DOC-Dateien bietet sich wvText an:

wvText Zusatzinfo.doc zusatzinfo

Einrichtung des Suchsystems

Ist das Material aufbereitet, ist die eigentliche Einrichtung des Suchsystems recht einfach. Man überlegt sich eine Verzeichnisstruktur und verschiebt die Textinhalte an die entsprechende Position.

Suchfunktion: grep

Die Suchfunktion grep soll hier etwas ausführlicher vorgestellt werden.

Grundanwendung

Zunächst die Verzeichnisstruktur mit zwei generischen Quellenbüchern A und B:

sr_recherche/
`-- quellen
    `-- englisch
        |-- quellenbuch_a
        `-- quellenbuch_b

Ich befinde mich nun in sr_recherche und wende grep an, eine typische Anfrage nach BEGRIFF würde so aussehen:

grep -c "BEGRIFF" */*/*/* | awk -F ':' '{if ($2 > 0) print $1":"$2}'

Nehmen wir die einzelnen Elemente auseinander. Die eigentliche Anwendung von grep ist bis zum Pipesymbol |. Der zweite Teil ist die Weitergabe der Ausgabe von grep via Pipe an awk und einige Weiterverarbeitung, die dann die eigentliche Ausgabe erzeugt. Das erscheint erstmal kompliziert, aber in der Praxis kann man einfach den String wiederverwenden und tauscht nur BEGRIFF aus. Der Parameter -c weist grep an, die Fundstellen von BEGRIFF für jede Datei zu zählen, anstatt direkt auszugeben. */*/*/* gibt an wo gesucht werden soll, nämlich alle Dateien in Unterverzeichnissen mit der Tiefe 3 in unserem Fall also zum Beispiel alle Dateien in quellen/englisch/quellenbuch_a/. Das ist wahrscheinlich der einzige Stolperstein, man muss dafür sorgen, dass alle Textdateien durchsucht werden. Um sicher zu gehen, würde man etwa folgendes verwenden:

grep -c "BEGRIFF" */* */*/* */*/*/* | awk -F ':' '{if ($2 > 0) print $1":"$2}'

Damit werden alle Unterverzeichnisse bis Tiefe 3 auch tatsächlich angesprochen. Die Ausgabe dieser Zeile, könnte zum Beispiel so aussehen:

quellen/englisch/quellenbuch_a/013:1
quellen/englisch/quellenbuch_b/068:2
quellen/englisch/quellenbuch_b/069:1

Hinter der Datei mit der Fundstelle steht noch die Häufigkeit, mit der BEGRIFF innerhalb der Datei gefunden wurden. Der Suchstring kann standardmäßig so verwendet werden.

Tuning

Durch kleine Modifikationen des Suchstrings kann man die Suche noch viel gezielter gestalten. Wir betrachten drei verschiedene Beispiele, dafür gehen wir nochmal von einer erweiterten Verzeichnisstruktur aus:

sr_recherche/
`-- quellen
    |-- englisch
    |   |-- quellenbuch_a
    |   `-- quellenbuch_b
    `-- deutsch
        `-- quellenbuch_c

Wir stellen folgende Suchanfrage und erhalten eine Ausgabe:

grep -c "BEGRIFF" */*/*/* | awk -F ':' '{if ($2 > 0) print $1":"$2}'
quellen/englisch/quellenbuch_a/013:1
quellen/englisch/quellenbuch_b/068:2
quellen/englisch/quellenbuch_b/069:1
quellen/deutsch/quellenbuch_c/023:4
quellen/deutsch/quellenbuch_c/129:1

Nun wird im Suchstring, die Angabe, wo gesucht werden soll, manipuliert, so dass nur noch englische Quellen zugelassen sind:

grep -c "BEGRIFF" */englisch/*/* | awk -F ':' '{if ($2 > 0) print $1":"$2}'
quellen/englisch/quellenbuch_a/013:1
quellen/englisch/quellenbuch_b/068:2
quellen/englisch/quellenbuch_b/069:1

Zurück zur ursprünglichen Suchanfrage, die if-Kondition ($2 > 0) bezieht sich auf die Häufigkeit der Fundstellen, momentan wird alles was mindestens eine Fundstelle aufweist ausgegeben, ich kann die Zahl aber zum Beispiel auf 1 hochsetzen und bekomme dann weniger Ergebnisse angezeigt:

grep -c "BEGRIFF" */*/*/* | awk -F ':' '{if ($2 > 1) print $1":"$2}'
quellen/englisch/quellenbuch_b/068:2
quellen/deutsch/quellenbuch_c/023:4

Wir gehen zurück zur ursprünglichen Suchanfrage und nehmen jetzt BEGRIFF2 dazu, indem wir eine zweite grep-Anfrage stellen. Wir wollen also nur Ergebnisse, die sowohl BEGRIFF als auch BEGRIFF2 beinhalten:

grep -l "BEGRIFF" */*/*/* | xargs grep -c "BEGRIFF2" | awk -F ':' '{if ($2 > 0) print $1":"$2}'
quellen/englisch/quellenbuch_a/013:1
quellen/deutsch/quellenbuch_c/023:2

Die angebenen Vorkommen sind die von BEGRIFF2.

Wie man sieht, können durch ein wenig Tuning sehr viel komplexere Anfragen an das Suchsystem gestellt werden.