From 29ec32d664225e90cc0fdd5a88153528887550a5 Mon Sep 17 00:00:00 2001 From: Martin Thoma Date: Fri, 27 Dec 2013 19:14:51 +0100 Subject: [PATCH] =?UTF-8?q?Inhaltliche=20Mehrfachspr=C3=BCnge=20erl=C3=A4u?= =?UTF-8?q?tert;=20Erkl=C3=A4rung=20zur=20Vokabularbestimmung;=20Ausblick?= =?UTF-8?q?=20geschrieben?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- documents/DYCOS/Ausblick.tex | 17 +++++++ documents/DYCOS/DYCOS-Algorithmus.tex | 63 ++++++++--------------- documents/DYCOS/DYCOS.tex | 3 +- documents/DYCOS/Vokabularbestimmung.tex | 68 +++++++++++++++++++++++++ documents/DYCOS/mystyle.sty | 1 + 5 files changed, 110 insertions(+), 42 deletions(-) create mode 100644 documents/DYCOS/Vokabularbestimmung.tex diff --git a/documents/DYCOS/Ausblick.tex b/documents/DYCOS/Ausblick.tex index e69de29..a5ee46a 100644 --- a/documents/DYCOS/Ausblick.tex +++ b/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. diff --git a/documents/DYCOS/DYCOS-Algorithmus.tex b/documents/DYCOS/DYCOS-Algorithmus.tex index c3bcb6f..c93eb27 100644 --- a/documents/DYCOS/DYCOS-Algorithmus.tex +++ b/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} diff --git a/documents/DYCOS/DYCOS.tex b/documents/DYCOS/DYCOS.tex index 3a41389..7fd9268 100644 --- a/documents/DYCOS/DYCOS.tex +++ b/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} diff --git a/documents/DYCOS/Vokabularbestimmung.tex b/documents/DYCOS/Vokabularbestimmung.tex new file mode 100644 index 0000000..7838bbd --- /dev/null +++ b/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} + + diff --git a/documents/DYCOS/mystyle.sty b/documents/DYCOS/mystyle.sty index 740d747..b4c7c67 100644 --- a/documents/DYCOS/mystyle.sty +++ b/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}}