| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- \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}
|