\chapter{Analyse des Wiki-Textes}
\label{transform:analyse}\label{ch:analyse} 

Dieses Kapitel beschreibt, wie der Wiki-Text analysiert wird, um alle für WikiWord relevanten Eigenschaften (\lingo{Features}) zu extrahieren und wie diese Eigenschaften im Ressourcenmodell repräsentiert werden. Relevante Eigenschaften sind unter anderem die Wiki-Links (inklusive Kategorisierung, Language-Links etc., siehe \rr{sec:wikitext:links}), der Einleitungssatz (Glosse) und die verwendeten Vorlagen und ihre Parameter (\rr{sec:wikitext:vorlagen}).

Die Logik zur Analyse von Wiki-Text (und, soweit notwendig, von natürlicher Sprache), sind im Java Package 
\javaid{de.brightbyte.wikiword.analyzer} implementiert. Das Package \javaid{de.brightbyte.wikiword.wikis} enthält Klassen, die das \nospell{sprach-} \bzw projektspezifische Wissen repräsentieren, das notwendig ist, um den Wiki-Text zu analysieren. Die in diesen Packages implementierten Regeln und Muster basieren auf Informationen darüber, wie Wiki-Text im Allgemeinen und Wikipedia-Seiten im Speziellen aufgebaut sind. Insbesondere repräsentieren sie:

\begin{enumerate}
  \item Die \textbf{Wiki-Text Markup Syntax}, wie von MediaWiki festgelegt (\rrr[Anhang]{ch:wikitext}). Diese Regeln sind, soweit sie für WikiWord relevant sind, fest in \javaid{PlainTextAnalyzer} kodiert.
  \item Die \textbf{Konventionen und Richtlinien} der einzelnen Wiki-Projekte, die zum Beispiel festlegen, wie Artikel strukturiert werden \q{WP:ARTIKEL}, wie Kategorien zu verwenden sind \q{WP:KAT} oder wann und wie Begriffsklärungsseiten anzulegen sind \q{WP:BKL}. Diese Regeln sind, soweit sie für WikiWord relevant sind, zumeist in der projektspezifischen Subklasse von \javaid{WikiConfiguration} definiert, zum Teil aber auch fest in \javaid{WikiTextAnalyzer} kodiert.
  \item \textbf{Beobachtungen} darüber, wann bestimmte Textmuster auftreten oder wie das Wiki-Text-Markup verwendet wird. Das sind zum Beispiel die Menge der in einer Sprache häufig auftretenden Abkürzungen, wichtig für das Erkennen des Endes der Glosse --- diese Information ist als sprachspezifisches Wissen in der betreffenden Subklasse von \javaid{LanguageConfiguration} abgelegt. Ein anderes Beispiel sind Vorlagen, die häufig inline im Text verwendet werden und daher vor der Verarbeitung aufgelöst werden sollten. Sie sind mit den anderen projektspezifischen Informationen in einer Subklasse von \javaid{WikiConfiguration} definiert.
\end{enumerate}

Zu beachten ist, dass WikiWord \lingo{ad-hoc}-Heuristiken nach Möglichkeit vermeidet und statt dessen versucht, direkt explizite Konventionen zu modellieren. So profitiert WikiWord stärker von der \emph{Intention} der Autoren des Wiki-Textes und ist weniger auf die Intuition des Programmierers angewiesen.

\later{Unterstriche und Leerzeichen}

\section{Klassen}
\label{sec:analyse:klassen}

Dieser Abschnitt beschreibt die Klassen, die für die Analyse des Wiki-Textes und eine Übertragung in das Ressourcenmodell wichtig sind.

\begin{description}
 \item[\javaid{PlainTextAnalyzer}:] Die Klasse \javaid{PlainTextAnalyzer} bietet einfache Funktionen zur Analyse natürlichsprachlicher Texte, insbesondere eine Methode zur Extraktion des ersten Satzes aus einem Text, und eine Funktion zur Extraktion einzelner Wörter aus einer Zeichenkette. Instanzen von \javaid{PlainTextAnalyzer} sollten über die Methode \javaid{getPlainTextAnalyzer} erzeugt werden: Sie lädt die für die gegebene Sprache passende Implementation und Konfiguration. Die Default-Implementation funktioniert bei entsprechender Konfiguration über eine \javaid{LanguageConfiguration} für die meisten europäischen Sprachen.
 
 \item[\javaid{LanguageConfiguration}:]  Die Klasse \javaid{LanguageConfiguration} repräsentiert eine Konfiguration von \javaid{PlainTextAnalyzer} für eine bestimmte Sprache. Die wichtigste sprachspezifische Information, die diese Klasse kapselt, ist ein Muster für häufig verwendete Abkürzungen dieser Sprache, das bei der \nom{Satzgrenzenerkennung}\index{Satzgrenzenerkennung} verwendet wird. Für Deutsch und Englisch sind Konfigurationen im Package \javaid{de.brightbyte.wikiword.wikis} definiert, für weitere Sprachen wie Französisch, Niederländisch und Norwegisch ist eine rudimentäre Basiskonfiguration vorhanden.

\later{Abkürzungslisten im Anhang!}
 
 \item[\javaid{WikiTextAnalyzer}:] Die Klasse \javaid{WikiTextAnalyzer} enthält Logik für die Verarbeitung vieler Aspekte des von MediaWiki verwendeten Wiki-Text-Markups (\rr{ch:wikitext}). Insbesondere bietet sie Methoden für den Zugriff auf Wiki-Links, Vorlagen und Artikelabschnitte, sowie Funktionalität zum Entfernen von Wiki-Markup, um "`einfachen"' Text zur weiteren Verarbeitung zu erzeugen. Instanzen von \javaid{WikiTextAnalyzer} sollten über die Methode \javaid{getWikiTextAnalyzer} erzeugt werden: Sie lädt die für den gegebenen Korpus passende Implementation und Konfiguration.

 \item[\javaid{WikiTextAnalyzer.WikiPage}:] Die Klasse \javaid{WikiTextAnalyzer.WikiPage} repräsentiert eine Seite im Wiki und implementiert damit das Ressourcenmodell\index{Ressourcenmodell}\index{Ressource} von WikiWord (\rr{entwurf:ressourcenmodell}). Sie bietet Zugriff auf die verschiedenen Eigenschaften der Seite, wie sie von \javaid{WikiTextAnalyzer} erkannt wurden. Diese sind im \rrr[Anhang]{sec:analyzer:WikiPage} beschrieben.
  
 \item[\javaid{WikiConfiguration}:] Die Klasse \javaid{WikiConfiguration} repräsentiert eine Konfiguration von \javaid{WikiTextAnalyzer} für ein bestimmtes Wiki-Projekt. Sie enthält Wissen über diverse Konfigurationen und Konventionen für das betreffende Wiki. Konfigurationen sind im Package \javaid{de.brightbyte.wikiword.wikis} vorhanden für die deutschsprachige (\domain{de.wikipedia.org}) und die englischsprachige Wikipedia (\domain{en.wikipedia.org}) sowie rudimentär angelegt für die französischsprachige (\domain{fr.wikipedia.org}), niederländischsprachige (\domain{nl.wikipedia.org}) und norwegischsprachige (\domain{no.wikipedia.org}).

 \item[\javaid{WikiTextSniffer}:] Die Klasse \javaid{WikiTextSniffer} erlaubt es, typische Elemente von Wiki-Text zu erkennen. Das ist nützlich für \lingo{Sanity-Checks}: so sollten zum Beispiel Konzeptnamen und Terme, die aus Wiki-Links extrahiert wurden, keinen Wiki-Text mehr enthalten. Tun sie das doch, werden sie ignoriert. Das sollte nur dann auftreten, wenn Wiki-Markup auf inkorrekte oder sehr ungewöhnliche Weise verwendet wurde.
\end{description}

Die Klassen und Dateien, die zur Konfiguration Wiki-spezifischer Werte und Muster verwendet werden, sind in \rrr[Anhang]{usage:wiki-config} beschrieben.

\section{Mechanismen}
\label{sec:analyse:mechanismen}
Zur Verarbeitung des Wiki-Textes werden verschiedene Techniken verwendet, hauptsächlich aber \nom{Mustererkennung} (\lingo{Pattern Matching}), wobei die Muster nicht unbedingt direkt auf den vollen Wiki-Text angewendet werden, sondern zum Teil auf schon vorverarbeiteten Text oder Textstücke. Um die verschiedenen Muster und Regeln in \javaid{WikiConfiguration} zu definieren, werden vor allem die folgenden Klassen verwendet:

\begin{description}
  \item[\javaid{Pattern}:] Ein regulärer Ausdruck, in Javas eigener Implementation \q{JAVA:RE}. Wird für einfache Mustererkennung im Text verwendet.
  \item[\javaid{AbstractAnalyzer.Mangler}:] Ein Interface für Klassen, die Text manipulieren, also Ersetzungen irgendeiner Form durchführen. Standard-Implementationen dieses Interfaces sind \javaid{WikiTextAnalyzer.BoxStripManger} zum Entfernen von Blockstrukturen aus Wiki-Text \rr{sec:analyzer:bereinigen}, \javaid{WikiTextAnalyzer.EntityDecodeManger} zum Auflösen von HTML \lingo{Character References} \q{W3C:HTML} und \javaid{AbstractAnalyzer.RegularExpressionMangler}, der beliebige Textersetzungen auf der Basis von regulären Ausdrücken vornimmt.
  \item[\javaid{AbstractAnalyzer.SuccessiveMangler}:] Ebenfalls ein Interface für Klassen, die Text manipulieren. \javaid{SuccessiveMangler} hat dabei zusätzlich die Eigenschaft, dass er den gegebenen Text nicht unbedingt bis zum Ende verarbeitet und dass die Verarbeitung dort fortgesetzt werden kann, wo sie unterbrochen wurde. So kann der Text sukzessive verarbeitet werden, genau so weit, wie das Ergebnis tatsächlich benötigt wird. Die bereits erwähnte Klasse \javaid{WikiTextAnalyzer.BoxStripManger} zum Entfernen von Blockstrukturen aus Wiki-Text implementiert dieses Interface zusätzlich zu \javaid{AbstractAnalyzer.Mangler} --- das ist insbesondere für das Aufspüren des ersten Absatzes eines Artikels nützlich.
  \item[\javaid{AbstractAnalyzer.Armorer}:] Interface für Klassen, die Teile des Textes durch Platzhalter ersetzen, um sie so vor weiteren Verarbeitungsschritten zu schützen. Das ist insbesondere für Abschnitte im Wiki-Text sinnvoll, die als \lingo{verbatim} markiert sind, auf die also die Regeln des Wiki-Markup nicht angewendet werden sollen (\rr{sec:analyzer:bereinigen}). Das sind insbesondere Kommentare sowie Text in \wikitext{<nowiki>}- und \wikitext{<pre>}-Tags (siehe \rr{ch:wikitext}). Die Standard-Implementation dieses Interfaces ist \javaid{AbstractAnalyzer.RegularExpressionArmorer} --- sie identifiziert zu schützende Teile des Wiki-Textes mit Hilfe eines regulären Ausdrucks.
  \item[\javaid{WikiTextAnalyzer.Sensor}:] Interface für Klassen, die eine \javaid{WikiPage} auf Grund einer ihrer Eigenschaften klassifizieren: die Methode \javaid{sense} gibt zurück, ob der \javaid{Sensor} zu der gegebenen \javaid{WikiPage} passt; die Methode \javaid{getValue} liefert den Wert, der der Seite gegebenenfalls zugeordnet werden soll. Für dieses Interface gibt es eine ganze Reihe von Implementationen:
  \begin{description}
    \item[\javaid{HasCategorySensor}:] Stellt fest, ob die Seite zu einer bestimmten Kategorie gehört.
    \item[\javaid{HasCategoryLikeSensor}:] stellt fest, ob  die Seite zu einer Kategorie gehört, deren Name zu einem bestimmten regulären Ausdruck passt.
    \item[\javaid{HasSectionSensor}:] Stellt fest, ob die Seite einen Abschnitt mit einem bestimmten Namen hat.
    \item[\javaid{HasSectionLikeSensor}:] stellt fest, ob die Seite einen Abschnitt hat, dessen Name zu einem bestimmten regulären Ausdruck passt.
    \item[\javaid{HasTemplateSensor}:] Stellt fest, ob die Seite eine bestimmte Vorlage verwendet. Optional kann auch verlangt werden, dass die Vorlage mit einem bestimmten Parameter verwendet wird und dass diesem Parameter ein bestimmter Wert zugewiesen wurde.
    \item[\javaid{HasTemplateLikeSensor}:] Stellt fest, ob wenn die Seite eine Vorlage verwendet, deren Name zu einem bestimmten regulären Ausdruck passt. Optional kann auch verlangt werden, dass die Vorlage mit einem bestimmten Parameter verwendet wird und dass der Wert, der diesem Parameter zugewiesen wurde, zu einem bestimmten regulären Ausdruck passt.
    \item[\javaid{RegularExpressionCleanedTextSensor}:] Stellt fest, ob der bereinigte Text der Seite (\rr{sec:analyzer:bereinigen}) zu einem bestimmten regulären Ausdruck passt.
    \item[\javaid{RegularExpressionTitleSensor}:] Stellt fest, ob  der Titel der Seite zu einem bestimmten regulären Ausdruck passt.
  \end{description}
  
  Sensoren dieser Art werden vornehmlich für die Klassifikation von Ressourcen und Konzepten verwendet (siehe \rr{sec:ressourcenklassifikation} \bzw \rr{sec:konzeptklassifikation}).
\end{description}

Mit diesen Mitteln lassen sich die Eigenheiten eines Wikipedia-Projektes ausdrücken und in einer Subklasse von \javaid{WikiConfiguration} festhalten, auf die \javaid{WikiTextAnalyzer} bei der Analyse von Wiki-Text zurückgreifen kann.

\section{Bereinigen}
\label{sec:analyzer:bereinigen}
Für die Verarbeitung von Wiki-Text ist es nützlich, bestimmte Arten oder Aspekte des Wiki-Markups vorab zu entfernen. Wie in \rr{sec:analyzer:WikiPage} erwähnt, kennt WikiWord vier Versionen des Wiki-Textes:

\begin{description}
  \item[\javaid{text}:] der unveränderte Wiki-Text.
  \item[\javaid{cleanedText}:] der Wiki-Text ohne störende Elemente, nach Anwendung von \javaid{WikiTextAnalyzer.stripClutter}. Diese Form des Textes ist die Basis für die weitere Analyse (Extraktion von Vorlagen, Links, Kategorien etc).
  \item[\javaid{flatText}:] der Wiki-Text ohne Blöcke, nach Anwendung von \javaid{WikiTextAnalyzer.stripBoxes}. Diese Form des Textes ist die Basis für die weitere Analyse auf der Textebene (Extraktion der Glosse, von Absätzen etc.).
  \item[\javaid{plainText}:] der Text nach dem Entfernen sämtlicher Markup-Elemente, also nach Anwendung von \javaid{WikiTextAnalyzer.stripMarkup}. Diese Form des Textes kann für eine weitere Verarbeitung auf der Ebene natürlicher Sprache verwendet werden.
\end{description}

Die einzelnen Methoden zum Bereinigen des Textes werden im Folgenden näher erläutert:

\begin{description}
\item[\javaid{WikiTextAnalyzer.stripClutter}:] Diese Methode entfernt oder transformiert alle solchen Wiki-Text-Elemente, die für die Analyse im Rahmen dieser Arbeit unnötig oder störend sind, und ruft dann \javaid{WikiTextAnalyzer.resolveMagic} auf. Alle anderen Analysemethoden werden auf den so bereinigten Text angewendet (oder auf eine weiter bereinigte Version).

Vollständig entfernt werden \wikitext{<gallery>}-Blöcke, alle eingebundenen Bilder (also Wiki-Links in den Image-Namensraum) \q{MW:IMAGES} (\rr{sec:wikitext:links}) sowie alle Optionen der Form \regex{\_\_.*?\_\_} \q{MW:MAGIC} (\rr{sec:wikitext:magicwords}). Definiert werden diese Ersetzungen durch \javaid{WikiConfiguration.stripClutterManglers}.

Ebenfalls durch \javaid{WikiConfiguration.stripClutterManglers} werden Ersetzungen definiert, die wohlbekannte, wikispezifische Vorlagen ersetzen, insbesondere Formatierungshilfen, die inline im Text verwendet werden. Für die englischsprachige Wikipedia werden zum Beispiel unter Anderem folgende Ersetzungen vorgenommen: \wikitext{\{\{dot\}\}} durch \txt{$\cdot$} (Unicode \nospell{U+00B7}), \wikitext{\{\{sub|xxx\}\}} durch \nospell{\txt{xxx}} und  \wikitext{\{\{frac|a|b\}\}} durch \txt{a/b}. Zudem wird eine Vielzahl von Vorlagen einfach entfernt, zum Beispiel \wikitext{\{\{fact\}\}}, das in der englischen Wikipedia auf eine unbelegte Aussage hinweist. Wichtig ist auch, dass in diesem Schritt Vorlagen ersetzt werden, die Teile von Markup-Konstrukten enthalten, die für die weitere Verarbeitung benötigt werden: In der englischsprachigen Wikipedia muss zum Beispiel die Vorlage \wikitext{\{\{wrapper\}\}} durch "`\wikitext{\{|}"' (Tabellenanfang) und \wikitext{\{\{end\}\}} durch "`\wikitext{|\}}"' (Tabellenende) ersetzt werden.

Einige Arten von Wiki-Text-Konstrukten werden nicht einfach entfernt oder umgewandelt, sondern durch einen Platzhalter ersetzt, so dass sie zwar von der weiteren Verarbeitung ausgeschlossen sind, aber später wieder eingefügt werden können (\nom{Armoring}\index{Armoring}): das ist vor allem für Blöcke der Fall, in denen Wiki-Text-Markup keine Anwendung findet, per Default also bei Kommentaren (\regex{<!-{}-.*?-{}->}) sowie bei \wikitext{<nowiki>}- und \wikitext{<pre>}-Blöcken (\rr{ch:wikitext}). Diese Blöcke werden durch \javaid{WikiConfiguration.stripClutterArmorers} festgelegt.

\item[\javaid{WikiTextAnalyzer.resolveMagic}:] Diese Methode ersetzt einige Magic Words durch ihren konkreten Wert \q{MW:MAGIC}: sie verwendet den in \javaid{WikiConfiguration.magicPattern} definierten regulären Ausdruck, um solche Magic Words zu finden, und ruft dann \javaid{WikiTextAnalyzer.evaluateMagic} auf, um ihren Wert zu ermitteln. Ersetzt werden solche Magic Words, die als Variablen für verschiedene Versionen des Seitentitels oder des Namensraumes der Seite funktionieren, konkret solche, die zu folgendem regulären Ausdruck passen: \nospell{\startregex \\\{\\\{\\s*((FULL|SUB|BASE)?PAGENAMEE?|NAMESPACEE?)\\s*\\\}\\\} \endregex}. Andere Magic Words werden später genau wie  Vorlagen behandelt (wenn sie der Vorlagen-Syntax folgen, siehe \rr{sec:analyse:vorlagen}), oder wurden vorher bereits von \javaid{WikiTextAnalyzer.stripClutter} entfernt (im Fall von Optionen wie \wikitext{\_\_NOTOC\_\_}).

\item[\javaid{WikiTextAnalyzer.stripBoxes}:] Diese Methode liefert den "`eigentlichen"' Inhalt der Wiki-Seite (den \nom{Fließtext}\index{Fließtext}), ohne Bilder, Tabellen, Infoboxen, Hinweise und dergleichen, aber noch mit Markup zur Textformatierung sowie Wiki-Links. Die Ersetzungen, die anzuwenden sind, um das zu erreichen, werden von \javaid{WikiConfiguration.stripBoxesManglers} definiert. Als Eingabe wird Text erwartet, der bereits durch \javaid{WikiTextAnalyzer.stripClutter} bereinigt wurde.

Per Default enthält \javaid{stripBoxesManglers} genau einen Mangler, nämlich eine Instanz von \javaid{WikiTextAnalyzer.BoxStripMangler}: Er entfernt alle expliziten Blockstrukturen, also Tabellen, Vorlagen (soweit nicht bereits ersetzt) sowie \wikitext{<div>}- und \wikitext{<center>}-Blöcke; diese werden in der Wikipedia fast nie im Fließtext des Artikels verwendet, sondern nur für "`Kästen"' (\nom{Floats}\index{Floats}), Warnungen, Hinweise, usw. (\wikitext{<p>}-Blöcke dagegen kommen manchmal im Fließtext vor, und werden eher selten für Floats verwendet). Das Entfernen der Blockstrukturen erfolgt durch rekursives Parsen anhand der öffnenden und schließenden Elemente der einzelnen Strukturen, implementiert als Kellerautomat in \javaid{WikiTextAnalyzer.BoxStripMangler.mangle}.

\item[\javaid{WikiTextAnalyzer.stripMarkup}:] Diese Methode entfernt alle Markup-Elemente aus einem Text --- als Eingabe wird Text erwartet, der bereits durch \javaid{WikiTextAnalyzer.stripBoxes} bereinigt wurde. Die Ersetzungen, die anzuwenden sind, um das zu erreichen, werden von \javaid{WikiConfiguration.stripMarkupManglers} definiert. 

  Per Default werden folgende Ersetzungen durchgeführt:
  \begin{itemize}
   \item Zeilen, die nur aus \wikitext{{--}{--}{--}} bestehen, definieren horizontale Trennlinien; sie werden entfernt.
   \item Alle Wiki-Links werden durch ihren Link-Text ersetzt.
   \item Alle externen Links werden durch ihren Link-Text ersetzt oder, wenn kein Link-Text angegeben ist, durch die URL, auf die sie verweisen.
   \item Doppelpunkte am Anfang einer Zeile werden durch eine entsprechende Anzahl Tabs ersetzt (Unicode U+0009).
   \item Alle Gruppen von zwei oder drei aufeinanderfolgenden Apostrophen (Unicode U+0027) werden entfernt.
   \item Alle verbleibenden XML-artigen Tags werden entfernt --- dabei bleibt gegebenenfalls der Text zwischen Start- und \nospell{End-Tag} erhalten.
   \item Alle HTML-artige Entity-Referenzen werden unter Verwendung von \javaid{WikiTextAnalyzer.EntityDecodeMangler.mangle} dekodiert \q{W3C:HTML}.
  \end{itemize}
\end{description}

\section{Extraktion von Vorlagen}
\label{sec:analyse:vorlagen}

WikiWord analysiert auch die Verwendung von Vorlagen (\lingo{Templates}) auf Wiki-Seiten (\rr{ch:wikitext}), vornehmlich, weil diese einen guten Anhaltspunkt für die Klassifikation der Seite \bzw des Konzeptes bietet. Die Verarbeitung der Vorlagen ist in \javaid{WikiTextAnalyzer.extractTemplates} implementiert; sie ist konzeptionell als Kellerautomat umgesetzt, wobei allerdings verschachtelt auftretende Vorlagen lediglich gezählt werden. Nur die Verwendung auf der "`obersten"' Ebene wird registriert und gespeichert.

Die Vorlagen, die auf einer Wiki-Seite verwendet werden, werden als Datenstruktur vom Typ \javaid{java.util.Map} repräsentiert; die Schlüssel in der Map sind die normalisierten Namen der verwendeten Vorlagen, die den Schlüsseln zugeordneten Werte sind selbst wieder Maps, die die Parameter der Vorlage als Schlüssel-Wert-Paare enthalten; unbenannte (\nom{positionale}) Parameter werden, wie in MediaWiki selbst, mit 1 beginnend durchnummeriert. Die Repräsentation in einer Map hat zur Folge, dass, sollte eine Vorlage auf derselben Seite mehrfach verwendet werden, nur das letzte Auftreten der Vorlage beachtet wird. Zwar kommt es recht häufig vor, dass Vorlagen mehrfach verwendet werden, jedoch trifft dies kaum auf die Art von Vorlage zu, die von WikiWord von Interesse für die Klassifikation der Seite wäre --- oder es ist für die Klassifikation zumindest unerheblich, wie oft die Vorlage auf der Seite vorkommt.

Vorlagen, deren Name mit "`\wikitext{\#}"' beginnt, werden als \lingo{Parser Functions} erkannt und übergangen. Vorlagen, deren Namen einen Doppelpunkt "`\wikitext{:}"' enthält, werden daraufhin untersucht, ob der Teil vor dem Doppelpunkt der Name eines relevanten Magic Words ist (\javaid{WikiTextAnalyzer.getMagicTemplateId}) --- falls das der Fall ist, wird der Schlüssel auf den kanonischen Namen des Magic Words gesetzt und der Teil des ursprünglichen Namens, der auf den Doppelpunkt folgt, als Parameter mit dem Namen "`0"' interpretiert. Auf diese Wiese lässt sich insbesondere die Verwendung von \wikitext{\{\{DISPLAYTITLE:\ldots\}\}} und \wikitext{\{\{DEFAULTSORT:\ldots\}\}} festhalten (siehe \rr{sec:wikitext:magicwords}); diese Information kann später zur Bestimmung der Bezeichnungen für ein Konzept beitragen (siehe \rr{sec:analyzer:terme} und \rr{sec:import-aus-wikitext}).

\section{Ressourcenklassifikation}
\label{sec:ressourcenklassifikation}

Die Methode \javaid{WikiTextAnalyzer.determineResourceType} bestimmt den \javaid{ResourceType}: Das heißt, sie weist einer Wiki-Seite (\nom{Ressource}) einen Typ aus einer fest vorgegebenen Menge zu (vergleiche \rr{entwurf:ressourcenmodell}). Von diesem Typ hängt die weitere Verarbeitung der Seite ab, siehe \rr{sec:import-aus-wikitext}.

Die Zuweisung wird in \javaid{WikiConfiguration.resourceTypeSensors} definiert, die Regeln sind im Allgemeinen Wiki-spezifisch. Die folgenden Typen werden verwendet:
  \begin{description}
%   \item[UNKNOWN] Reserviert. Wird in der gegenwärtigen Implementation nicht verwendet.
   \item[\javaid{ARTICLE}:] \index{Artikel}\index{Konzept} Die Ressource ist ein Artikel, das heißt, sie beschreibt ein Konzept. Solche Seiten liefern den eigentlichen enzyklopädischen Inhalt der Wikipedia. Dieser Typ wird allen Seiten zugewiesen, die zu keinem der anderen Typen passen.
   \item[\javaid{REDIRECT}:] \index{Redirect}\index{Weiterleitung}\index{Alias}\label{sec:analyzer:aliase}\label{p:type:redirect} Die Ressource definiert eine Weiterleitung auf eine andere Seite (also einen Alias für das entsprechende Konzept). Dieser Typ wird allen Seiten zugeordnet, die zu dem in \javaid{WikiConfig.redirectPattern} festgelegten Muster passen. 
   \item[\javaid{DISAMBIG}:] \index{Disambiguierung}\index{Begriffsklärung} Die Ressource ist eine Begriffsklärungsseite, das heißt, sie führt verschiedene Bedeutungen eines Terms auf (\rr{sec:analyzer:disambig}). Seiten dieses Typs lassen sich meist an der Verwendung einer speziellen Vorlage erkennen: in der deutschsprachigen Wikipedia zum Beispiel wird dieser Typ allen Seiten zugewiesen, die die Vorlage \wikitext{\{\{Begriffsklärung\}\}} enthalten.
   \item[\javaid{LIST}:] \index{Liste} Die Ressource ist eine explizite Liste von Seiten (und damit Konzepten) mit einer bestimmten Eigenschaft. Seiten dieses Typs lassen sich meist an ihrem Titel oder einer ihrer Kategorien erkennen: in der deutschsprachigen Wikipedia zum Beispiel wird dieser Typ allen Seiten zugewiesen, die in einer Kategorie sind, die \wikipage{Liste} heißt oder deren Name mit \wikipage{Liste\_} beginnt.
   \item[\javaid{CATEGORY}:] \index{Kategorie} Die Ressource ist eine Kategorie, das heißt, eine Sammlung von Seiten \bzw Konzepten, die dem Konzept, das die Kategorie selbst repräsentiert, untergeordnet sind\index{Subsumtion}.  Dieser Typ wird allen Seiten aus dem Kategorie-Namensraum zugewiesen, das heißt, sie werden an ihrem Titel erkannt.
   \item[\javaid{BAD}:] Die Seite ist als problematisch markiert; das betrifft vor allem so genannte \nom{Löschkandidaten}\index{Löschkandidaten} \q{WP:LR}, also Seiten, die aus irgendeinem Grund zur Löschung aus der Wikipedia vorgeschlagen wurden. Seiten dieses Typs lassen sich meist über die Verwendung einer speziellen Vorlage erkennen: in der deutschsprachigen Wikipedia zum Beispiel wird dieser Typ unter Anderem allen Seiten zugewiesen, die die Vorlage \wikitext{\{\{Löschen\}\}} enthalten.
%   \item[SECTION] Reserviert für Artikelabschnitte. Wird in der gegenwärtigen Implementation nicht verwendet.
  \end{description}

\section{Konzeptklassifikation}
\label{sec:konzeptklassifikation}

Konzepten wird während des Imports ein \javaid{ConceptType}\index{Konzepttyp} aus einer fest vorgegebenen Menge von Typen zugewiesen. Diese Konzepttypen sind unabhängig von der Sprache und dem Wiki (\bzw Korpus) und dienen einer groben Filterung der Konzepte je nach Anwendungsbereich, insbesondere für die \lingo{Named Entity Recognition} \qq{DakkaCucerzan2008}{toral2006pab}. Sie werden von der Methode \javaid{WikiTextAnalyzer.determineConceptType} unter Verwendung der Sensoren in \javaid{WikiConfiguration.conceptTypeSensors} bestimmt. Die folgenden Konzepttypen sind definiert:

\begin{description}
  \item[\javaid{UNKNOWN}:] Unbekannter Typ --- wird verwendet, wenn der Konzepttyp nicht bestimmt werden konnte, weil es keine beschreibende Ressource (also keine Wiki-Seite) zu dem Konzept gibt. Das kommt insbesondere für solche Konzepte vor, die im Wiki zwar referenziert, aber nicht erklärt werden (insbesondere also "`rote Links"' und \nospell{Navigations\-kategorien}, \rr{p:navigationskategorien}).
  \item[\javaid{PLACE}:] Orte, Regionen, geografische Einheiten. Solche Einträge könnten für den Aufbau \bzw die Erweiterung eines \nom{Gazetteers}\index{Gazetteer} verwendet werden und sind besonders für Aufgaben wie \lingo{Named Entity Recognition}\index{Named Entity Recognition} und damit \lingo{Topic-Tracking}\index{Topic-Tracking} nützlich. Beim Aufbau eines Wörterbuches\index{Wörterbuch} dagegen können Orte gegebenenfalls ausgelassen werden.
  \item[\javaid{PERSON}:] Natürliche Personen. Solche Einträge könnten für den Aufbau \bzw die Erweiterung eines \nom{Personenregisters} verwendet werden und sind ebenfalls besonders für Aufgaben wie \lingo{Named Entity Recognition}\index{Named Entity Recognition} und damit \nom{Topic-Tracking}\index{Topic-Tracking} nützlich. Beim Aufbau eines Wörterbuches\index{Wörterbuch} dagegen sollten Personen in der Regel nicht aufgenommen werden.
  \item[\javaid{ORGANISATION}:] Organisationen wie Firmen, Regierung{s-} und \nospell{Nicht\-regierungs\-organisationen} (NGOs), etc. Auch solche Einträge sind besonders für Aufgaben wie \lingo{Named Entity Recognition}\index{Named Entity Recognition} und damit \nom{Topic-Tracking}\index{Topic-Tracking} nützlich. Beim Aufbau eines Wörterbuches\index{Wörterbuch} dagegen sollten Organisationen meist nicht aufgenommen werden.
  \item[\javaid{NAME}:] Vor- oder Nachnamen an sich (nicht die betreffenden Personen). Solche Einträge  könnten für den Aufbau \bzw die Erweiterung eines \nom{Namenslexikons} verwendet werden und sind unter Umständen für Aufgaben wie \lingo{Named Entity Recognition}\index{Named Entity Recognition} und damit \nom{Topic-Tracking}\index{Topic-Tracking} nützlich. Beim Aufbau eines Wörterbuches\index{Wörterbuch} dagegen können Namen im Allgemeinen ausgelassen werden.
  \item[\javaid{TIME}:] Zeitperioden (wie \zB \wwconcept{15. Jahrhundert}) oder auch ein wiederkehrendes Datum (wie \zB \wwconcept{6. April}). Solche Einträge  könnten für den Aufbau \bzw die Erweiterung eines \nom{Almanachs}\index{Almanach} verwendet werden. Beim Aufbau eines Wörterbuches\index{Wörterbuch} dagegen sollten sie nicht verwendet werden.
  \item[\javaid{NUMBER}:] Zahlen an sich. Diese können beim Aufbau eines Wörterbuches in der Regel übergangen werden.
  \item[\javaid{LIFEFORM}:] Lebensformen, also biologische \nom{Taxa}\index{Taxon}, Klassen, Familien, Rassen usw. von Tieren und Pflanzen. Diese können beim Aufbau eines Wörterbuches\index{Wörterbuch} unter Umständen ausgelassen werden.
  \item[\javaid{OTHER}:] Sonstige Konzepte --- alle, denen keiner der oben angegebenen Typen zugeordnet werden konnte.
  \item[\javaid{ALIAS}:] Pseudo-Konzept für Aliase; wird nur aus technischen Gründen vorübergehend benötigt (\rr{sec:wikitext:magicwords}) und sollte im fertigen Thesaurus nicht vorkommen.
\end{description}

Die Zuordnung von Konzepttypen wird in \rr{sec:eval-klassifikation} evaluiert.

\section{Links}
\label{sec:analyzer:links}

Wiki-Links (\rr{sec:wikitext:links}) sind eine reiche Informationsquelle: sie bieten Zugang zu menschlichem Urteil darüber, welche Konzepte für das Verständnis eines anderen Konzeptes relevant sind (durch Querverweise, \q{WP:V} sowie \qqq{zesch2007aaw}{Ponzetto:2007}{GregorowiczKramer2006}), sowie welche Bezeichnung (Term) für welches Konzept geeignet ist (durch den Link-Text, \q{Mihalcea2007} sowie \qqq{craswell:esf}{Eiron2003at}{Kraft2004at}).
Die Methode \javaid{WikiTextAnalyzer.extractLinks} extrahiert alle Wiki-Links aus dem gegebenen Text. Der Text sollte bereits mit \javaid{stripClutter} bereinigt worden sein. Der genaue Algorithmus ist in \rrr[Anhang]{alg:makeLink} beschrieben.

Die \javaid{WikiLink}-Objekte, die dabei erzeugt werden, haben insbesondere die folgenden Eigenschaften (vergleiche \rr{sec:wikitext:links}):
\begin{description}
 \item[\javaid{interwiki}:] der Präfix für Interwiki-Links (\javaid{null}, falls der Link kein Interwiki-Link ist).
 \item[\javaid{namespace}:] die ID des Namensraumes, in den der Link verweist, wie von \javaid{WikiTextAnalyzer.getNamespaceId} geliefert (siehe auch \rr{usage:wiki-config}). 
 \item[\javaid{page}:] der Titel der Seite, auf die der Link zeigt (ohne Namensraum, Interwiki-Präfix, Abschnitt, etc.) in normalisierter Form (also mit Unterstrichen statt Leerzeichen und dem ersten Buchstaben als Großbuchstaben).
 \item[\javaid{section}:] der Abschnitts-Anker\index{Anker} (\bzw das "`\nom{Dokumentenfragment}"' nach der URL-Spezifikation) auf der Zielseite in normalisierter Form (oder \javaid{null}, wenn auf keinen Abschnitt verwiesen wird).
 \item[\javaid{text}:] der verwendete Link-Text\index{Link-Text} (Label\index{Label}). Falls nicht explizit ein Link-Text angegeben wurde, so wird der Text, der zur Angabe des Link-Zieles verwendet wurde, als Link-Text angenommen und gegebenenfalls der Link-Trail angehängt. Ist der Link ein Kategorisierungslink, hat also die Eigenschaft \javaid{magic} den Wert \javaid{CATEGORY}, so gibt die Eigenschaft \javaid{text} den \lingo{Sort-Key} für die Kategorisierung an.
 \item[\javaid{impliedText}:] ist \javaid{true} genau dann, wenn der Text nicht explizit angegeben wurde, sondern aus dem Link-Ziel geschlossen wurde.
 \item[\javaid{magic}:] gibt an, inwiefern der Link "`magisch"' ist, dass heißt, ob er eine spezielle Semantik hat. Die möglichen Werte werden von \javaid{WikitextAnalyzer.LinkMagic} definiert:

  \begin{description}
    \item[\javaid{NONE}:]     "`normaler"' Wiki-Link, keine "`Magic"'.
    \item[\javaid{CATEGORY}:] Zuweisung einer Kategorie an die Seite, die den Link enthält.
    \item[\javaid{IMAGE}:]    Einbinden eines Bildes; da Bilder schon von \javaid{stripClutter} entfernt werden, sollte das hier nicht vorkommen.
    \item[\javaid{LANGUAGE}:] Verknüpfung mit einer (semantisch) äquivalenten Seite in einer anderen Sprache.
%    \item[\javaid{REDIRECT}:] Weiterleitung (Alias-Definition); Da Weiterleitungen von vorn herein erkannt und gesondert behandelt werden, sollte das hier nicht vorkommen.
  \end{description}

 Dabei ist zu beachten, dass \zB ein Link in den Kategorie-Namensraum auch ohne die \nospell{Kategorisierungs\-semantik} vorkommen kann, nämlich genau dann, wenn er mit einem führenden Doppelpunkt definiert wurde, also in der Form \wikitext{[[:Category:Baum]]}. Dasselbe gilt analog für Links in den Image-Namensraum und auch für Links mit Interwiki-Präfix (siehe auch \rr{sec:wikitext:links}).

\end{description}

Die so extrahierten Links dienen, je nach ihrer \javaid{magic}, zur Bestimmung der semantischen Verwandtheit von Konzepten (\rr{transform:import-finish}), dem Zusammenführen von äquivalenten Konzepten aus unterschiedlichen Wikipedias (\rr{sec:Merging}), dem Aufbau der Subsumtionsrelation oder, unter Verwendung des Link-Textes, der Zuordnung von Termen zu Konzepten (\rr{transform:import}). Sie sind damit von zentraler Bedeutung für den Aufbau des Thesaurus, da sie nahezu alle betrachteten Relationen direkt oder indirekt definieren. 

\section{Extraktion von Glossen}
\label{sec:analyzer:glossen}

Definitionssätze (\lingo{Glossen}\index{Glosse}) können in einem Artikel recht einfach gefunden werden: per Konvention \q{WP:WSIGA} definiert der erste Satz immer den Gegenstand des Artikels. Den ersten Satz zu finden, ist allerdings nicht ganz trivial: aus dem bereinigten Text (nach \javaid{WikiTextAnalyzer.stripClutter}) wird zunächst der erste Absatz extrahiert, also der Text bis zur ersten leeren Zeile, oder der ersten Überschrift. Diese Arbeit erledigt die Methode \javaid{WikiTextAnalyzer.extractFirstParagraph}, welche auf \javaid{WikiConfiguration.extractParagraphMangler} zurückgreift. Per Default ist das eine speziell konfigurierte Instanz von \javaid{WikiTextAnalyzer.BoxStripMangler}, die nach Entfernen aller Blöcke (siehe \rr{sec:analyzer:bereinigen}) nur den ersten Absatz liefert --- der Rest des Textes wird aus Effizienzgründen nicht weiter behandelt.

Der so gewonnene erste Absatz wird dann mittels \javaid{WikiTextAnalyzer.stripMarkup} weiter bereinigt, so dass nur noch reiner Text ohne Markup übrig bleibt. Zusätzlich werden weitere Elemente mittels \javaid{LanguageConfiguration.sentenceManglers} entfernt, per Default insbesondere alle geklammerten Teilsätze. Aus dem bereinigten ersten Absatz wird dann der erste Satz als Glosse extrahiert. Der Algorithmus für diese Aufgabe ist in \rrr[Anhang]{alg:extractFirstSentence} detailliert beschrieben.

\label{p:triviale-glosse} Bei den so extrahierten Sätzen handelt es sich fast immer um Definitionssätze der Form \txt{X ist/sind/war (ein) Y}; allerdings kommt es vor, dass die Aussagekraft der Definition zu wünschen übrig lässt --- zum Beispiel lautet der Einleitungssatz für den Artikel \wikipage{Weltoffenheit}\footnote{In der deutschsprachigen Wikipedia, zum Zeitpunkt des Erstellens dieser Arbeit:\\\uref{http://de.wikipedia.org/w/index.php?title=Weltoffenheit&oldid=44584462}}: \txt{Weltoffenheit ist ein Begriff aus der philosophischen Anthropologie.} --- dieser Satz beschreibt nicht, was \wwconcept{Weltoffenheit} \emph{ist}, sondern lediglich, welcher Fachbereich sie untersucht. Aber selbst diese Art der Ungenauigkeit ist verhältnismäßig selten (\rr{ch:eval-analyse}). Eine mögliche Lösung wäre es, den ganzen ersten Absatz als Definition zu verwenden oder zumindest zusätzlich vorzuhalten, wie es in der Literatur vorgeschlagen wurde (vergleiche die Arbeiten in \rr{sec:stand:thesaurus}, \zB \q{Strube2006}). Im Falle des Artikels \wikipage{Weltoffenheit} wäre das zielführend, der Absatz lautet als Ganzes: 

\begin{quote}
\it Weltoffenheit ist ein Begriff aus der philosophischen Anthropologie. Er bezeichnet die Entbundenheit des Menschen von organischen Zwängen (Trieben) und seiner unmittelbaren Umwelt und betont seine Öffnung hin zu einer von ihm selbst hervorgebrachten kulturellen Welt. Hiermit einher geht, dass der Mensch ohne festgelegte Verhaltensmuster geboren wird und sich Verhaltenssicherheit in der Welt immer erst erwerben muss.
\end{quote}

Der erste Absatz enthält aber fast immer auch Text, der nicht Teil der Definition des Artikelgegenstandes ist: der zweite Satz in obigem Beispiel vervollständigt die Definition, der dritte jedoch ist schon eine Einlassung, die über eine bloße Definition hinausgeht. Immer den gesamten Absatz zu verwenden würde also das \lingo{Signal-Rausch-Verhältnis} in Bezug auf die Forderung, eine Definition des Konzeptes zu finden (\rr{sec:aufgaben}), verschlechtern. 

Das oben beschriebene Verfahren zur Extraktion von Glossen wird in \rr{ch:eval-glossen} evaluiert.
 
\section{Terme}
\label{sec:analyzer:terme}

Terme\index{Term}, die als Bezeichnungen für ein bestimmtes Konzept dienen, werden aus verschiedenen Quellen bestimmt, zum Beispiel aus dem Link-Text (siehe \rr{sec:analyzer:links}, vergleiche \q{Mihalcea2007}), aus Weiterleitungen (siehe \rr{p:type:redirect}) oder aus Begriffsklärungen (siehe \rr{sec:analyzer:disambig}). Aber auch aus dem Artikel selbst können schon Bezeichnungen\index{Bezeichnung} gewonnen werden: das ist die Aufgabe der Methode \javaid{PlainTextAnalyzer.determinePageTerms} (\bzw \javaid{PlainTextAnalyzer.getPageTerms}). Sie bestimmt Bezeichnungen für das Konzept des Artikels per Default aus zwei Quellen:

\begin{enumerate}
  \item Aus dem "`Basisnamen"' des Artikels, wie er von \javaid{PlainTextAnalyzer.determineBaseName} zurückgegeben wird. Der "`Basisname"' ist der Titel des Artikels, der mittels der Muster in \javaid{WikiConfiguration.titleSuffixPattern} und \javaid{WikiConfiguration.titlePrefixPattern} bereinigt wurde --- per Default wird dabei insbesondere der geklammerte Suffix vom Titel entfernt, falls vorhanden: aus \wikipage{Leiter\_(Gerät)} wird also \wwterm{Leiter}. Um die entsprechenden Terme zu erhalten, werden außerdem alle Unterstriche durch Leerzeichen ersetzt, aus \wikipage{Albert\_Einstein} wird also \wwterm{Albert Einstein}.
  \item Aus dem \lingo{Magic Word} \wikitext{DISPLAYTITLE}, das eine alternative Bezeichnung für das Konzept definiert (siehe auch \rr{sec:wikitext:magicwords}). Diese \lingo{Magic Words} werden bei der Extraktion der Vorlagen evaluiert (siehe \rr{sec:analyse:vorlagen}).
\end{enumerate}

Zusätzliche Terme können aus den \lingo{Sort-Keys} bestimmt werden, die bei der Kategorisierung der Seite verwendet wurden (zugänglich über die Methode \javaid{WikiPage.getCategories}) sowie aus der Verwendung des \lingo{Magic Words} \wikitext{DEFAULTSORT} (zugänglich über die Methode \javaid{PlainTextAnalyzer.getDefaultSortKey}), siehe \rr{sec:wikitext:links} und \rr{sec:wikitext:magicwords}. 

Der Analyzer definiert außerdem eine Methode zur Bestimmung "`schlechter"' Terme, nämlich \javaid{WikiTextAnalyzer.isBadTerm}. Per Default ist das lediglich ein "`Sanity-Check"' der Länge des Terms: diese wird mit \javaid{WikiConfiguration.minTermLength} und \javaid{WikiConfiguration.maxTermLength} verglichen. 

%Wärend des Imports (\rr{transform:import}) wird aber in einigen Zusammenhängen ein \javaid{WikiTextSniffer} verwendet, um Terme, die noch Wiki-Markup enthalten, von der Verarbeitung auszuschließen. %no it doesn't. does it?\ldots

\section{Begriffsklärungsseiten}
\label{sec:analyzer:disambig}
 Begriffsklärungsseiten\index{Begriffsklärung} (Disambiguierungen\index{Disambiguierung}) dienen in der Wikipedia dazu, die möglichen Bedeutungen\index{Bedeutung} eines Terms aufzuzählen \q{WP:BKL}. Um daraus eine Liste von Konzepten zu erzeugen, müssen aus dem Wiki-Text der Begriffsklärungsseite alle Wiki-Links (und damit alle Konzepte) ausgelesen werden, die auf einen Artikel verweisen, der eine der möglichen Bedeutungen beschreibt. Das Problem besteht darin, dass Begriffsklärungsseiten noch weitere Wiki-Links enthalten können, insbesondere Querverweise und Links auf Kontext-Begriffe (vergleiche die in \rr{sec:stand:thesaurus} beschriebenen Arbeiten, insbesondere \qqq{DakkaCucerzan2008}{zesch2007aaw}{Ponzetto:2007}).

Diejenigen Links auf der Begriffsklärungsseite zu finden, die auf die einzelnen Bedeutungen verweisen, ist Aufgabe der Methode \javaid{WikiTextAnalyzer.extractDisambigLinks}. Der Standard-Ansatz  macht dabei zwei wesentliche Annahmen:

\begin{itemize}
  \item die Begriffsklärungsseite enthält eine Liste von Bedeutungen derart, dass in jeder (relevanten) Zeile (höchstens) ein Link steht, der auf eine Bedeutung\index{Bedeutung} des zu klärenden Terms zeigt.
  \item enthält eine Zeile mehr als einen Link, so ist der Link mit der größten lexikographischen Ähnlichkeit zu dem zu klärenden Term auch der, der auf eine Bedeutung dieses Terms verweist.
\end{itemize}

Auf Basis dieser Annahmen wurde der Algorithmus zur Extraktion der Bedeutungslinks aus der Begriffsklärungsseite entwickelt, der in \rr{alg:extractDisambigLinks} beschrieben ist. Die Ergebnisse dieses Verfahrens werden in \rr{ch:eval-bkl} evaluiert.

Auf diese Weise werden aus Wiki-Seiten diejenigen Eigenschaften extrahiert, die für den Aufbau eines (zunächst monolingualen) Thesaurus relevant sind. Diese Eigenschaften werden durch ein \javaid{WikiPage}-Objekt repräsentiert und von der Klasse \javaid{ConceptImporter} dann hinsichtlich ihrer Bedeutung für das Thesaurusmodell interpretiert (siehe \rr{transform:import}). Die so gewonnenen Entitäten und Relationen werden in einem lokalen Datensatz abgelegt (siehe \rr{model:lokales-datenmodell} und \rr{sec:LocalConceptStoreBuilder}). 

\later{zusammenfassung des Kapitels: package, klassen, konfiguration}
