diff --git a/Dokumentation/3_2_Datenauslagerung_Generator.tex b/Dokumentation/3_2_Datenauslagerung_Generator.tex index 6acb6fddb5373edc680c44f291646773a922cd38..b71c793278938057ac3d6970b03c58f73e5f2f3e 100644 --- a/Dokumentation/3_2_Datenauslagerung_Generator.tex +++ b/Dokumentation/3_2_Datenauslagerung_Generator.tex @@ -18,7 +18,7 @@ Dies könnte mit 8GB RAM etwas knapp werden, jedoch stellt es bei 16GB gar kein Das Problem ist recht deutlich. Viele Personen hätten auf ihrem privaten PC vermutlich nicht einmal genug Festplattenspeicher für diese Datenmenge, geschweige denn Arbeitsspeicher. \\ Die Daten müssen bei der CNN-Methode also nur stückweise in den Arbeitsspeicher geladen werden, dann wird mit diesen trainiert und anschließend werden sie wieder aus dem Arbeitsspeicher gelöscht um Platz für die nächsten Daten zu machen. Dabei gibt es wieder verschiedene Ansätze. -\subsubsection{Erster Generator} +\subsubsection{Erster Generator}\label{subsubsec:simpleGen} %Erster Ansatz, sehr lange validierungszeit Ein möglicher Ansatz ist die rohen Daten nur schrittweise einzulesen und diese dann erst dem word2vec model zu übergeben um daraus einen Vektor zu machen. Dafür wird eine Funktion geschrieben, welche dann der fit Methode des eigentlichen machine learning models als Datensatz-parameter übergeben wird. Dabei wird in der Funktion die batchsize berücksichtigt, sodass stets die gewünschte Menge an Daten gleichzeitig in das model geladen werden. \begin{lstlisting} diff --git a/Dokumentation/3_umsetzung.tex b/Dokumentation/3_umsetzung.tex index 59924074c7295d847553c214d31e42ceb5279a95..a4cc99053023d89b62d83509013bbf3224c7127d 100644 --- a/Dokumentation/3_umsetzung.tex +++ b/Dokumentation/3_umsetzung.tex @@ -9,3 +9,4 @@ \input{silas/gensim.tex} \input{silas/w2vMean.tex} +\input{silas/w2vCNN.tex} diff --git a/Dokumentation/silas/daten_analyse.tex b/Dokumentation/silas/daten_analyse.tex index 95793a6e98aa4f291227618e4f02f95b2b5f4404..58a68c911b91bc5a70f414429edfb627cd83061b 100644 --- a/Dokumentation/silas/daten_analyse.tex +++ b/Dokumentation/silas/daten_analyse.tex @@ -72,7 +72,7 @@ print (nr_of_reviews)) Das Programm liefert \lstinline{8021122} zurück. -\subsubsection{Reviewlänge} +\subsubsection{Reviewlänge}\label{subsubsec:reviewlength} \begin{lstlisting}[inputencoding=latin1,caption={Programm zur ermittlung der Reviewlänge},label={list:rev_len}] import json import numpy as np diff --git a/Dokumentation/silas/gensim.tex b/Dokumentation/silas/gensim.tex index 176b7cf4475c785e4c50b5fd1b1483bea0a30aa0..d29b753f77b6402c7c6fdbaa353af03ce182268c 100644 --- a/Dokumentation/silas/gensim.tex +++ b/Dokumentation/silas/gensim.tex @@ -1,4 +1,4 @@ -\subsection{Word2Vec mit Gensim} +\subsection{Word2Vec mit Gensim}\label{subsection:gensim} Für das Trainieren des Word2Vec-Modells wird in dieser Arbeit die Open-Source-Library Gensim verwendet. diff --git a/Dokumentation/silas/w2vCNN.tex b/Dokumentation/silas/w2vCNN.tex new file mode 100644 index 0000000000000000000000000000000000000000..2ee4f1b00cdb587a0088e2214b5938900d0039eb --- /dev/null +++ b/Dokumentation/silas/w2vCNN.tex @@ -0,0 +1,67 @@ +\subsection{Word2Vec-CNN-Modell} +Ein convolutional neural network, kurz CNN, ist in der Lage, +lokale Muster in einer Sequenz zu erlernen und diese später +wiederzuerkennen, auch wenn diese an einer anderen Stelle auftreten. + +In diesem Modell wird eine Reihe an Wortvektoren an das CNN übergeben, das Extrahieren der Merkmale wird somit Teil des Optimierungsproblems. +\subsubsection{Implementierung} +Aufgrund des sehr hohen Speicherbedarfs wird der im Kapitel \ref{subsubsec:simpleGen} geschriebene Generator +verwendet. + +Hierfür muss jedoch zunächst die Funktion \lstinline{getSentenceVectorCNN} implementiert werden. + +\begin{lstlisting}[caption={Datentransformation},label={list:getSentenceVector}] +import numpy as np +from gensim import utils +from w2v_yelp_model import getWordVecMode + +model_path = "full_yelp_w2v_model" +modelW2V = getWordVecModel(model_path) + +def getSentenceVectorCNN(sentence): + split = utils.simple_preprocess(sentence) + wordVecs = np.zeros((72,100)) + i=0 + for word in split: + if i == 72: break + try: + wordVecs[i] = modelW2V.wv[word] + i += 1 + except: + pass + if np.all(wordVecs[5:]==0): + raise Exception('not enough words found in w2v model') + return wordVecs +\end{lstlisting} + +Zuerst wird in Zeile 5 die im Listing \ref{list:gw2v} geschriebene Funktion +\lstinline{getWordVecMode} aufgerufen, um das Word2Vec-Modell erhalten. + +Die Funktion \lstinline{getSentenceVectorCNN} in Zeile 7 nimmt eine Rezension entgegen und +transformiert diese in eine für das CNN verarbeitbare Form. +\wip{genauer erklären?} + +Dafür wird die Rezension in Zeile 8 tokenisiert, sodass in der variable +\lstinline{split} eine Liste der durch die Funktion \lstinline{utils.simple_preprocess} +vorverarbeiteten Wörter gespeichert ist. + +Danach wird in Zeile 9 das Numpy-Array wordVecs mit Nullen initialisiert. +Dieses Numpy-Array speichert die ersten 72 Wortvektoren der Rezension, +die Zahl 72 wurde aufgrund des im Kapitel \ref{subsubsec:reviewlength} berechneten +Median der Reviewlänge gewählt. + +Die for-Schleife in Zeile 11 durchläuft alle Wörter der Liste split und fügt diese, +falls sie im word2Vec-Modell vertreten sind, in das \lstinline{wordVecs} Array ein. + +Sind mehr als 72 Wörter in der Liste \lstinline{Split} wird die Schleife abgebrochen, +wenn das Array vollständig gefüllt ist. + +Sollten sich weniger als 72 Wörter in der Liste befinden, +so ist das Array bereits mit Nullen initialisiert. + +Dies kann als \noteable{Truncating} und \noteable{Padding} bezeichnet werden und +ist notwendig, +da das CNN eine feste Dimension der Eingangsdaten benötigt. + +Anschließend wird in Zeile 18 geprüft, ob weniger als 5 Wortvektoren in dem Array +stehen, ist dies der Fall, wird eine Exception geworfen. \ No newline at end of file diff --git a/Dokumentation/w2v.pdf b/Dokumentation/w2v.pdf index 49198f7d152fbe02b4872b5d23ae8ef097f367d3..394f259854660006eb8a7432d0e392f1404cb5ab 100644 Binary files a/Dokumentation/w2v.pdf and b/Dokumentation/w2v.pdf differ