2
0
Fork 0
mirror of https://github.com/MartinThoma/LaTeX-examples.git synced 2025-04-24 22:08:04 +02:00

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

This commit is contained in:
Martin Thoma 2013-12-27 19:14:51 +01:00
parent 5e142116aa
commit 29ec32d664
5 changed files with 110 additions and 42 deletions

View file

@ -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.

View file

@ -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}

View file

@ -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}

View file

@ -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}

View file

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