ソースを参照

Inhaltliche Mehrfachsprünge erläutert; Erklärung zur Vokabularbestimmung; Ausblick geschrieben

Martin Thoma 12 年 前
コミット
29ec32d664

+ 17 - 0
documents/DYCOS/Ausblick.tex

@@ -0,0 +1,17 @@
+Den sehr einfach aufgebauten DYCOS-Algorithmus kann man noch an
+vielen Punkten verbessern. So könnte man vor der Auswahl des
+Vokabulars jedes Wort auf den Wortstamm zurückführen.
+Dafür könnte zum Beispiel der \todo{Wo steht was über den?}{Porter-Stemming-Algorithmus} verwendet 
+werden. Durch diese Maßnahme wird das
+Vokabular kleiner gehalten, mehr Artikel können mit einander
+durch Vokabular verbunden werden und der Gini-Koeffizient wird ein
+besseres Maß für die Gleichheit von Texten.
+
+Eine weitere Verbesserungsmöglichkeit besteht in der textanalyse.
+Momentan ist diese noch sehr einfach gestrickt und ignoriert die
+Reihenfolge von Wortern beziehungsweise Wertungen davon. So könnte
+man den DYCOS-Algorithmus in einem sozialem Netzwerk verwenden wollen,
+in dem politische Parteiaffinität von einigen Mitgliedern angegeben
+wird um die Parteiaffinität der restlichen Mitglieder zu bestimmen.
+In diesem Fall macht es jedoch einen wichtigen Unterschied, ob jemand
+über eine Partei gutes oder schlechtes schreibt.

+ 22 - 41
documents/DYCOS/DYCOS-Algorithmus.tex

@@ -25,7 +25,7 @@ des Netzwerks für jeden der $l$ Schritte benutzt.
 
 Ein $l$-Sprung heißt inhaltlich, wenn er die Wörter benutzt.
 
-\begin{algorithm}[h]
+\begin{algorithm}[H]
     \begin{algorithmic}
         \Require \\$\G_t = (\N_t, \A_t, \T_t)$ (Netzwerk),\\
                  $r$ (Anzahl der Random Walks),\\
@@ -49,45 +49,26 @@ Ein $l$-Sprung heißt inhaltlich, wenn er die Wörter benutzt.
 \label{alg:DYCOS}
 \end{algorithm}
 
-\subsection{Vokabularbestimmung}\label{sec:vokabularbestimmung}
-Da die größe des Vokabulars die Datenmenge signifikant beeinflusst,
-liegt es in unserem Interesse so wenig Wörter wie möglich ins
-Vokabular aufzunehmen. Insbesondere sind Wörter nicht von Interesse,
-die in fast allen Texten vorkommen, wie im Deutschen z.~B.
-\enquote{und}, \enquote{mit} und die Pronomen.
+\subsection{Inhaltliche Mehrfachsprünge}
+Es ist nicht sinnvoll, direkt von einem strukturellem Knoten 
+$v \in \N_t$ zu einem mit $v$ verbundenen Wortknoten $w$ zu springen
+und von diesem wieder zu einem verbundenem strutkurellem Knoten 
+$v' \in \N_t$. Würde man dies machen, wäre zu befürchten, dass
+aufgrund von Polysemen die Qualität der Klassifizierung verringert
+wird. So hat \enquote{Brücke} im Deutschen viele Bedeutungen.
+Gemeint sein können z.~B. das Bauwerk, das Entwurfsmuster der
+objektorientierten Programmierung oder ein Teil des Gehirns.
 
-Nun kann man manuell eine Liste von zu beachtenden Wörtern erstellen
-oder mit Hilfe des Gini-Koeffizienten automatisch ein Vokabular erstellen.
-Der Gini-Koeffizient ist ein statistisches Maß, das die Ungleichverteilung
-bewertet. Er ist immer im Intervall $[0,1]$, wobei $0$ einer 
-Gleichverteilung entspricht und $1$ der größt möglichen Ungleichverteilung.
+Deshalb wird für jeden Knoten $v$, von dem aus man einen inhaltlichen
+Mehrfachsprung machen will folgendes vorgehen gewählt:
+\begin{enumerate}
+    \item Gehe alle in $v$ startenden Random Walks der Länge 2 durch
+          und erstelle eine Liste $L$, der erreichbaren Knoten $v'$. Speichere
+          außerdem, durch wie viele Pfade diese Knoten $v'$ jeweils erreichbar sind.
+    \item Betrachte im folgenden nur die Top-$q$ Knoten, wobei $q \in \mathbb{N}$
+          eine zu wählende Konstante des Algorithmus ist.
+    \item Wähle mit Wahrscheinlichkeit $\frac{\Call{Anzahl}{v'}}{\sum_{w \in L} \Call{Anzahl}{v'}}$
+          den Knoten $v'$ als Ziel des Mehrfachsprungs.
+\end{enumerate}
 
-Sei nun $n_i(w)$ die Häufigkeit des Wortes $w$ in allen Texten mit 
-dem $i$-ten Label.
-\todo{darf ich hier im Nenner 1 addieren?}
-\begin{align}
-    p_i(w) &:= \frac{n_i(w)}{\sum_{j=1}^{|\L_t|} n_j(w)} &\text{(Relative Häufigkeit des Wortes $w$)}\\
-    G(w)   &:= \sum_{j=1}^{|\L_t|} p_j(w)^2              &\text{(Gini-Koeffizient von $w$)}
-\end{align}
-In diesem Fall ist $G(w)=0$ nicht möglich, da zur Vokabularbestimmung
-nur Wörter betrachtet werden, die auch vorkommen.
-
-\begin{algorithm}[h]
-    \begin{algorithmic}
-        \Require \\
-                 $\T_t$ (Knoten mit Labels),\\
-                 $\L_t$ (Labels),\\
-                 $f:\T_t \rightarrow \L_t$ (Label-Funktion),\\
-                 $m$ (Gewünschte Vokabulargröße)
-        \Ensure  $\M_t$ (Vokabular)\\
-
-        \State $S_t \gets \Call{Sample}{\T_t}$ \Comment{Wähle eine Teilmenge $S_t \subseteq \T_t$ aus}
-        \State $\M_t \gets \bigcup_{v \in S_t} \Call{getText}{v}$
-        \ForAll{Wort $w \in \M_t$}
-            \State $w$.gini $\gets$ 
-        \EndFor
-        \State \Return $\M_t$
-    \end{algorithmic}
-\caption{Vokabularbestimmung}
-\label{alg:vokabularbestimmung}
-\end{algorithm}
+\input{Vokabularbestimmung}

+ 2 - 1
documents/DYCOS/DYCOS.tex

@@ -20,7 +20,8 @@
 \usepackage{cite}
 \usepackage{parskip}
 \usepackage[framed,amsmath,thmmarks,hyperref]{ntheorem}
-\usepackage{algorithm,algpseudocode}
+\usepackage{algorithm}
+\usepackage[noend]{algpseudocode}
 \usepackage{csquotes}
 \usepackage[colorinlistoftodos]{todonotes}
 \usepackage{mystyle}

+ 68 - 0
documents/DYCOS/Vokabularbestimmung.tex

@@ -0,0 +1,68 @@
+\subsection{Vokabularbestimmung}\label{sec:vokabularbestimmung}
+Da die größe des Vokabulars die Datenmenge signifikant beeinflusst,
+liegt es in unserem Interesse so wenig Wörter wie möglich ins
+Vokabular aufzunehmen. Insbesondere sind Wörter nicht von Interesse,
+die in fast allen Texten vorkommen, wie im Deutschen z.~B.
+\enquote{und}, \enquote{mit} und die Pronomen.
+
+Nun kann man manuell eine Liste von zu beachtenden Wörtern erstellen
+oder mit Hilfe des Gini-Koeffizienten automatisch ein Vokabular erstellen.
+Der Gini-Koeffizient ist ein statistisches Maß, das die Ungleichverteilung
+bewertet. Er ist immer im Intervall $[0,1]$, wobei $0$ einer 
+Gleichverteilung entspricht und $1$ der größt möglichen Ungleichverteilung.
+
+Sei nun $n_i(w)$ die Häufigkeit des Wortes $w$ in allen Texten mit 
+dem $i$-ten Label.
+\todo{darf ich hier im Nenner 1 addieren?}
+\begin{align}
+    p_i(w) &:= \frac{n_i(w)}{\sum_{j=1}^{|\L_t|} n_j(w)} &\text{(Relative Häufigkeit des Wortes $w$)}\\
+    G(w)   &:= \sum_{j=1}^{|\L_t|} p_j(w)^2              &\text{(Gini-Koeffizient von $w$)}
+\end{align}
+In diesem Fall ist $G(w)=0$ nicht möglich, da zur Vokabularbestimmung
+nur Wörter betrachtet werden, die auch vorkommen.
+
+Ein Vorschlag, wie die Vokabularbestimmung implementiert werden kann,
+ist als Pseudocode mit Algorithmus~\ref{alg:vokabularbestimmung}
+gegeben. Dieser Algorithmus benötigt neben dem Speicher für den
+Graphen, die Texte sowie die $m$ Vokabeln noch $\mathcal{O}(|\text{Verschiedene Wörter in } S_t| \cdot (|\L_t| + 1))$
+Speicher. Die Average-Case Zeitkomplexität beträgt 
+$\mathcal{O}(|\text{Wörter in } S_t|)$, wobei dazu die Vereinigung
+von Mengen $M,N$ in $\mathcal{O}(\min{|M|, |N|})$ sein muss.
+
+\begin{algorithm}[H]
+    \begin{algorithmic}
+        \Require \\
+                 $\T_t$ (Knoten mit Labels),\\
+                 $\L_t$ (Labels),\\
+                 $f:\T_t \rightarrow \L_t$ (Label-Funktion),\\
+                 $m$ (Gewünschte Vokabulargröße)
+        \Ensure  $\M_t$ (Vokabular)\\
+
+        \State $S_t \gets \Call{Sample}{\T_t}$ \Comment{Wähle eine Teilmenge $S_t \subseteq \T_t$ aus}
+        \State $\M_t \gets \bigcup_{v \in S_t} \Call{getTextAsSet}{v}$ \Comment{Menge aller Wörter}
+        \State $cLabelWords \gets (|\L_t|+1) \times |\M_t|$-Array, mit 0en initialisert\\
+
+        \ForAll{$v \in \T_t$} \Comment{Gehe jeden Text Wort für Wort durch}
+            \State $i \gets \Call{getLabel}{v}$
+            \ForAll{$(word, occurences) \in \Call{getTextAsMultiset}{v}$}
+                \State $cLabelWords[i][word] \gets cLabelWords[i][word] + occurences$
+                \State $cLabelWords[i][|\L_t|] \gets cLabelWords[i][|\L_t|] + occurences$
+            \EndFor
+        \EndFor
+        \\
+        \ForAll{Wort $w \in \M_t$}
+            \State $p \gets $ Array aus $|\L_t|$ Zahlen in $[0, 1]$
+            \ForAll{Label $i \in \L_t$}
+                \State $p[i] \gets \frac{cLabelWords[i][w]}{cLabelWords[i][|\L_t|]}$
+            \EndFor
+            \State $w$.gini $\gets$ \Call{sum}{{\sc map}({\sc square}, $p$)}
+        \EndFor
+
+        \State $\M_t \gets \Call{SortDescendingByGini}{\M_t}$
+        \State \Return $\Call{Top}{\M_t, m}$
+    \end{algorithmic}
+\caption{Vokabularbestimmung}
+\label{alg:vokabularbestimmung}
+\end{algorithm}
+
+

+ 1 - 0
documents/DYCOS/mystyle.sty

@@ -22,3 +22,4 @@
 \renewcommand{\algorithmicrequire}{\textbf{Input:}}
 \renewcommand{\algorithmicensure}{\textbf{Output:}}
 \renewcommand{\algorithmicforall}{\textbf{for each}}
+\renewcommand{\algorithmicprocedure}{\textbf{function}}