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:
parent
5e142116aa
commit
29ec32d664
5 changed files with 110 additions and 42 deletions
|
@ -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.
|
|
@ -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}
|
||||
|
|
|
@ -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
documents/DYCOS/Vokabularbestimmung.tex
Normal file
68
documents/DYCOS/Vokabularbestimmung.tex
Normal 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}
|
||||
|
||||
|
|
@ -22,3 +22,4 @@
|
|||
\renewcommand{\algorithmicrequire}{\textbf{Input:}}
|
||||
\renewcommand{\algorithmicensure}{\textbf{Output:}}
|
||||
\renewcommand{\algorithmicforall}{\textbf{for each}}
|
||||
\renewcommand{\algorithmicprocedure}{\textbf{function}}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue