2013-12-28 18:52:58 +01:00
|
|
|
\subsection{Überblick}
|
2013-12-27 15:16:41 +01:00
|
|
|
DYCOS (\underline{DY}namic \underline{C}lassification
|
|
|
|
algorithm with c\underline{O}ntent and \underline{S}tructure) ist ein
|
|
|
|
Knotenklassifizierungsalgorithmus, der Ursprünglich in \cite{aggarwal2011} vorgestellt
|
2013-12-28 18:52:58 +01:00
|
|
|
wurde. Er klassifiziert Knoten, indem mehrfach Random Walks startend
|
|
|
|
bei dem zu klassifizierenden Knoten gemacht werden und die Labels
|
2013-12-29 19:06:20 +01:00
|
|
|
der besuchten Knoten gezählt werden. Das Label, das am häufigsten
|
2014-01-11 19:27:50 +01:00
|
|
|
vorgekommen ist, wird als Label gewählt.
|
|
|
|
DYCOS nutzt also die sog. Homophilie, d.~h. die Eigenschaft, dass
|
|
|
|
Knoten, die nur wenige Hops von einander entfernt sind, häufig auch
|
|
|
|
ähnlich sind \cite{bhagat}.
|
|
|
|
|
2013-12-29 19:06:20 +01:00
|
|
|
Der DYCOS-Algorithmus nimmt jedoch nicht einfach den Graphen für
|
|
|
|
dieses Verfahren, sondern erweitert ihn mit Hilfe der zur Verfügung
|
|
|
|
stehenden Texte.
|
2013-12-26 16:13:05 +01:00
|
|
|
|
2013-12-28 18:52:58 +01:00
|
|
|
Für diese Erweiterung wird zuerst wird Vokabular $W_t$ bestimmt, das
|
2013-12-29 19:06:20 +01:00
|
|
|
charakteristisch für eine Knotengruppe ist. Wie das gemacht werden kann
|
|
|
|
und warum nicht einfach jedes Wort in das Vokabular aufgenommen wird,
|
|
|
|
wird in Abschnitt~\ref{sec:vokabularbestimmung} erläutert.\\
|
|
|
|
Nach der Bestimmung des Vokabulars wird für
|
|
|
|
jedes Wort im Vokabular ein Wortknoten zum Graphen hinzugefügt. Alle
|
|
|
|
Knoten, die der Graph zuvor hatte, werden nun \enquote{Strukturknoten}
|
|
|
|
genannt.
|
2013-12-28 18:52:58 +01:00
|
|
|
Ein Strukturknoten $v$ wird genau dann mit einem Wortknoten $w \in W_t$
|
|
|
|
verbunden, wenn $w$ in einem Text von $v$ vorkommt.
|
2013-12-27 15:16:41 +01:00
|
|
|
|
2013-12-28 18:52:58 +01:00
|
|
|
\begin{figure}[htp]
|
|
|
|
\centering
|
|
|
|
\input{figures/graph-content-and-structure.tex}
|
|
|
|
\caption{Erweiterter Graph}
|
|
|
|
\label{fig:erweiterter-graph}
|
|
|
|
\end{figure}
|
2013-12-27 15:16:41 +01:00
|
|
|
|
2014-01-11 19:27:50 +01:00
|
|
|
Entsprechend werden zwei unterschiedliche Sprungtypen unterschieden,
|
|
|
|
die strukturellen Sprünge und inhaltliche Mehrfachsprünge:
|
|
|
|
|
|
|
|
\begin{definition}
|
|
|
|
Sei $G_{E,t} = (V_t, E_{S,t} \cup E_{W,t}, V_{L,t}, W_{t})$ der
|
|
|
|
um die Wortknoten $W_{t}$ erweiterte Graph.
|
|
|
|
|
|
|
|
Dann heißt das zufällige wechseln des aktuell betrachteten
|
|
|
|
Knoten $v \in V_t$ zu einem benachbartem Knoten $w \in V_t$
|
|
|
|
ein \textbf{struktureller Sprung}.
|
|
|
|
\end{definition}
|
|
|
|
|
|
|
|
Im Gegensatz dazu benutzten inhaltliche Mehrfachsprünge
|
|
|
|
tatsächlich die Grapherweiterung:
|
|
|
|
|
|
|
|
\begin{definition}
|
|
|
|
Sei $G_t = (V_t, E_{S,t} \cup E_{W,t}, V_{L,t}, W_{t})$ der
|
|
|
|
um die Wortknoten $W_{t}$ erweiterte Graph.
|
|
|
|
|
|
|
|
Dann heißt das zufällige wechseln des aktuell betrachteten
|
|
|
|
Knoten $v \in V_t$ zu einem benachbartem Knoten $w \in W_t$
|
|
|
|
und weiter zu Nachbar von $v' \in V_t$ von $w$
|
|
|
|
ein \textbf{inhaltlicher Mehrfachsprung}. $v'$ ist also genau
|
|
|
|
einen Sprung über einen Wortknoten $w$ von $v$ entfernt.
|
|
|
|
\end{definition}
|
|
|
|
|
2013-12-29 19:06:20 +01:00
|
|
|
Der DYCOS-Algorithmus betrachtet die Texte, die einem Knoten
|
2013-12-28 18:52:58 +01:00
|
|
|
zugeornet sind, als eine
|
|
|
|
Multimenge von Wörtern. Das heißt, zum einen wird nicht auf die
|
|
|
|
Reihenfolge der Wörter geachtet, zum anderen wird bei Texten
|
|
|
|
eines Knotens nicht zwischen verschiedenen Texten unterschieden.
|
2013-12-29 19:06:20 +01:00
|
|
|
Jedoch wird die Anzahl der Vorkommen jedes Wortes berücksichtigt.
|
2013-12-27 15:16:41 +01:00
|
|
|
|
2013-12-28 18:52:58 +01:00
|
|
|
\subsection{Datenstrukturen}
|
|
|
|
Zusätzlich zu dem gerichteten Graphen $G_t = (V_t, E_t, V_{L,t})$
|
|
|
|
verwaltet der DYCOS-Algorithmus zwei weitere Datenstrukturen:
|
|
|
|
\begin{itemize}
|
2013-12-29 19:06:20 +01:00
|
|
|
\item Für jeden Knoten $v \in V_t$ werden die vorkommenden Wörter,
|
|
|
|
die auch im Vokabular $W_t$ sind,
|
2013-12-28 18:52:58 +01:00
|
|
|
und deren Anzahl gespeichert. Das könnte z.~B. über ein
|
|
|
|
assoziatives Array geschehen. Wörter, die nicht in
|
|
|
|
Texten von $v$ vorkommen, sind nicht im Array. Für
|
|
|
|
alle vorkommenden Wörter ist der gespeicherte Wert zum
|
|
|
|
Schlüssel \enquote{Wort} die Anzahl der Vorkommen von
|
|
|
|
\enquote{Wort} in den Texten von $v$.
|
|
|
|
\item Für jedes Wort des Vokabulars $W_t$ wird eine Liste von
|
|
|
|
Knoten verwaltet, in deren Texten das Wort vorkommt.
|
2014-01-11 19:27:50 +01:00
|
|
|
\item An einigen Stellen macht ein assoziatives Array, auch
|
|
|
|
\enquote{dictionary} oder \enquote{map} genannt, sinn.
|
|
|
|
Zustätzlich ist es nützlich, wenn diese Datenstruktur für
|
|
|
|
unbekannte Schlüssel keinen Fehler ausgibt, sondern für diese
|
|
|
|
Schlüssel den Wert 0 annimmt. Eine solche Datenstruktur
|
|
|
|
wird in Python \texttt{defaultdict} genannt und ich werde
|
|
|
|
im Folgenden diese Benennung beibehalten.
|
2013-12-28 18:52:58 +01:00
|
|
|
\end{itemize}
|
2013-12-27 15:16:41 +01:00
|
|
|
|
2014-01-11 19:27:50 +01:00
|
|
|
\input{Sprungtypen}
|
|
|
|
\input{Vokabularbestimmung}
|
2013-12-28 18:52:58 +01:00
|
|
|
|
2014-01-11 19:27:50 +01:00
|
|
|
\subsection{Der Algorithmus}
|
|
|
|
Der DYCOS-Algorithmus verwendet nun für jeden Knoten der gelabelt wird
|
|
|
|
$r$ Random Walks der Länge $l$, wobei mit einer Wahrscheinlichkeit
|
|
|
|
$p_S$ ein struktureller $l$-Sprung und mit einer Wahrscheinlichkeit
|
|
|
|
von $(1-p_S)$ ein inhaltlicher $l$-Mehrfachsprung gemacht wird.
|
2013-12-28 18:52:58 +01:00
|
|
|
|
2014-01-11 19:27:50 +01:00
|
|
|
Die Vokabularbestimmung kann zu jedem Zeitpunkt $t$ durchgeführt
|
|
|
|
werden, muss es aber nicht.
|
2013-12-28 18:52:58 +01:00
|
|
|
|
2014-01-11 19:27:50 +01:00
|
|
|
Im Folgenden werde ich den DYCOS-Algorithmus als Pseudocode vorstellen.
|
|
|
|
Dafür benötigt man die beiden Hilfsfunktionen für den strukturellen
|
|
|
|
Sprung sowie den inhaltlichen Mehrfachsprung:
|
2013-12-27 15:16:41 +01:00
|
|
|
|
2013-12-27 19:14:51 +01:00
|
|
|
\begin{algorithm}[H]
|
2014-01-11 19:27:50 +01:00
|
|
|
\begin{algorithmic}[1]
|
2013-12-27 15:16:41 +01:00
|
|
|
\Require \\$\G_t = (\N_t, \A_t, \T_t)$ (Netzwerk),\\
|
|
|
|
$r$ (Anzahl der Random Walks),\\
|
|
|
|
$l$ (Länge eines Random Walks),\\
|
2014-01-11 19:27:50 +01:00
|
|
|
$p_s$ (Wahrscheinlichkeit eines strukturellen Sprungs),\\
|
|
|
|
$q$ (Anzahl der betrachteten Knoten nach der Aggregatanalyse)
|
2013-12-27 15:16:41 +01:00
|
|
|
\Ensure Klassifikation von $\N_t \setminus \T_t$\\
|
2013-12-29 19:06:20 +01:00
|
|
|
\\
|
|
|
|
|
|
|
|
\ForAll{Knoten $v$ in $\N_t \setminus \T_t$}
|
2014-01-11 19:27:50 +01:00
|
|
|
\State $d \gets $ defaultdict
|
2013-12-29 19:06:20 +01:00
|
|
|
\For{$i$ von $1$ bis $r$}
|
2014-01-11 19:27:50 +01:00
|
|
|
\State $w \gets v$
|
|
|
|
\For{$j$ von $1$ bis $l$}
|
|
|
|
\State $sprungTyp \gets \Call{random}{0, 1}$
|
|
|
|
\If{$sprungTyp \leq p_S$}
|
|
|
|
\State $w \gets$ \Call{SturkturellerSprung}{$w$}
|
|
|
|
\Else
|
|
|
|
\State $w \gets$ \Call{InhaltlicherMehrfachsprung}{$w$}
|
|
|
|
\EndIf
|
|
|
|
\State $w \gets v.\Call{GetLabel}{ }$ \Comment{Zähle das Label}
|
|
|
|
\State $d[w] \gets d[w] + 1$
|
|
|
|
\EndFor
|
2013-12-27 15:16:41 +01:00
|
|
|
\EndFor
|
2014-01-05 10:35:19 +01:00
|
|
|
|
2014-01-11 19:27:50 +01:00
|
|
|
\If{$d$ ist leer} \Comment{Es wurde kein gelabelter Knoten gesehen}
|
|
|
|
\State $M_H \gets \Call{HäufigsteLabelImGraph}{ }$
|
2014-01-05 10:35:19 +01:00
|
|
|
\Else
|
|
|
|
\State $M_H \gets \Call{max}{d}$
|
|
|
|
\EndIf
|
2014-01-11 19:27:50 +01:00
|
|
|
\\
|
|
|
|
\State \Comment{Wähle aus der Menge der häufigsten Label $M_H$ zufällig eines aus}
|
|
|
|
\State $label \gets \Call{Random}{M_H}$
|
|
|
|
\State $v.\Call{AddLabel}{label}$ \Comment{und weise dieses $v$ zu}
|
2013-12-27 15:16:41 +01:00
|
|
|
\EndFor
|
|
|
|
\State \Return Labels für $\N_t \setminus \T_t$
|
|
|
|
\end{algorithmic}
|
|
|
|
\caption{DYCOS-Algorithmus}
|
|
|
|
\label{alg:DYCOS}
|
|
|
|
\end{algorithm}
|