{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Employee.ipynb", "provenance": [], "collapsed_sections": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "code", "metadata": { "id": "pCNyopPPqhYl" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "sohdybpH-qIe" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "qMycr31tBgRE" }, "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import seaborn as sns" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "KnLIYhusGRWO" }, "source": [ "**Mounting Google Drive**\n" ] }, { "cell_type": "code", "metadata": { "id": "nKqyCo9_xCEC", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "a1c050e1-306f-426a-b30d-44aaa3953979" }, "source": [ "from google.colab import drive\n", "drive.mount('/content/drive')\n" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "C-K07Bx8jHwK" }, "source": [ "dataF = pd.read_csv('/content/drive/MyDrive/sentiments - sentiments.csv')\n" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 341 }, "id": "A6pLuAnHjQNG", "outputId": "ed13af40-9af3-4fdd-fc32-8f64c7340a80" }, "source": [ "dataF[:2]" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0Unnamed: 0.1companylocationdatesjob-titlesummaryprosconsadvice-to-mgmtoverall-ratingswork-balance-starsculture-values-starscarrer-opportunities-starscomp-benefit-starssenior-mangemnet-starshelpful-countlinktextcleanTextPolarity Scoresentimentsentiments
0035googleDearborn, MINov 20, 2018Current Employee - Google SpecialistGoogleGoogle is one of the beast Company in the worldYou have to work hardnone5344541https://www.glassdoor.com/Reviews/Google-Revie...Google Google is one of the beast Company in t...google google one beast company world work har...-0.291667-1-1
1168googlenoneNov 19, 2018Former Employee - Anonymous EmployeeEngineersalary was fine but in line with other companieswork was boring. I disliked it.none3332320https://www.glassdoor.com/Reviews/Google-Revie...Engineer salary was fine but in line with othe...engineer salary fine line companies work borin...-0.261111-1-1
\n", "
" ], "text/plain": [ " Unnamed: 0 Unnamed: 0.1 company ... Polarity Score sentiment sentiments\n", "0 0 35 google ... -0.291667 -1 -1\n", "1 1 68 google ... -0.261111 -1 -1\n", "\n", "[2 rows x 23 columns]" ] }, "metadata": { "tags": [] }, "execution_count": 8 } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "F8X35HdieN8i", "outputId": "cf40a51f-c4a6-4914-a899-3bf086fc6d42" }, "source": [ "from collections import Counter\n", "Counter(dataF[\"sentiment\"])" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Counter({-1: 5064, 1: 5064})" ] }, "metadata": { "tags": [] }, "execution_count": 9 } ] }, { "cell_type": "code", "metadata": { "id": "vytJqu8PtdaD" }, "source": [ "#Ensemble Model" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "OqNZIv-zmALk" }, "source": [ "from sklearn.model_selection import train_test_split\n", "X_train, X_test, y_train, y_test = train_test_split(dataF[\"cleanText\"],dataF[\"sentiment\"].astype(int),test_size=0.25, random_state=20,shuffle=True)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "kz1iMpL5mAOz" }, "source": [ "from sklearn.feature_extraction.text import CountVectorizer\n", "# learn training data vocabulary, then use it to create a document-term matrix\n", "vect = CountVectorizer()\n", "# 3. fit\n", "# 4. transform training data\n", "X_train_dtf = vect.fit_transform(X_train)\n", "X_test_dtf = vect.transform(X_test)\n", "\n" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "nooxgOYTwyKV", "outputId": "2dbd578c-9842-4075-c4d8-ad32897e3336" }, "source": [ "from sklearn.feature_extraction.text import TfidfVectorizer\n", "vectorizer = TfidfVectorizer()\n", "X_train_tf = vectorizer.fit_transform(X_train)\n", "X_test_tf = vectorizer.transform(X_test)\n", "X_test_tf.toarray()" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([[0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.]])" ] }, "metadata": { "tags": [] }, "execution_count": 40 } ] }, { "cell_type": "code", "metadata": { "id": "tw864xpB2qtE" }, "source": [ "pip install zeugma\n" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "nGvQaKa82omK", "outputId": "b4b7f76e-f0c4-4793-ba91-b32727cceb48" }, "source": [ "from zeugma.embeddings import EmbeddingTransformer\n", "glove = EmbeddingTransformer('glove')\n", "X_train_g = glove.fit_transform(X_train)\n", "X_test_g = glove.transform(X_test)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "[==================================================] 100.0% 104.8/104.8MB downloaded\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "6jMm1KmnmPDy" }, "source": [ "from sklearn.metrics import accuracy_score\n", "from sklearn.metrics import classification_report\n", "from sklearn.metrics import confusion_matrix" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Ej44cwSbjMea", "outputId": "b417064a-9787-4489-acd9-c90d36f3467e" }, "source": [ "from sklearn.linear_model import LogisticRegression\n", "a=LogisticRegression(random_state=1000, solver='liblinear',multi_class='ovr',C=1.0)\n", "from sklearn.ensemble import RandomForestClassifier, VotingClassifier\n", "from sklearn.linear_model import SGDClassifier\n", "clf2= SGDClassifier(max_iter=1000, tol=1e-3)\n", "clf1= SVC(kernel='linear', C=1.0, random_state=500)\n", "#rfc = RandomForestClassifier(n_estimators=300, random_state=2,max_depth=300) \n", "eclf1 = VotingClassifier(estimators=[('a', a),('svc', clf1), ('lr', clf2)], voting='hard')\n", "eclf1.fit(X_train_g,y_train)\n", "etc_pred=eclf1.predict(X_test_g)\n", "print(accuracy_score(y_test,etc_pred))\n", "print(classification_report(y_test,etc_pred))\n", "print(confusion_matrix(y_test,etc_pred))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "0.8274091627172195\n", " precision recall f1-score support\n", "\n", " -1 0.83 0.83 0.83 1289\n", " 1 0.82 0.82 0.82 1243\n", "\n", " accuracy 0.83 2532\n", " macro avg 0.83 0.83 0.83 2532\n", "weighted avg 0.83 0.83 0.83 2532\n", "\n", "[[1072 217]\n", " [ 220 1023]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "F0FIHWCdjMhb" }, "source": [ "from sklearn.linear_model import LogisticRegression\n", "a=LogisticRegression(random_state=1000, solver='liblinear',multi_class='ovr',C=1.0)\n", "from sklearn.ensemble import RandomForestClassifier, VotingClassifier\n", "from sklearn.linear_model import SGDClassifier\n", "clf2= SGDClassifier(max_iter=1000, tol=1e-3)\n", "clf1= SVC(kernel='linear', C=1.0, random_state=500)\n", "#rfc = RandomForestClassifier(n_estimators=300, random_state=2,max_depth=300) \n", "eclf1 = VotingClassifier(estimators=[('a', a),('svc', clf1), ('lr', clf2)], voting='hard')\n", "eclf1.fit(X_train_dtf,y_train)\n", "etc_pred=eclf1.predict(X_test_dtf)\n", "print(accuracy_score(y_test,etc_pred))\n", "print(classification_report(y_test,etc_pred))\n", "print(confusion_matrix(y_test,etc_pred))" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "QpBc1-pWtkvR" }, "source": [ "from sklearn.linear_model import LogisticRegression\n", "a=LogisticRegression(random_state=1000, solver='liblinear',multi_class='ovr',C=1.0)\n", "from sklearn.ensemble import RandomForestClassifier, VotingClassifier\n", "from sklearn.linear_model import SGDClassifier\n", "clf2= SGDClassifier(max_iter=1000, tol=1e-3)\n", "clf1= SVC(kernel='linear', C=1.0, random_state=500)\n", "#rfc = RandomForestClassifier(n_estimators=300, random_state=2,max_depth=300) \n", "eclf1 = VotingClassifier(estimators=[('a', a),('svc', clf1), ('lr', clf2)], voting='hard')\n", "eclf1.fit(X_train_g,y_train)\n", "etc_pred=eclf1.predict(X_test_g)\n", "print(accuracy_score(y_test,etc_pred))\n", "print(classification_report(y_test,etc_pred))\n", "print(confusion_matrix(y_test,etc_pred))" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "SUsACLJhzjcT", "outputId": "7f3c0921-8f9c-447e-e821-8bb3a7202086" }, "source": [ "from sklearn import linear_model\n", "clf = SVC()\n", "# 3. train the model using X_train_dtm\n", "x=clf.fit(X_train_tf, y_train)\n", "# 4. make class predictions for X_test_dtm\n", "y_pred_class = clf.predict(X_test_tf)\n", "# calculate accuracy\n", "print(accuracy_score(y_test, y_pred_class))\n", "print(classification_report(y_test, y_pred_class))\n", "print(confusion_matrix(y_test, y_pred_class))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "0.9620853080568721\n", " precision recall f1-score support\n", "\n", " -1 0.95 0.98 0.96 1289\n", " 1 0.98 0.95 0.96 1243\n", "\n", " accuracy 0.96 2532\n", " macro avg 0.96 0.96 0.96 2532\n", "weighted avg 0.96 0.96 0.96 2532\n", "\n", "[[1259 30]\n", " [ 66 1177]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "xAIFuLb-3jRY" }, "source": [ "from sklearn import linear_model\n", "clf = SVC()\n", "# 3. train the model using X_train_dtm\n", "x=clf.fit(X_train_dtf, y_train)\n", "# 4. make class predictions for X_test_dtm\n", "y_pred_class = clf.predict(X_test_dtf)\n", "# calculate accuracy\n", "print(accuracy_score(y_test, y_pred_class))\n", "print(classification_report(y_test, y_pred_class))\n", "print(confusion_matrix(y_test, y_pred_class))" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "jLkJ8s9K3k3n" }, "source": [ "from sklearn import linear_model\n", "clf = SVC()\n", "# 3. train the model using X_train_dtm\n", "x=clf.fit(X_train_tf, y_train)\n", "# 4. make class predictions for X_test_dtm\n", "y_pred_class = clf.predict(X_test_tf)\n", "# calculate accuracy\n", "print(accuracy_score(y_test, y_pred_class))\n", "print(classification_report(y_test, y_pred_class))\n", "print(confusion_matrix(y_test, y_pred_class))" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "7eO19gow3qjO" }, "source": [ "from sklearn import linear_model\n", "clf = SVC()\n", "# 3. train the model using X_train_dtm\n", "x=clf.fit(X_train_g, y_train)\n", "# 4. make class predictions for X_test_dtm\n", "y_pred_class = clf.predict(X_test_g)\n", "# calculate accuracy\n", "print(accuracy_score(y_test, y_pred_class))\n", "print(classification_report(y_test, y_pred_class))\n", "print(confusion_matrix(y_test, y_pred_class))" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "2O8M-WFm3qpE" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "pB7DB67Azjff" }, "source": [ "from sklearn import linear_model\n", "clf = linear_model.SGDClassifier(max_iter=1000, tol=1e-3)\n", "# 3. train the model using X_train_dtm\n", "x=clf.fit(X_train_dtf, y_train)\n", "# 4. make class predictions for X_test_dtm\n", "y_pred_class = clf.predict(X_test_dtf)\n", "# calculate accuracy\n", "print(accuracy_score(y_test, y_pred_class))\n", "print(classification_report(y_test, y_pred_class))\n", "print(confusion_matrix(y_test, y_pred_class))" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "UOZxxFFy3wDB" }, "source": [ "from sklearn import linear_model\n", "clf = linear_model.SGDClassifier(max_iter=1000, tol=1e-3)\n", "# 3. train the model using X_train_dtm\n", "x=clf.fit(X_train_tf, y_train)\n", "# 4. make class predictions for X_test_dtm\n", "y_pred_class = clf.predict(X_test_tf)\n", "# calculate accuracy\n", "print(accuracy_score(y_test, y_pred_class))\n", "print(classification_report(y_test, y_pred_class))\n", "print(confusion_matrix(y_test, y_pred_class))" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "ZMDg9y3q3wGM" }, "source": [ "from sklearn import linear_model\n", "clf = linear_model.SGDClassifier(max_iter=1000, tol=1e-3)\n", "# 3. train the model using X_train_dtm\n", "x=clf.fit(X_train_g, y_train)\n", "# 4. make class predictions for X_test_dtm\n", "y_pred_class = clf.predict(X_test_g)\n", "# calculate accuracy\n", "print(accuracy_score(y_test, y_pred_class))\n", "print(classification_report(y_test, y_pred_class))\n", "print(confusion_matrix(y_test, y_pred_class))" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "NuUt4Dtq3wKI" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "tP5hgZfheOGP" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "qGWxgg_UjR7B" }, "source": [ "df.fillna(\" \",inplace = True)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "-YIYdmcajgnx" }, "source": [ "df['text'] = df['summary'] + ' ' + df['pros'] + ' ' + df['cons'] + ' ' + df['advice-to-mgmt']" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "6jgR1_eqjx7A", "outputId": "3eb39e76-f1e8-4a50-a270-0aebd42ba18e" }, "source": [ "print(df['text'][:2])" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "0 Google Google is one of the beast Company in t...\n", "1 Engineer salary was fine but in line with othe...\n", "Name: text, dtype: object\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "gz5Ec4u1j0Yx", "outputId": "95d6b244-859f-40c0-9ee6-de0db565a8f8" }, "source": [ "import nltk\n", "from nltk.tokenize import RegexpTokenizer\n", "from nltk.stem import WordNetLemmatizer,PorterStemmer\n", "from nltk.corpus import stopwords\n", "import re\n", "nltk.download('stopwords')\n", "nltk.download('wordnet')\n", "lemmatizer = WordNetLemmatizer()\n", "stemmer = PorterStemmer() \n", "\n", "def preprocess(sentence):\n", " sentence=str(sentence)\n", " sentence = sentence.lower()\n", " sentence=sentence.replace('{html}',\"\") \n", " cleanr = re.compile('<.*?>')\n", " cleantext = re.sub(cleanr, '', sentence)\n", " rem_url=re.sub(r'http\\S+', '',cleantext)\n", " rem_num = re.sub('[0-9]+', '', rem_url)\n", " tokenizer = RegexpTokenizer(r'\\w+')\n", " tokens = tokenizer.tokenize(rem_num) \n", " filtered_words = [w for w in tokens if len(w) > 2 if not w in stopwords.words('english')]\n", " stem_words=[stemmer.stem(w) for w in filtered_words]\n", " lemma_words=[lemmatizer.lemmatize(w) for w in stem_words]\n", " return \" \".join(filtered_words)\n", "\n", "\n", "df['cleanText']=df['text'].map(lambda s:preprocess(s))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "[nltk_data] Downloading package stopwords to /root/nltk_data...\n", "[nltk_data] Package stopwords is already up-to-date!\n", "[nltk_data] Downloading package wordnet to /root/nltk_data...\n", "[nltk_data] Package wordnet is already up-to-date!\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "ujO7VbmTanBD" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "QsEOsq8uaolX" }, "source": [ "df4=df4[0:5064]\n", "dataF=df5.append(df4,ignore_index = True) \n", "dataF=dataF.append(df3,ignore_index = True)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "PdlEwianarpr" }, "source": [ "dataF.to_csv(\"/content/drive/My Drive/sentiment.csv\")" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "1YTgfDKec9Rb", "outputId": "fa607c42-d55d-4c25-9703-6fc9c5ea71a7" }, "source": [ "df['sentiments'].value_counts()" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "-1 5064\n", " 1 5064\n", "Name: sentiments, dtype: int64" ] }, "metadata": { "tags": [] }, "execution_count": 9 } ] }, { "cell_type": "code", "metadata": { "id": "h971RH-pNy_o" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "IMjRmXPs2vkp" }, "source": [ "GloVe\n" ] }, { "cell_type": "code", "metadata": { "id": "wnpo0t1x2uPO" }, "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(dataF['cleanText'], dataF['sentiments'], test_size=0.25)\n" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "2rH3tY3y3Rm6", "outputId": "a918a75a-c503-4556-eed6-bc55d700c749" }, "source": [ "pip install zeugma" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Collecting zeugma\n", " Downloading https://files.pythonhosted.org/packages/59/38/8f57f83719027e36a61238abe1cafa55d257eaaf8e9185b2adbb5a928308/zeugma-0.48.tar.gz\n", "Requirement already satisfied: numpy>=1.13.3 in /usr/local/lib/python3.7/dist-packages (from zeugma) (1.19.5)\n", "Requirement already satisfied: Cython>=0.27.3 in /usr/local/lib/python3.7/dist-packages (from zeugma) (0.29.22)\n", "Requirement already satisfied: pandas>=0.20.3 in /usr/local/lib/python3.7/dist-packages (from zeugma) (1.1.5)\n", "Requirement already satisfied: gensim>=3.5.0 in /usr/local/lib/python3.7/dist-packages (from zeugma) (3.6.0)\n", "Requirement already satisfied: scikit_learn>=0.19.1 in /usr/local/lib/python3.7/dist-packages (from zeugma) (0.22.2.post1)\n", "Requirement already satisfied: tensorflow>=1.5.0 in /usr/local/lib/python3.7/dist-packages (from zeugma) (2.4.1)\n", "Requirement already satisfied: keras>=2.1.3 in /usr/local/lib/python3.7/dist-packages (from zeugma) (2.4.3)\n", "Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.20.3->zeugma) (2.8.1)\n", "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.20.3->zeugma) (2018.9)\n", "Requirement already satisfied: smart-open>=1.2.1 in /usr/local/lib/python3.7/dist-packages (from gensim>=3.5.0->zeugma) (5.0.0)\n", "Requirement already satisfied: scipy>=0.18.1 in /usr/local/lib/python3.7/dist-packages (from gensim>=3.5.0->zeugma) (1.4.1)\n", "Requirement already satisfied: six>=1.5.0 in /usr/local/lib/python3.7/dist-packages (from gensim>=3.5.0->zeugma) (1.15.0)\n", "Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.7/dist-packages (from scikit_learn>=0.19.1->zeugma) (1.0.1)\n", "Requirement already satisfied: opt-einsum~=3.3.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.5.0->zeugma) (3.3.0)\n", "Requirement already satisfied: wrapt~=1.12.1 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.5.0->zeugma) (1.12.1)\n", "Requirement already satisfied: h5py~=2.10.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.5.0->zeugma) (2.10.0)\n", "Requirement already satisfied: keras-preprocessing~=1.1.2 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.5.0->zeugma) (1.1.2)\n", "Requirement already satisfied: typing-extensions~=3.7.4 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.5.0->zeugma) (3.7.4.3)\n", "Requirement already satisfied: grpcio~=1.32.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.5.0->zeugma) (1.32.0)\n", "Requirement already satisfied: astunparse~=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.5.0->zeugma) (1.6.3)\n", "Requirement already satisfied: termcolor~=1.1.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.5.0->zeugma) (1.1.0)\n", "Requirement already satisfied: wheel~=0.35 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.5.0->zeugma) (0.36.2)\n", "Requirement already satisfied: tensorflow-estimator<2.5.0,>=2.4.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.5.0->zeugma) (2.4.0)\n", "Requirement already satisfied: google-pasta~=0.2 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.5.0->zeugma) (0.2.0)\n", "Requirement already satisfied: protobuf>=3.9.2 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.5.0->zeugma) (3.12.4)\n", "Requirement already satisfied: gast==0.3.3 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.5.0->zeugma) (0.3.3)\n", "Requirement already satisfied: absl-py~=0.10 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.5.0->zeugma) (0.12.0)\n", "Requirement already satisfied: tensorboard~=2.4 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.5.0->zeugma) (2.4.1)\n", "Requirement already satisfied: flatbuffers~=1.12.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.5.0->zeugma) (1.12)\n", "Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from keras>=2.1.3->zeugma) (3.13)\n", "Requirement already satisfied: setuptools in /usr/local/lib/python3.7/dist-packages (from protobuf>=3.9.2->tensorflow>=1.5.0->zeugma) (56.0.0)\n", "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard~=2.4->tensorflow>=1.5.0->zeugma) (3.3.4)\n", "Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard~=2.4->tensorflow>=1.5.0->zeugma) (0.4.4)\n", "Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard~=2.4->tensorflow>=1.5.0->zeugma) (1.0.1)\n", "Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard~=2.4->tensorflow>=1.5.0->zeugma) (1.28.1)\n", "Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard~=2.4->tensorflow>=1.5.0->zeugma) (1.8.0)\n", "Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard~=2.4->tensorflow>=1.5.0->zeugma) (2.23.0)\n", "Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from markdown>=2.6.8->tensorboard~=2.4->tensorflow>=1.5.0->zeugma) (3.10.1)\n", "Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard~=2.4->tensorflow>=1.5.0->zeugma) (1.3.0)\n", "Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard~=2.4->tensorflow>=1.5.0->zeugma) (0.2.8)\n", "Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard~=2.4->tensorflow>=1.5.0->zeugma) (4.2.1)\n", "Requirement already satisfied: rsa<5,>=3.1.4; python_version >= \"3.6\" in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard~=2.4->tensorflow>=1.5.0->zeugma) (4.7.2)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard~=2.4->tensorflow>=1.5.0->zeugma) (2020.12.5)\n", "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard~=2.4->tensorflow>=1.5.0->zeugma) (2.10)\n", "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard~=2.4->tensorflow>=1.5.0->zeugma) (3.0.4)\n", "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3,>=2.21.0->tensorboard~=2.4->tensorflow>=1.5.0->zeugma) (1.24.3)\n", "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard~=2.4->tensorflow>=1.5.0->zeugma) (3.4.1)\n", "Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard~=2.4->tensorflow>=1.5.0->zeugma) (3.1.0)\n", "Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.7/dist-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard~=2.4->tensorflow>=1.5.0->zeugma) (0.4.8)\n", "Building wheels for collected packages: zeugma\n", " Building wheel for zeugma (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Created wheel for zeugma: filename=zeugma-0.48-cp37-none-any.whl size=8778 sha256=d6eeb779f506a10419abe3c6a39d1e3b49e73a0247e231c7c2fffb3de16f97a9\n", " Stored in directory: /root/.cache/pip/wheels/6a/b5/bc/5183ac478b0071d04d3ed0c0dd4a43db94c5c8ffb317b5eb53\n", "Successfully built zeugma\n", "Installing collected packages: zeugma\n", "Successfully installed zeugma-0.48\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "vw9KqlRR2uTM" }, "source": [ "from zeugma.embeddings import EmbeddingTransformer\n", "glove = EmbeddingTransformer('glove')\n", "X_train_tf = glove.fit_transform(X_train)\n", "X_test_tf = glove.transform(X_test)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "OV_sPMTz5GfZ" }, "source": [ "from sklearn.metrics import accuracy_score\n", "from sklearn.metrics import classification_report\n", "from sklearn.metrics import confusion_matrix" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "3SPA-4EG5Gfj", "outputId": "c5d766fb-fad9-4058-ec27-196ee6c0f1ff" }, "source": [ "from sklearn.ensemble import RandomForestClassifier\n", "print(\"RF\")\n", "rfc = RandomForestClassifier(n_estimators=100, random_state=50,max_depth=250) \n", "rfc.fit(X_train_tf, y_train)\n", "# calculate accuracy of class predictions\n", "y_pred_class = rfc.predict(X_test_tf)\n", "print(classification_report(y_test, y_pred_class))\n", "print(confusion_matrix(y_test, y_pred_class))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "RF\n", " precision recall f1-score support\n", "\n", " -1 0.81 0.84 0.82 1261\n", " 1 0.83 0.80 0.82 1271\n", "\n", " accuracy 0.82 2532\n", " macro avg 0.82 0.82 0.82 2532\n", "weighted avg 0.82 0.82 0.82 2532\n", "\n", "[[1055 206]\n", " [ 255 1016]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "qZWc-4wC5K2t", "outputId": "d043334f-d5c1-409a-ecdc-e6575e5555bb" }, "source": [ "from sklearn.linear_model import LogisticRegression\n", "print(\"LR\")\n", "logreg = LogisticRegression(random_state=100,multi_class='ovr',C=3)\n", "x=logreg.fit(X_train_tf, y_train).predict(X_test_tf)\n", "# calculate accuracy\n", "print(classification_report(y_test, x))\n", "print(confusion_matrix(y_test, x))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "LR\n", " precision recall f1-score support\n", "\n", " -1 0.81 0.83 0.82 1261\n", " 1 0.83 0.81 0.82 1271\n", "\n", " accuracy 0.82 2532\n", " macro avg 0.82 0.82 0.82 2532\n", "weighted avg 0.82 0.82 0.82 2532\n", "\n", "[[1051 210]\n", " [ 245 1026]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "3ygL1Pz65K2w", "outputId": "7d49f4b4-8ee9-4715-82f5-eade5c9df81f" }, "source": [ "from sklearn.ensemble import ExtraTreesClassifier\n", "etc = ExtraTreesClassifier(n_estimators=200, random_state=50, max_depth=150)\n", "x=etc.fit(X_train_tf, y_train).predict(X_test_tf)\n", "# calculate accuracy\n", "print(classification_report(y_test, x))\n", "print(confusion_matrix(y_test, x))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " -1 0.81 0.84 0.82 1261\n", " 1 0.83 0.81 0.82 1271\n", "\n", " accuracy 0.82 2532\n", " macro avg 0.82 0.82 0.82 2532\n", "weighted avg 0.82 0.82 0.82 2532\n", "\n", "[[1054 207]\n", " [ 243 1028]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "4y1_0ma35Sty", "outputId": "a1990dbb-99e1-47ec-f89b-7031b9ca8798" }, "source": [ "from sklearn.neural_network import MLPClassifier\n", "mlp = MLPClassifier(random_state=20, max_iter=300)\n", "x=mlp.fit(X_train_tf, y_train).predict(X_test_tf)\n", "# calculate accuracy\n", "print(classification_report(y_test, x))\n", "print(confusion_matrix(y_test, x))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " -1 0.81 0.87 0.84 1261\n", " 1 0.86 0.80 0.83 1271\n", "\n", " accuracy 0.83 2532\n", " macro avg 0.84 0.83 0.83 2532\n", "weighted avg 0.84 0.83 0.83 2532\n", "\n", "[[1093 168]\n", " [ 252 1019]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "njIIlrZ15Stz", "outputId": "4e220f20-a0a3-4119-b5af-93eaaa8a7be9" }, "source": [ "from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier\n", "from sklearn.svm import SVC\n", "print(\"ADA\")\n", "xgb = AdaBoostClassifier(n_estimators=300, random_state=50)\n", "xgb_pred = xgb.fit(X_train_tf, y_train).predict(X_test_tf) \n", "print(classification_report(y_test,xgb_pred))\n", "print(confusion_matrix(y_test,xgb_pred))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "ADA\n", " precision recall f1-score support\n", "\n", " -1 0.82 0.81 0.81 1261\n", " 1 0.81 0.82 0.81 1271\n", "\n", " accuracy 0.81 2532\n", " macro avg 0.81 0.81 0.81 2532\n", "weighted avg 0.81 0.81 0.81 2532\n", "\n", "[[1016 245]\n", " [ 230 1041]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "6bse-Qm62uWT" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "8n2JJ2JN2uZF" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "LGjpXSmq2ucf" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "Fc-5cW-e2ufp" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "oDyQAYJ92ujJ" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "KyI8FtVj2ul9" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "JPlJYLHl2upn" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "_6Q3BTSP2usE" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "LuSaMEgs2uwK" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "nvR46EMt2uyh" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "7jtzI86b2u1W" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "kDw7e2Ii2fDz" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "DtcHnWSz2UuF" }, "source": [ "\n", "Bag of Words" ] }, { "cell_type": "code", "metadata": { "id": "0sPu8YKQdNPU" }, "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(dataF['cleanText'], dataF['sentiments'], test_size=0.25)\n" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "sMK16CKSk3S3" }, "source": [ "from sklearn.feature_extraction.text import CountVectorizer\n", "cv=CountVectorizer()\n", "X_train_tf = cv.fit_transform(X_train)\n", "X_test_tf=cv.transform(X_test)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "pNQSLIL1l4jP" }, "source": [ "from sklearn.metrics import accuracy_score\n", "from sklearn.metrics import classification_report\n", "from sklearn.metrics import confusion_matrix" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "a74GWWfqlFul", "outputId": "e23b7380-dad3-4f82-de26-dc5b9e787263" }, "source": [ "from sklearn.ensemble import RandomForestClassifier\n", "print(\"RF\")\n", "rfc = RandomForestClassifier(n_estimators=100, random_state=50,max_depth=250) \n", "rfc.fit(X_train_tf, y_train)\n", "# calculate accuracy of class predictions\n", "y_pred_class = rfc.predict(X_test_tf)\n", "print(classification_report(y_test, y_pred_class))\n", "print(confusion_matrix(y_test, y_pred_class))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "RF\n", " precision recall f1-score support\n", "\n", " -1 0.96 0.92 0.94 1260\n", " 1 0.92 0.96 0.94 1272\n", "\n", " accuracy 0.94 2532\n", " macro avg 0.94 0.94 0.94 2532\n", "weighted avg 0.94 0.94 0.94 2532\n", "\n", "[[1159 101]\n", " [ 51 1221]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "nm1wxG_OlT4Q", "outputId": "051ef95c-04bc-4050-e72d-078f9429a948" }, "source": [ "from sklearn.linear_model import LogisticRegression\n", "print(\"LR\")\n", "logreg = LogisticRegression(random_state=100,multi_class='ovr',C=3)\n", "x=logreg.fit(X_train_tf, y_train).predict(X_test_tf)\n", "# calculate accuracy\n", "print(classification_report(y_test, x))\n", "print(confusion_matrix(y_test, x))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "LR\n", " precision recall f1-score support\n", "\n", " -1 0.96 0.97 0.96 1260\n", " 1 0.97 0.96 0.96 1272\n", "\n", " accuracy 0.96 2532\n", " macro avg 0.96 0.96 0.96 2532\n", "weighted avg 0.96 0.96 0.96 2532\n", "\n", "[[1217 43]\n", " [ 56 1216]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "4S-Of9SUs9Il", "outputId": "4f9b8007-9a67-44d1-cfc3-b5913903c7fe" }, "source": [ "from sklearn.ensemble import ExtraTreesClassifier\n", "etc = ExtraTreesClassifier(n_estimators=200, random_state=50, max_depth=150)\n", "x=etc.fit(X_train_tf, y_train).predict(X_test_tf)\n", "# calculate accuracy\n", "print(classification_report(y_test, x))\n", "print(confusion_matrix(y_test, x))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " -1 0.96 0.92 0.94 1260\n", " 1 0.92 0.96 0.94 1272\n", "\n", " accuracy 0.94 2532\n", " macro avg 0.94 0.94 0.94 2532\n", "weighted avg 0.94 0.94 0.94 2532\n", "\n", "[[1160 100]\n", " [ 47 1225]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "lMjUDL3ZtHze", "outputId": "c82dd6c3-6288-44f0-8c6c-3eafa5517ec3" }, "source": [ "from sklearn.neural_network import MLPClassifier\n", "mlp = MLPClassifier(random_state=20, max_iter=300)\n", "x=mlp.fit(X_train_tf, y_train).predict(X_test_tf)\n", "# calculate accuracy\n", "print(classification_report(y_test, x))\n", "print(confusion_matrix(y_test, x))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " -1 0.96 0.96 0.96 1260\n", " 1 0.96 0.96 0.96 1272\n", "\n", " accuracy 0.96 2532\n", " macro avg 0.96 0.96 0.96 2532\n", "weighted avg 0.96 0.96 0.96 2532\n", "\n", "[[1207 53]\n", " [ 56 1216]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "OrqwKe4MuZvP", "outputId": "1e384d0f-e300-4317-c46a-8234d0baa5da" }, "source": [ "from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier\n", "from sklearn.svm import SVC\n", "print(\"ADA\")\n", "xgb = AdaBoostClassifier(n_estimators=300, random_state=50)\n", "xgb_pred = xgb.fit(X_train_tf, y_train).predict(X_test_tf) \n", "print(classification_report(y_test,xgb_pred))\n", "print(confusion_matrix(y_test,xgb_pred))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "ADA\n", " precision recall f1-score support\n", "\n", " -1 0.95 0.96 0.96 1260\n", " 1 0.96 0.95 0.96 1272\n", "\n", " accuracy 0.96 2532\n", " macro avg 0.96 0.96 0.96 2532\n", "weighted avg 0.96 0.96 0.96 2532\n", "\n", "[[1213 47]\n", " [ 66 1206]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "CNWvze0d4BMj" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "wGozrOrCUiWt" }, "source": [ "2-Classes\n" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "9FIOnrYm1sVj", "outputId": "c93b04c6-5470-4ce6-d8f2-030942d328af" }, "source": [ "import nltk\n", "from textblob import TextBlob\n", "df['Polarity Score']=\"\"\n", "df['sentiments']=\"\"\n", "#df2 = pd.DataFrame(columns=['text', 'sentiment', 'score'])\n", "df['cleanText']=df['cleanText'].astype(str)\n", "for i in range(len(df)):\n", " sentiment = TextBlob(df['cleanText'][i])\n", " a=sentiment.sentiment.polarity\n", " #df2.loc[i] = [data['cleanText'][i]]+[str(0)]+ [a]\n", " df[\"Polarity Score\"][i]=a\n", "\n", "for i in range(len(df)):\n", " if(df['Polarity Score'][i]>0):\n", " df['sentiments'][i]=1\n", " elif(df['Polarity Score'][i]==0):\n", " df['sentiments'][i]=0\n", " else:\n", " df['sentiments'][i]=-1" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:11: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " # This is added back by InteractiveShellApp.init_path()\n", "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:15: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " from ipykernel import kernelapp as app\n", "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:19: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:17: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n" ], "name": "stderr" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "O5Vjd_wJfF50", "outputId": "551dbd74-5fb3-439b-b140-3cfbf6fbf290" }, "source": [ "df5=df.loc[df['sentiments'] == 0]\n", "print(len(df5))\n", "df4=df.loc[df['sentiments'] == 1]\n", "print(len(df4))\n", "df3=df.loc[df['sentiments'] == -1]\n", "print(len(df3))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "1448\n", "61017\n", "5064\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "AnKAEj2d1jbY" }, "source": [ "df4=df4[0:5064]\n", "dataF=df3.append(df4,ignore_index = True) " ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Ew6kqhKLzf7Y", "outputId": "48c43f4b-33ec-4c0d-80b9-3faa1aea1719" }, "source": [ "dataF['sentiments'].value_counts()" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "-1 5064\n", " 1 5064\n", "Name: sentiments, dtype: int64" ] }, "metadata": { "tags": [] }, "execution_count": 4 } ] }, { "cell_type": "code", "metadata": { "id": "xYK1YTcMQVmy" }, "source": [ "dataF.to_csv(\"/content/drive/My Drive/sentiments.csv\")" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "R8gha7dO4UYO" }, "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(dataF['cleanText'], dataF['sentiments'], test_size=0.25)\n" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "Eka4JL884nZD" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "JJOmRCPq4wM2" }, "source": [ "from sklearn.feature_extraction.text import TfidfVectorizer\n", "vectorizer = TfidfVectorizer()\n", "X_train_tf = vectorizer.fit_transform(X_train)\n", "X_test_tf=vectorizer.transform(X_test)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "KEsEUOj24wND" }, "source": [ "from sklearn.metrics import accuracy_score\n", "from sklearn.metrics import classification_report\n", "from sklearn.metrics import confusion_matrix" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "9EpGoj13_kgV" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "x0NBGKHR4zYm", "outputId": "3c2c6fb2-83cd-460a-ef06-5cf7fb8aed50" }, "source": [ "from sklearn.ensemble import RandomForestClassifier\n", "print(\"RF\")\n", "rfc = RandomForestClassifier(n_estimators=100, random_state=50,max_depth=250) \n", "rfc.fit(X_train_tf, y_train)\n", "# calculate accuracy of class predictions\n", "y_pred_class = rfc.predict(X_test_tf)\n", "print(classification_report(y_test, y_pred_class))\n", "print(confusion_matrix(y_test, y_pred_class))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "RF\n", " precision recall f1-score support\n", "\n", " -1 0.95 0.92 0.93 1257\n", " 1 0.92 0.96 0.94 1275\n", "\n", " accuracy 0.94 2532\n", " macro avg 0.94 0.94 0.94 2532\n", "weighted avg 0.94 0.94 0.94 2532\n", "\n", "[[1152 105]\n", " [ 57 1218]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "WVJWDpVB4zYo", "outputId": "eaab1951-bc91-442b-e000-975e7b2ebc09" }, "source": [ "from sklearn.linear_model import LogisticRegression\n", "print(\"LR\")\n", "logreg = LogisticRegression(random_state=100,multi_class='ovr',C=3)\n", "x=logreg.fit(X_train_tf, y_train).predict(X_test_tf)\n", "# calculate accuracy\n", "from sklearn.metrics import precision_recall_fscore_support\n", "print(classification_report(y_test, x))\n", "print(confusion_matrix(y_test, x))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "LR\n", " precision recall f1-score support\n", "\n", " -1 0.96 0.97 0.96 1257\n", " 1 0.97 0.96 0.96 1275\n", "\n", " accuracy 0.96 2532\n", " macro avg 0.96 0.96 0.96 2532\n", "weighted avg 0.96 0.96 0.96 2532\n", "\n", "[[1217 40]\n", " [ 53 1222]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "6xhecnL4474p", "outputId": "abf7776b-4ef6-43a7-fbbb-883a06143367" }, "source": [ "from sklearn.ensemble import ExtraTreesClassifier\n", "etc = ExtraTreesClassifier(n_estimators=200, random_state=50, max_depth=150)\n", "x=etc.fit(X_train_tf, y_train).predict(X_test_tf)\n", "# calculate accuracy\n", "print(classification_report(y_test, x))\n", "print(confusion_matrix(y_test, x))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " -1 0.95 0.92 0.93 1257\n", " 1 0.92 0.95 0.94 1275\n", "\n", " accuracy 0.94 2532\n", " macro avg 0.94 0.94 0.94 2532\n", "weighted avg 0.94 0.94 0.94 2532\n", "\n", "[[1152 105]\n", " [ 58 1217]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "eZxOZ8W0474q", "outputId": "0870f616-5fa3-4aac-a6b3-5f999fa31d83" }, "source": [ "from sklearn.neural_network import MLPClassifier\n", "mlp = MLPClassifier(random_state=20, max_iter=300)\n", "x=mlp.fit(X_train_tf, y_train).predict(X_test_tf)\n", "# calculate accuracy\n", "print(classification_report(y_test, x))\n", "print(confusion_matrix(y_test, x))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " -1 0.95 0.95 0.95 1257\n", " 1 0.95 0.95 0.95 1275\n", "\n", " accuracy 0.95 2532\n", " macro avg 0.95 0.95 0.95 2532\n", "weighted avg 0.95 0.95 0.95 2532\n", "\n", "[[1191 66]\n", " [ 64 1211]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "0SV1-8Sj5Coa", "outputId": "3ae3897d-4039-4864-e382-e0f3215ca02e" }, "source": [ "from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier\n", "from sklearn.svm import SVC\n", "print(\"ADA\")\n", "xgb = AdaBoostClassifier(n_estimators=300, random_state=50)\n", "xgb_pred = xgb.fit(X_train_tf, y_train).predict(X_test_tf) \n", "print(classification_report(y_test,xgb_pred))\n", "print(confusion_matrix(y_test,xgb_pred))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "ADA\n", " precision recall f1-score support\n", "\n", " -1 0.95 0.95 0.95 1257\n", " 1 0.95 0.95 0.95 1275\n", "\n", " accuracy 0.95 2532\n", " macro avg 0.95 0.95 0.95 2532\n", "weighted avg 0.95 0.95 0.95 2532\n", "\n", "[[1194 63]\n", " [ 67 1208]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "rD2ubU2O5ILk" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "7PZiSNZ66BrI" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "9fcC1rBw72rl" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "Q3OV8dDc72wZ" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "Qy1Rgjjc72zi" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "Oq1iYRcM721w" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "eJyF7Pkm725w" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "FonjsBLn727E" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "cKyPN5i_7294" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "pyFbsSPu73Ba" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "wnyzXURVUlis" }, "source": [ "Deep learning Models\n" ] }, { "cell_type": "code", "metadata": { "id": "uSGAQjRJUpkx" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "-Bfj8ErP71-_" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "rUUFyjWv72Fe" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "p8bn7CzX72HW" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "APCR0wHY72Kc" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "1Du-ssSh72Nx" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "iGD_0z5m72PZ" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "EjCUpQ4H2Vnm", "outputId": "1ecb9f3a-ab07-4fc3-9bad-909beeaf750d" }, "source": [ "import tensorflow.keras\n", "tokenizer = tensorflow.keras.preprocessing.text.Tokenizer(num_words=5000, lower=True,split=' ',filters='!\"#$%&()*+,-./:;<=>?@[\\\\]^_`{|}~\\t\\n')\n", "tokenizer.fit_on_texts(df[\"cleanText\"].values)\n", "#print(tokenizer.word_index) # To see the dicstionary\n", "X = tokenizer.texts_to_sequences(df[\"cleanText\"].values)\n", "X = tensorflow.keras.preprocessing.sequence.pad_sequences(X)\n", "\n", "\n", "from keras.layers import Dense, Flatten, LSTM, Conv1D, MaxPooling1D, Dropout, Activation,Embedding\n", "from keras.models import Sequential\n", "model_conv = Sequential()\n", "model_conv.add(Embedding(5000, 100, input_length=X.shape[1]))\n", "model_conv.add(Conv1D(128, 5, activation='relu'))\n", "model_conv.add(MaxPooling1D(pool_size=4))\n", "model_conv.add(LSTM(100))\n", "model_conv.add(Dense(2, activation='softmax'))\n", "model_conv.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n", "\n", "#Y = data.Reviewer_Score\n", "Y = pd.get_dummies(df.sentiments).values\n", "\n", "X_train, X_valid, Y_train, Y_valid = train_test_split(X,Y, test_size = 0.25, random_state =2, shuffle=True)\n", "batch_size=128\n", "#Here we train the Network.\n", "pred=model_conv.fit(X_train, Y_train, batch_size =batch_size, epochs =10, verbose =2,validation_data=(X_valid,Y_valid))\n", "pred" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Epoch 1/10\n", "60/60 - 6s - loss: 0.4124 - accuracy: 0.7854 - val_loss: 0.1724 - val_accuracy: 0.9384\n", "Epoch 2/10\n", "60/60 - 4s - loss: 0.1054 - accuracy: 0.9614 - val_loss: 0.1479 - val_accuracy: 0.9451\n", "Epoch 3/10\n", "60/60 - 4s - loss: 0.0500 - accuracy: 0.9838 - val_loss: 0.1742 - val_accuracy: 0.9423\n", "Epoch 4/10\n", "60/60 - 4s - loss: 0.0281 - accuracy: 0.9925 - val_loss: 0.2083 - val_accuracy: 0.9388\n", "Epoch 5/10\n", "60/60 - 4s - loss: 0.0157 - accuracy: 0.9962 - val_loss: 0.2572 - val_accuracy: 0.9368\n", "Epoch 6/10\n", "60/60 - 4s - loss: 0.0087 - accuracy: 0.9980 - val_loss: 0.3184 - val_accuracy: 0.9313\n", "Epoch 7/10\n", "60/60 - 4s - loss: 0.0050 - accuracy: 0.9989 - val_loss: 0.3725 - val_accuracy: 0.9293\n", "Epoch 8/10\n", "60/60 - 4s - loss: 0.0026 - accuracy: 0.9996 - val_loss: 0.4896 - val_accuracy: 0.9206\n", "Epoch 9/10\n", "60/60 - 4s - loss: 0.0080 - accuracy: 0.9972 - val_loss: 0.5157 - val_accuracy: 0.9155\n", "Epoch 10/10\n", "60/60 - 4s - loss: 0.0241 - accuracy: 0.9921 - val_loss: 0.3922 - val_accuracy: 0.9261\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 25 } ] }, { "cell_type": "code", "metadata": { "id": "Mp0M2mQa2Vqw", "colab": { "base_uri": "https://localhost:8080/", "height": 573 }, "outputId": "f4cfa669-4448-49d6-9df9-80c79353d8cd" }, "source": [ "import matplotlib.pyplot as plt\n", "from google.colab import files\n", "\n", "# Plot training & validation accuracy values\n", "plt.plot(pred.history['accuracy'])\n", "plt.plot(pred.history['val_accuracy'])\n", "plt.title('Model accuracy')\n", "plt.ylabel('Accuracy')\n", "plt.xlabel('Epoch')\n", "plt.legend(['Train', 'Test'], loc='upper left')\n", "plt.savefig('training & validation accuracySST1.pdf')\n", "files.download('training & validation accuracySST1.pdf') \n", "plt.show()\n", "\n", "\n", "# Plot training & validation loss values\n", "plt.plot(pred.history['loss'])\n", "plt.plot(pred.history['val_loss'])\n", "plt.title('Model loss')\n", "plt.ylabel('Loss')\n", "plt.xlabel('Epoch')\n", "plt.legend(['Train', 'Test'], loc='upper left')\n", "plt.savefig('training & validation lossSST1.pdf')\n", "files.download('training & validation lossSST1.pdf') \n", "plt.show()\n" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "application/javascript": [ "\n", " async function download(id, filename, size) {\n", " if (!google.colab.kernel.accessAllowed) {\n", " return;\n", " }\n", " const div = document.createElement('div');\n", " const label = document.createElement('label');\n", " label.textContent = `Downloading \"${filename}\": `;\n", " div.appendChild(label);\n", " const progress = document.createElement('progress');\n", " progress.max = size;\n", " div.appendChild(progress);\n", " document.body.appendChild(div);\n", "\n", " const buffers = [];\n", " let downloaded = 0;\n", "\n", " const channel = await google.colab.kernel.comms.open(id);\n", " // Send a message to notify the kernel that we're ready.\n", " channel.send({})\n", "\n", " for await (const message of channel.messages) {\n", " // Send a message to notify the kernel that we're ready.\n", " channel.send({})\n", " if (message.buffers) {\n", " for (const buffer of message.buffers) {\n", " buffers.push(buffer);\n", " downloaded += buffer.byteLength;\n", " progress.value = downloaded;\n", " }\n", " }\n", " }\n", " const blob = new Blob(buffers, {type: 'application/binary'});\n", " const a = document.createElement('a');\n", " a.href = window.URL.createObjectURL(blob);\n", " a.download = filename;\n", " div.appendChild(a);\n", " a.click();\n", " div.remove();\n", " }\n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "application/javascript": [ "download(\"download_477ae9fa-be58-46c0-b64d-4230a06741eb\", \"training & validation accuracySST1.pdf\", 12465)" ], "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEWCAYAAABxMXBSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3de3xcdZ3/8dc7k2ubW0nSa1paoIVeQY2AIndRwAt4hwWFXVYW5aqigqvIsrLq78d6AVF/qIAoiiysWhUXECjV5SIpNKEFCqVAM+ktbckkaZrrfH5/nJNmkqbNpM10JpPP8/E4jznzPZf5nBTmM9/zPd/vV2aGc845l6ycdAfgnHNubPHE4ZxzbkQ8cTjnnBsRTxzOOedGxBOHc865EfHE4ZxzbkQ8cTi3B5JmSzJJuUnse6Gkvx2IuJxLN08cLitIel1Sl6TKQeXPhV/+s9MTmXPZxxOHyyavAef2vZG0GJiQvnAyQzI1JudGwhOHyya/AD6V8P4C4K7EHSSVSbpLUpOkNyR9VVJOuC0i6SZJWyWtA943xLE/k7RRUqOkb0iKJBOYpP+StElSTNJySQsTthVJ+s8wnpikv0kqCre9S9ITkpolNUi6MCxfJumfE84x4FZZWMu6VNIrwCth2ffDc7RIWiHp+IT9I5K+IulVSa3h9pmSbpX0n4OuZamkzyVz3S47eeJw2eQpoFTS/PAL/Rzgl4P2uQUoAw4BTiRINP8Ybvs08H7gLUAN8NFBx94J9ACHhfu8B/hnkvNnYC4wGXgWuDth203A24B3AgcBXwLikg4Oj7sFqAKOAlYm+XkAZwPHAAvC98+E5zgI+BXwX5IKw22fJ6itnQmUAv8EtAM/B85NSK6VwLvD4914ZWa++DLmF+B1gi+0rwLfBE4HHgZyAQNmAxGgC1iQcNy/AMvC9UeBSxK2vSc8NheYAnQCRQnbzwUeC9cvBP6WZKzl4XnLCH687QSOHGK/a4Hf7uEcy4B/Tng/4PPD858yTBxv9n0usAY4aw/7vQicFq5fBjyQ7n9vX9K7+L1Pl21+ASwH5jDoNhVQCeQBbySUvQHMCNenAw2DtvU5ODx2o6S+spxB+w8prP3cCHyMoOYQT4inACgEXh3i0Jl7KE/WgNgkXQ1cRHCdRlCz6HuYYG+f9XPgfIJEfD7w/f2IyWUBv1XlsoqZvUHQSH4m8N+DNm8FugmSQJ9ZQGO4vpHgCzRxW58GghpHpZmVh0upmS1keP8AnEVQIyojqP0AKIypAzh0iOMa9lAOsIOBDf9Th9hn19DXYXvGl4CPA5PMrByIhTEM91m/BM6SdCQwH/jdHvZz44QnDpeNLiK4TbMjsdDMeoF7gRsllYRtCJ+nvx3kXuAKSdWSJgHXJBy7EXgI+E9JpZJyJB0q6cQk4ikhSDrbCL7s/yPhvHHgduA7kqaHjdTvkFRA0A7ybkkfl5QrqULSUeGhK4EPS5og6bDwmoeLoQdoAnIlXUdQ4+jzU+DfJc1VYImkijDGKEH7yC+A+81sZxLX7LKYJw6XdczsVTOr3cPmywl+ra8D/kbQyHt7uO0nwINAHUED9uAay6eAfOAFgvaB+4BpSYR0F8Ftr8bw2KcGbb8aeJ7gy3k78G0gx8zWE9ScvhCWrwSODI/5LkF7zWaCW0l3s3cPAv8DvBzG0sHAW1nfIUicDwEtwM+AooTtPwcWEyQPN87JzCdycs7tnaQTCGpmB5t/aYx7XuNwzu2VpDzgSuCnnjQceOJwzu2FpPlAM8Etue+lORyXIfxWlXPOuRHxGodzzrkRGRcdACsrK2327NnpDsM558aUFStWbDWzqsHl4yJxzJ49m9raPT2d6ZxzbiiS3hiq3G9VOeecGxFPHM4550bEE4dzzrkRSWkbh6TbCeY32GJmi4bYLoKRNs8kGPv/QjN7Ntx2AcEQ2QDfMLOfh+VvI5gXoQh4ALhyXzoldXd3E41G6ejoGPF1jTWFhYVUV1eTl5eX7lCcc1kg1Y3jdwI/YPfhrfucQTC5zVyCCWd+BBwj6SDg6wST6RiwQtJSM3sz3OfTwNMEieN0gsluRiQajVJSUsLs2bNJGCY765gZ27ZtIxqNMmfOnHSH45zLAim9VWVmywkGZ9uTs4C7LPAUUC5pGvBe4GEz2x4mi4eB08NtpWb2VFjLuItglrMR6+jooKKiIquTBoAkKioqxkXNyjl3YKS7jWMGA0fojIZleyuPDlG+G0kXS6qVVNvU1DTkh2d70ugzXq7TOXdgZG0/DjO7DbgNoKamxsdVcc5ltZ7eOFvbutjU0sHmcNkU6+BfTjyUsqLRbd9Md+JoZOCMa9VhWSNw0qDyZWF59RD7jznbtm3j1FNPBWDTpk1EIhGqqoIOmn//+9/Jz8/f47G1tbXcdddd3HzzzQckVudc+pgZLTt72NwaJIJNLR1saQleN8U62RKWb23rJD7oJ3JujjjrqBlZlziWApdJuoegcTxmZhslPQj8RzgLG8B7gGvNbLukFknHEjSOfwq4JS2R76eKigpWrlwJwPXXX09xcTFXX331ru09PT3k5g79z1NTU0NNTc0BidPtrqc3zubWTra2dtITN3p64/TGjZ64JbzG+9/3Gj2D3g+1X3fvoOPiRm/vwP16enc/DiA/N4f8SE7wmptDQW6EgnB9YPnAsoJw3/y97FsQ6d8eyfHbnqOpo7uXptbOXbWETbG+2kLngJpDR3d8t2MnTchjSmkhU0oLmT+1lCmlBUwpK2RqWDaltJCKifnkpODfLNWP4/6aoOZQKSlK8KRUHoCZ/ZjgqagzgbUEj+P+Y7htu6R/J5gRDeAGM+trZP8s/Y/j/pl9eKIqU1144YUUFhby3HPPcdxxx3HOOedw5ZVX0tHRQVFREXfccQeHH344y5Yt46abbuKPf/wj119/PevXr2fdunWsX7+eq666iiuuuCLdlzJmmRnN7d1siO1kQ3MHG5p3Dlxv3snmlo7dftntr0iOiOSI3AGvOf3vI8FrXk7OgPe5OcIM2jp76OqJ09UTp7MnTldvnM7uXrp6g7LRijeSoyETUn4kh/IJeUwrK2JKaSHTygqZWha+lhZSUVwwrpJOPG5s29HVf8soTAabYx0DEsKb7d27HVuQm8PUskKmlBSypLqcqaUFuxJBX/nk0gIK8yJpuLJAShOHmZ07zHYDLt3Dttvpn9IzsbwW2K1PyP74tz+s5oUNLaN5ShZML+XrH1g44uOi0ShPPPEEkUiElpYW/vrXv5Kbm8tf/vIXvvKVr3D//ffvdsxLL73EY489RmtrK4cffjif+cxnvM/GHnR097Ix1p8EBiaH4P3O7t4Bx+RHcpheXsi0siLeeWglM8oLmV5eRFVJAXmRwV/uwfvcyBBf/rtec4hEBiaJVD/A0NMb35VEOnsGvvaX9+5KPl29Q+zXE6ert3dgguqJ0xke39zexTOvb2dzSwfdvQMzVW6Owi+/AqaVFTE1TCh9yaXvizE/N93P6wzNzGjt7GFbWxfbd3Syta2L7Tu62NaWsL6jk21tXWzb0cWbO7roGZStJagsLmBqaSHVk4p428GT+msHu2oKBZQV5WX8Ay3pvlXlBvnYxz5GJBL8kojFYlxwwQW88sorSKK7e/dfJwDve9/7KCgooKCggMmTJ7N582aqq6uH3DebxePG1rZOGveQEDbGdrK1rWu346pKCpheXsS8KSWcdPhkppcXMSNMFNPLi1JW3T+QciM55EZymLDnprNRE48b29u72BTrYGOs7178TjaGt2Fe3NTCY2u20N7Vu9uxlcUFTC0rYGpp0a5ay9SwBjMlTDIT8vf/a8vM2NHVy/a2Lrbu6GR7W/jFv6Mr+PJv61/fviNYunp3v10EUFyQS0VxPgdNzKd60gSOrC6nojh/V6LsqylUFgc/NLKBJw7Yp5pBqkycOHHX+te+9jVOPvlkfvvb3/L6669z0kknDXlMQUHBrvVIJEJPT0+qw0ybts4eVrzxJtE329nQvJONzR1BoojtZFNs91+6E/MjTC8PEsCiGWVMLyvc9X5GeRFTygooyE1flT8b5eSIyuICKosLWDSjbMh9+n7B9yWXzbuSTPDvGH2zndo3ttM8xK2c0sLc4JZYWSHTwi/lvmVKSSHdvfEBv/637+hia1vnriTQlxQ6e4ZOBBPyI2EiKGBaWSELp5dSUVxAxcT8XQmisriAgyYG6+m8ZZQunjgyWCwWY8aMoJvKnXfemd5g0sTMWLO5lWVrmli2Zgu1r7+56xZAJEdMLS1kenkhb501KUgICYlhenkRpYW5GV/tH48kUVqYR2lhHvOmlOxxv47u3v7k0hIml9jOsBbTwUsbW2hq62Rvgw4V5OZQWVxARXHwxT9vSkmwPnFgEgjKCijKH3+JYKQ8cWSwL33pS1xwwQV84xvf4H3ve1+6wzlgWjq6+d9XtvL4y008/nITG2NBr/cjppZw0fFzOGFuFYdUTWRySeG4anAdjwrzIsyunMjsyol73Ke7N05TaycbY8Fjqvm5OQMSwoT8iP94GGXjYs7xmpoaGzyR04svvsj8+fPTFNGBl8nXa2a8sLGFx19uYtmaJp59I6hVlBTk8q65lZx0eBUnzKtiWllRukN1blyRtMLMdnv232scLi1i7d38be1Wlq3ZwuMvN7GltROABdNKufiEQzhxXhVvPXhS1jQmOpdNPHG4AyIeD2oVy9ZsYdmaJp5raKY3bpQW5nL8vCpOnFfFSfOqmFxamO5QnXPD8MThUqa5vYvlrwS1iuUvb2VrW1CrWDSjlM+ceCgnHV7FUTPLyfVahXNjiicON2riceP5xhjL1jTx+MtbWNnQTNygfEIex88NahQnzKuiqqRg+JM55zKWJw63X7bv6GJ5+PTT8peb2LajCwmWzCjjslPmcuK8oFbhTz85lz08cbgR6Y0bddFmHl/TxLKXm6iPNmMGB03M54S5lZx4eBUnzK2iothrFc5lK08cabI/w6oDLFu2jPz8fN75znemPFaAV5va+OFjr/LoS5t5s70bCY6sLufKU+dy0uGTWTyjzGsVzo0TnjjSZLhh1YezbNkyiouLU544trR08L1HXuE3zzRQkJvD6Qun7qpVTJp4AAY+cs5lHE8cGWTFihV8/vOfp62tjcrKSu68806mTZvGzTffzI9//GNyc3NZsGAB3/rWt/jxj39MJBLhl7/8JbfccgvHH3/8qMbS2tHNbcvX8dO/vkZ3b5zzj5nFZafM9YZt55wnDgD+fA1sen50zzl1MZzxraR3NzMuv/xyfv/731NVVcVvfvMb/vVf/5Xbb7+db33rW7z22msUFBTQ3NxMeXk5l1xyyYhrKcno7OnlV0+v55ZH17J9RxfvXzKNq99z+F6HfHDOjS+eODJEZ2cnq1at4rTTTgOgt7eXadOmAbBkyRLOO+88zj77bM4+++yUfH48bvyhfgM3PbSGhu07eeehFVxzxhEsqS5Pyec558YuTxwwoppBqpgZCxcu5Mknn9xt25/+9CeWL1/OH/7wB2688Uaef350a0d/faWJb/35JVZvaGH+tFJ+/k+LOWFupQ8M55wbUkq77Eo6XdIaSWslXTPE9oMlPSKpXtIySdVh+cmSViYsHZLODrfdKem1hG1HpfIaDpSCggKampp2JY7u7m5Wr15NPB6noaGBk08+mW9/+9vEYjHa2tooKSmhtbV1vz5zVWOMT/7saT75s78T29nN9z5xFH+6/F2cOK/Kk4Zzbo9SVuOQFAFuBU4DosAzkpaa2QsJu90E3GVmP5d0CvBN4JNm9hhwVHiegwjmJH8o4bgvmtl9qYo9HXJycrjvvvu44ooriMVi9PT0cNVVVzFv3jzOP/98YrEYZsYVV1xBeXk5H/jAB/joRz/K73//+xE3jq/f1s5ND61had0GJk3I42vvX8D5x87yCY2cc0lJ5a2qo4G1ZrYOQNI9wFlAYuJYAHw+XH8M+N0Q5/ko8Gcza09hrGl1/fXX71pfvnz5btv/9re/7VY2b9486uvrR/Q529o6ueXRtdz99BtEcsRlJx/GxSceQmmhz0/unEteKhPHDKAh4X0UOGbQPnXAh4HvAx8CSiRVmNm2hH3OAb4z6LgbJV0HPAJcY2adgz9c0sXAxQCzZs3an+sY83rjRktHNx/7v8vY2d3Lx2tmctW75zLFR6J1zu2DdA9LejVwoqTngBOBRmDXDPaSpgGLgQcTjrkWOAJ4O3AQ8OWhTmxmt5lZjZnV9PXIHm/iZmxr62TN5lZadvZw3GEVPHjVCXzzw4s9aTjn9lkqaxyNwMyE99Vh2S5mtoGgxoGkYuAjZtacsMvHgd+aWXfCMRvD1U5JdxAkn31iZlnZCGxmtOzsZlNLJ509vUzIi1BVUsD/++TCdIfmnMsCqaxxPAPMlTRHUj7BLaeliTtIqpTUF8O1wO2DznEu8OtBx0wLXwWcDazal+AKCwvZtm0b2TZ1bltnD6827eCN7e0IOPigCZTldFBWPCHdoTnnskTKahxm1iPpMoLbTBHgdjNbLekGoNbMlgInAd+UZMBy4NK+4yXNJqixPD7o1HdLqgIErAQu2Zf4qquriUajNDU17cvhGae7N07Lzm52dseJ5IjSwlxy83PZ8GaQJKurq9MdonMuSyjbfnEPpaamxmpra9MdRko0Nu/kuw+/zP3PRikuyOXSkw/jwnfOpjDPH611zu0fSSvMrGZwufccH6Oa27v40bJXueOJ1wH49PGH8NmTDqV8go9Y65xLLU8cY0xHdy93PvE6P3xsLa2dPXzkrdV87rR5zCgvSndozrlxwhPHGNEbN+5/Nsp3H36ZjbEOTj68ii+fcQRHTC1Nd2jOuXHGE8cY8OSr2/j60lW8vLmNI2eW852PH8U7Dq1Id1jOuXHKE0eGMzM+e/cKJhbk8sPz3soZi6ZmZd8T59zYke6e424Yr29r5832bi47+TDOXDzNk4ZzLu08cWS4+mjQkd4nVHLOZQpPHBmuriFGYV4O86YUpzsU55wDPHFkvPpoMwunl5Eb8X8q51xm8G+jDNbTG2fVhhhLqsvSHYpzzu3iiSODvbKljY7uOEd6+4ZzLoN44shg/Q3jXuNwzmUOTxwZrC4ao6Qwl9kVE9MdinPO7eKJI4PVR5tZUl1GTo733XDOZQ5PHBmqo7uXlza2ev8N51zG8cSRoV7c2EJP3Fgyw9s3nHOZJaWJQ9LpktZIWivpmiG2HyzpEUn1kpZJqk7Y1itpZbgsTSifI+np8Jy/CaelzTrPN8YAWDLTaxzOucySssQhKQLcCpwBLADOlbRg0G43AXeZ2RLgBuCbCdt2mtlR4fLBhPJvA981s8OAN4GLUnUN6VTXEKOyOJ/pZYXpDsU55wZIZY3jaGCtma0zsy7gHuCsQfssAB4N1x8bYvsACkb4OwW4Lyz6OXD2qEWcQYKG8XIf1NA5l3FSmThmAA0J76NhWaI64MPh+oeAEkl9E00USqqV9JSkvuRQATSbWc9ezgmApIvD42ubmpr291oOqLbOHtY2tXn/DedcRkp34/jVwImSngNOBBqB3nDbweEk6f8AfE/SoSM5sZndZmY1ZlZTVVU1qkGn2qrGGGZ4j3HnXEZK5UROjcDMhPfVYdkuZraBsMYhqRj4iJk1h9saw9d1kpYBbwHuB8ol5Ya1jt3OmQ28x7hzLpOlssbxDDA3fAoqHzgHWJq4g6RKSX0xXAvcHpZPklTQtw9wHPCCmRlBW8hHw2MuAH6fwmtIi7pojBnlRVQUF6Q7FOec203KEkdYI7gMeBB4EbjXzFZLukFS31NSJwFrJL0MTAFuDMvnA7WS6ggSxbfM7IVw25eBz0taS9Dm8bNUXUO61EebOXKm1zacc5kppXOOm9kDwAODyq5LWL+P/iekEvd5Ali8h3OuI3hiKytt39FFw/adnHfMwekOxTnnhpTuxnE3iLdvOOcynSeODFMfjSHBYh9qxDmXoTxxZJj6aDOHVE6kpDAv3aE459yQPHFkEDOjLhrz/hvOuYzmiSODbGrpoKm109s3nHMZLaVPVY15j94IW1+GSbNh0sHh62womwmR0b+VVB8NRsRd7DUO51wG88SxN107YPMqeOlPEO/uL1cOlFUHSaQ8IaFMmhO8TjgI9mFwwvpoM7k5YuH00lG6AOecG32eOPbm9P8IlngvtG6EN18ftLwBLz8IO7YMPC6/OCGZzB6YYMpnQd7QQ6XXR2PMm1JCYV4kddfknHP7yRNHMnIiQQ2jrBpmv2v37V07giTy5uvQ/EZ/Ytm2Ftb+BXo6Bu5fMj0hqQQJxcoPZkPDeo5efETKL2fE4nHo7QqWnAhECoJXH/LduXHJE8doyJ8IUxYEy2Bm0La5P7EkLuuWQesGAAQ8AvSsLoRNswfdAjsY8iZAb3f4Bd6ZsN41cL1niLIB68NsH+p46939uhBE8sMlL3jNzd+9bNd6wRBl+ft4XF5wuzDd8ibA1MUpae9yLpN54kg1CUqmBsusY3bf3t0BsQaeXFHLA8uf4sq35lHZvTFING/8L3S1jfwzd/sSTvzyTfzCLoTCskHlQx2T8IUd791D0tlTMuuGrnbobR5ie8IxPZ2A7fef+4DLL4HZx8EhJwVL1RFeE3PB/yc52XvL2RNHuuUVQuVc/tLdzb0q57qz3wuR8Ne0GbRvD2onvZ0JX+JD/TLPh9wCyMkdu19c8d4haj5D1Y460x1pYMdWeP2vQc3x5f8JyoqnwJwT4ZATg0RSVp3GAF1KmEFHMzQ3QCwKsQZoXh+8xqJB+Y4twY+K4snBj8biKcFSMiVhPSwvOghyMqAGPQKeODJEfbSZhdNLyYsk/AckwcSKYBkPciKQUwR5RemOJHmLwgksm9fDuseDJLLuMXj+3qC84rAwkZwEc46HoklpCtQlLR6Htk1hYgiXXethYuhqHXhMbmHYDjoT5r0XSqZBZ2twnrYtsLEueB18HAQ/9iZODpPK1IRkMzl4v2t9SvDjMAN44sgAPb1xVjW28Im3zxx+Z5eZymfBWz8ZLGaw5YUwiSyDunug9mdBu8y0I/tva808do9P2LkU6u6AlsawlhAdlBgaINY48PF7gMJyKJ8ZPHI/54T+JFE+E8pmwcTK5Gr6nW1Bm2fblv6k0ropLNscxNO4AnY0MeSt28LyPdRgpg6s3RSWpfTOgyeODLC2qY2d3b0+B0e2kGDKwmB5x6XBbbfGFUESee1xeOIW+Nt3g3akWceGieREmHZUVt8XP2B2NickgyjE1g+sMbRtHnSAghpC+UyYUQMLPxQmhllhYqiGgpLRia2gOFgqhpkJu7cH2rcOTCqt4WvbpmC94eng/eCnNiGoAfXVUj70/4b/vBHyxJEB6huCHuNLvMd4dsrNh4PfESwnXxvcwnjjyf4aySP/FjxSV1gW/JqdcyIccnLwP/tYba86kNq3w6uPwisPw6uPhL/WE+y6jVQNc98T1A7LwoRQPhNKZ2Tek3GR3P6HavbGDDpbwqQyRA2mbXPQr2yUeeLIAHXRZkoKcplTMTHdobgDoaAE5r0nWCD4n/215UHbyLrH4cU/BOWl1f2N7HNODG5LuODLclM9vPJQkCyiz4DFg0bmw94N05aEiSG8lTSxKnsTsBT84Cgsg6p5B+xjU5o4JJ0OfB+IAD81s28N2n4wwTzjVcB24Hwzi0o6CvgRUAr0Ajea2W/CY+4ETgRi4WkuNLOVqbyOVKuPxlhcXUZOTpb+x+32rngyLP5osJjB9nX9t7XWPAAr7w72q5rff1vr4OOgcBwNTdMRg1cfCxLF2of7bzdNfwuc8MWgJjH9LX6r7wBJWeKQFAFuBU4DosAzkpYmzB0OcBNwl5n9XNIpwDeBTwLtwKfM7BVJ04EVkh40s+bwuC+G086OeZ09vby0qYWL3nVIukNxmUAKblFVHApvvyh4wmdTff9trRV3wNM/AkWguiaoicw+DqYszq6n7/oeMHjlIXjlL9DwFMR7gl/Wh54aJIrDTg2SrjvgUlnjOBpYG84RjqR7gLOAxMSxAPh8uP4Y8DsAM3u5bwcz2yBpC0GtpJks8+LGVrp7jSN9KHU3lJwcmH5UsLzrquCJoOjfw0TyOPz1Jlj+f4J9i6f2N8pPWQRTF0HF3KCNZSzobA2uae3DQc2ipTEon7oYjrsSDjsNqt8e3P93aZXKf4EZQEPC+ygwuOt0HfBhgttZHwJKJFWY2ba+HSQdDeQDryYcd6Ok6wiaFK8xs916hEm6GLgYYNasWft/NSnyfDjH+GJPHC4ZeYVhA/oJcCrBE0QbnoPNq8NlFTz946CzJEBOHlQdnpBQwqRSPCX99/3NYOsrYa3iIXjjieAx2PwSOPQkOOmaoM2idHp643S7SXfqvhr4gaQLgeVAI0GbBgCSpgG/AC4ws3hYfC2wiSCZ3AZ8Gbhh8InN7LZwOzU1NRk7lkVdNEbFxHxmlI+hTm8ucxSVw6EnB0uf3u5ggM2+RLJ5Nbz+N6j/Tf8+Eyr6k8iURcF61RGp71fS1R70tu9LFs3rg/Kq+XDsZ4JbUDOPGTu1pHEqlYmjEUjs0VYdlu1iZhsIahxIKgY+0teOIakU+BPwr2b2VMIxG8PVTkl3ECSfMas+2syS6jKU7l9/LntE8mDy/GBZ/NH+8vbtQbvB5tWw6fngtfYO6NkZbFck6OmeWDOZsjB4bHV//vvc9mp/o/Zrfw2GjMmbEDT0v+tzwS2ocu/8OpakMnE8A8yVNIcgYZwD/EPiDpIqge1hbeJagieskJQP/Jag4fy+QcdMM7ONCr5pzwZWpfAaUmpHZw9rt7RxxqJp6Q7FjQcTDgqmBUicGiDeC9tf66+ZbF4ddFZc/d/9+xSW9SeRvoQyeX4wKvRQujuCATpfeTioVWwP7zJXzIW3/zPMfXfwVFiGDJ/hRm7YxCHpA8CfEm4VJcXMeiRdBjxI8Dju7Wa2WtINQK2ZLQVOAr4pyQhuVV0aHv5x4ASgIryNBf2P3d4tqYpgJPKVwCUjiSuTrGqMETe8x7hLn5wIVB4WLAvP7i/viMGWFwcmlJW/ShitWXDQnIE1k7bNQbJ4bTl0twcd72YfD8dcEiSLg/zJwWwhs73f/pf0S+AdwP0EX/4vHfAx2+EAABZTSURBVIjARlNNTY3V1tamO4zd/GT5Om584EVqv/puKov915fLcPF4MHxHXyLpu921fR27xlWaNDtop5j7nqBmM5YGrHS7kbTCzGoGlw9b4zCz88P2hnOBO8PawR3Ar81siKEeXbLqos3MKC/ypOHGhpyc/snFjnhff3nXDtjyUtAhseKw9D+t5VIuqUHgzawFuA+4B5hG8Ojss5IuT2FsWa8+GmOJP4brxrr8iVD9Nqic60ljnBg2cUj6oKTfAsuAPOBoMzsDOBL4QmrDy15v7uhi/fZ2H9jQOTfmJPNU1UeA75rZ8sRCM2uXdFFqwsp+9Y3BUFveY9w5N9YkkziuB/r6TiCpCJhiZq+b2SOpCizb1TcEPcYXeeJwzo0xybRx/BeQ+Chub1jm9kNdNMYhVRMpLcyweQCcc24YySSOXDPr6nsTrvt4APupPtrMkd6+4Zwbg5JJHE2SPtj3RtJZwNbUhZT9NsU62NLa6U9UOefGpGTaOC4h6K39A4Le2g3Ap1IaVZarD0fE9cThnBuLkukA+CpwbDgIIWbWNswhbhj10RiRHLFgmicO59zYk9Qgh5LeBywECvtGcTWz3YYyd8mpizYzb0oJRfk+zaVzbuxJpgPgj4FPAJcT3Kr6GHBwiuPKWmbG840x77/hnBuzkmkcf6eZfQp408z+jWDAw3mpDSt7rd/eTnN7t/cYd86NWckkjo7wtV3SdKCbYLwqtw/qokGPcW8Yd86NVcm0cfxBUjnwf4FnCcZP/klKo8pi9Q3NFOTmcPjUknSH4pxz+2SviUNSDvBIOJ3r/ZL+CBSaWeyARJeF6qMxFkwvJS+S1MDEzjmXcfb67RXO+ndrwvtOTxr7rjdurNoQ8x7jzrkxLZmfvY9I+og08oH2JZ0uaY2ktZKuGWL7wZIekVQvaZmk6oRtF0h6JVwuSCh/m6Tnw3PevC9xpcvaLW20d/V6+4ZzbkxLJnH8C8Gghp2SWiS1SmoZ7iBJEYLayhnAAuBcSQsG7XYTcJeZLQFuAL4ZHnsQ8HXgGOBo4OuSJoXH/Aj4NDA3XE5P4hoyQt2uHuNe43DOjV3DJg4zKzGzHDPLN7PS8H1pEuc+GlhrZuvCgRHvAc4atM8C4NFw/bGE7e8FHjaz7Wb2JvAwcLqkaUCpmT1lwWTpdwFnJxFLRqiPNlNSkMshlRPTHYpzzu2zYZ+qknTCUOWDJ3YawgyCca36RAlqEInqgA8D3yeYjrZEUsUejp0RLtEhyoeK+2LgYoBZs2YNE+qBUR+NsWhGGTk5Y+bumnPO7SaZx3G/mLBeSFCTWAGcMgqffzXwA0kXAsuBRoL5Pvabmd0G3AZQU1Njo3HO/dHZ08uLG1v4p3fNSXcozjm3X5IZ5PADie8lzQS+l8S5G4GZCe+rw7LEc28gqHEQDqL4ETNrltQInDTo2GXh8dWDygecM1O9tLGV7l7zJ6qcc2PevnQmiALzk9jvGWCupDmS8oFzgKWJO0iqDPuKAFwL3B6uPwi8R9KksFH8PcCDZrYRaJF0bPg01aeA3+/DNRxwfXOML57hT1Q558a2ZNo4biHoLQ5BojmKoAf5XplZj6TLCJJABLjdzFZLugGoNbOlBLWKb0oygltVl4bHbpf07wTJB+AGM9sern8WuBMoAv4cLhmvvqGZgybmUz2pKN2hOOfcfkmmjaM2Yb0H+LWZ/W8yJzezB4AHBpVdl7B+H3DfHo69nf4aSGJ5LbAomc/PJPXRGEuqyxhD3U6cc25IySSO+4AOM+uFoH+GpAlm1p7a0LJHe1cPr2xp5b2LpqY7FOec229J9RwnuC3Upwj4S2rCyU6rGluIGz4Hh3MuKySTOAoTp4sN1yekLqTsU+89xp1zWSSZxLFD0lv73kh6G7AzdSFln7pojOllhVSVFKQ7FOec22/JtHFcBfyXpA0EU8dOJZhK1iWpPtrstQ3nXNZIpgPgM5KOAA4Pi9aYWXdqw8oeze1dvLGtnU+8febwOzvn3Bgw7K0qSZcCE81slZmtAoolfTb1oWWH+nCqWO8x7pzLFsm0cXw6nAEQgHC02k+nLqTs0tcwvsh7jDvnskQyiSOSOFlSOM9GfupCyi510RiHVE6krCgv3aE459yoSCZx/A/wG0mnSjoV+DVjZJiPTBA0jHttwzmXPZJ5qurLBPNaXBK+ryd4ssoNY3NLB5tbOv2JKudcVklmBsA48DTwOsFcHKcAL6Y2rOywq2F8ptc4nHPZY481DknzgHPDZSvwGwAzO/nAhDb21UebieSIBdM8cTjnssfeblW9BPwVeL+ZrQWQ9LkDElWWqIvGmDu5mKL8SLpDcc65UbO3W1UfBjYCj0n6Sdgw7mOCJ8nMqI82e/8N51zW2WPiMLPfmdk5wBHAYwRDj0yW9CNJ7zlQAY5VDdt30tzezRJv33DOZZlkGsd3mNmvwrnHq4HnCJ60Gpak0yWtkbRW0jVDbJ8l6TFJz0mql3RmWH6epJUJS1zSUeG2ZeE5+7ZNHtEVHyB1Ycc/r3E457JNMo/j7hL2Gr8tXPYq7Ch4K3AawTzlz0haamYvJOz2VeBeM/uRpAUEswXONrO7gbvD8ywGfmdmKxOOOy+cCTBj1Uebyc/N4fCpJekOxTnnRlUyHQD31dHAWjNbZ2ZdwD3AWYP2MaA0XC8DNgxxnnPDY8eUumiMBdNKyYuk8k/snHMHXiq/1WYADQnvo2FZouuB8yVFCWoblw9xnk8Q9FZPdEd4m+pricOhZIreuLGqMeYz/jnnslK6fw6fC9xpZtXAmcAvJO2KSdIxQHs4Km+f88xsMXB8uHxyqBNLulhSraTapqam1F3BEF5taqO9q9d7jDvnslIqE0cjkDgJRXVYlugi4F4AM3sSKAQqE7afw6Dahpk1hq+twK8IbontxsxuM7MaM6upqqraj8sYubqGsGHcn6hyzmWhVCaOZ4C5kuZIyidIAksH7bMeOBVA0nyCxNEUvs8BPk5C+4akXEmV4Xoe8H5gFRmmPhqjuCCXQyqL0x2Kc86NuhE9VTUSZtYj6TLgQSAC3G5mqyXdANSa2VLgC8BPwh7pBlxoZhae4gSgwczWJZy2AHgwTBoR4C/AT1J1DfuqPtrMohml5ORkXPOLc87tt5QlDgAze4Cg0Tux7LqE9ReA4/Zw7DLg2EFlO4C3jXqgo6irJ86LG1v5x+NmpzsU55xLiXQ3jmedlza10NUb94Zx51zW8sQxyvqGUvfJm5xz2coTxyirjzYzaUIe1ZOK0h2Kc86lhCeOUVYfjbGkupwM7JfonHOjwhPHKGrv6uHlza3eY9w5l9U8cYyi1RtaiBveMO6cy2qeOEZRX49xn4PDOZfNPHGMovpojGllhUwuKUx3KM45lzKeOEZRfbTZH8N1zmU9TxyjJNbezevb2r19wzmX9TxxjJL6Rp8q1jk3PnjiGCV9PcYX+60q51yW88QxSuoamplTOZGyorx0h+KccynliWOUBD3GvbbhnMt+njhGwZaWDja1dHjDuHNuXPDEMQr62jd8qBHn3HjgiWMU1EebyREsmF6a7lCccy7lUpo4JJ0uaY2ktZKuGWL7LEmPSXpOUr2kM8Py2ZJ2SloZLj9OOOZtkp4Pz3mzMmAY2rpojHlTSpiQn9IJFZ1zLiOkLHFIigC3AmcAC4BzJS0YtNtXgXvN7C3AOcAPE7a9amZHhcslCeU/Aj4NzA2X01N1DckwM+8x7pwbV1JZ4zgaWGtm68ysC7gHOGvQPgb03d8pAzbs7YSSpgGlZvaUmRlwF3D26IY9MtE3d/Jme7c3jDvnxo1UJo4ZQEPC+2hYluh64HxJUeAB4PKEbXPCW1iPSzo+4ZzRYc4JgKSLJdVKqm1qatqPy9i7uqj3GHfOjS/pbhw/F7jTzKqBM4FfSMoBNgKzwltYnwd+JWlELc9mdpuZ1ZhZTVVV1agH3qc+GiM/ksPhU0tS9hnOOZdJUtma2wjMTHhfHZYluoiwjcLMnpRUCFSa2RagMyxfIelVYF54fPUw5zyg6hqamT+9lPzcdOdg55w7MFL5bfcMMFfSHEn5BI3fSwftsx44FUDSfKAQaJJUFTauI+kQgkbwdWa2EWiRdGz4NNWngN+n8Br2qjdurGqMef8N59y4krIah5n1SLoMeBCIALeb2WpJNwC1ZrYU+ALwE0mfI2gov9DMTNIJwA2SuoE4cImZbQ9P/VngTqAI+HO4pMW6pjZ2dPV6w7hzblxJaccDM3uAoNE7sey6hPUXgOOGOO5+4P49nLMWWDS6ke6bOu8x7pwbh/zG/H6ojzYzMT/CIVXF6Q7FOecOGE8c+6EuGmPRjDIiOWnvvO6ccweMJ4591NUT58UNLRw509s3nHPjiyeOfbRmUytdvXEfasQ5N+544thHPse4c2688sSxj+obYkyakEf1pKJ0h+KccweUJ459VBdtZnF1ORkwqrtzzh1Qnjj2wc6uXl7Z0ub9N5xz45Injn2wekOM3rh5j3Hn3LjkiWMfeI9x59x45oljH9RHm5laWsjk0sJ0h+KccwecJ459UB+Nef8N59y45YljhGI7u3lt6w7vMe6cG7c8cYzQ82H7htc4nHPjlSeOEeqbY3zJDK9xOOfGJ08cI1QfbWZ2xQTKJuSlOxTnnEsLTxwjFDSMe23DOTd+pTRxSDpd0hpJayVdM8T2WZIek/ScpHpJZ4blp0laIen58PWUhGOWhedcGS6TU3kNiba0drAx1uHtG865cS1lU8dKigC3AqcBUeAZSUvD6WL7fBW418x+JGkBwTSzs4GtwAfMbIOkRQTzls9IOO68cArZA6qvYdyfqHLOjWeprHEcDaw1s3Vm1gXcA5w1aB8DSsP1MmADgJk9Z2YbwvLVQJGkghTGmpS6aIwcwcLppcPv7JxzWSqViWMG0JDwPsrAWgPA9cD5kqIEtY3LhzjPR4BnzawzoeyO8DbV17SH4WklXSypVlJtU1PTPl9EovpoM3MnlzAhP2UVNeecy3jpbhw/F7jTzKqBM4FfSNoVk6SFwLeBf0k45jwzWwwcHy6fHOrEZnabmdWYWU1VVdV+B2pm3mPcOedIbeJoBGYmvK8OyxJdBNwLYGZPAoVAJYCkauC3wKfM7NW+A8ysMXxtBX5FcEss5aJv7mT7ji6WePuGc26cS2XieAaYK2mOpHzgHGDpoH3WA6cCSJpPkDiaJJUDfwKuMbP/7dtZUq6kvsSSB7wfWJXCa9il3kfEdc45IIWJw8x6gMsInoh6keDpqdWSbpD0wXC3LwCfllQH/Bq40MwsPO4w4LpBj90WAA9KqgdWEtRgfpKqa0hUH20mP5LDEVO9Ydw5N76ltJXXzB4gaPROLLsuYf0F4LghjvsG8I09nPZtoxljsuqizcyfVkJ+brqbhZxzLr38WzAJ8bixqrHFe4w75xyeOJKybmsbbZ09/kSVc87hiSMpdQ3eY9w55/p44khCfbSZCfkRDq0qTncozjmXdp44klAXjbFoRhmRnCE7qTvn3LjiiWMYXT1xXtjY4v03nHMu5IljGC9vbqWrJ+5PVDnnXMgTxzD6e4x74nDOOfDEMaz6aDPlE/KYeVBRukNxzrmM4IljGHXRGItnlLGH0dudc27c8cSxFzu7enl5c6vfpnLOuQSeOPbihY0xeuPmPcadcy6BJ4698B7jzjm3O08ce1EfbWZKaQFTSgvTHYpzzmUMnzx7L+ZOKWFauT9N5ZxziTxx7MWlJx+W7hCccy7j+K0q55xzI5LSxCHpdElrJK2VdM0Q22dJekzSc5LqJZ2ZsO3a8Lg1kt6b7Dmdc86lVsoSh6QIcCtwBrAAOFfSgkG7fZVgLvK3AOcAPwyPXRC+XwicDvxQUiTJczrnnEuhVNY4jgbWmtk6M+sC7gHOGrSPAaXhehmwIVw/C7jHzDrN7DVgbXi+ZM7pnHMuhVKZOGYADQnvo2FZouuB8yVFgQeAy4c5NplzAiDpYkm1kmqbmpr29Rqcc84Nku7G8XOBO82sGjgT+IWkUYnJzG4zsxozq6mqqhqNUzrnnCO1j+M2AjMT3leHZYkuImjDwMyelFQIVA5z7HDndM45l0KprHE8A8yVNEdSPkFj99JB+6wHTgWQNB8oBJrC/c6RVCBpDjAX+HuS53TOOZdCKatxmFmPpMuAB4EIcLuZrZZ0A1BrZkuBLwA/kfQ5gobyC83MgNWS7gVeAHqAS82sF2Cocw4Xy4oVK7ZKemMfL6US2LqPx2Yj/3v087/FQP73GCgb/h4HD1Wo4Hva7YmkWjOrSXccmcL/Hv38bzGQ/z0Gyua/R7obx51zzo0xnjicc86NiCeO4d2W7gAyjP89+vnfYiD/ewyUtX8Pb+Nwzjk3Il7jcM45NyKeOJxzzo2IJ4698CHcA5JmhsPfvyBptaQr0x1TJghHbH5O0h/THUu6SSqXdJ+klyS9KOkd6Y4pXSR9Lvz/ZJWkX4cjYmQVTxx74EO4D9ADfMHMFgDHApeO479FoiuBF9MdRIb4PvA/ZnYEcCTj9O8iaQZwBVBjZosIOiqfk96oRp8njj3zIdxDZrbRzJ4N11sJvhSGHJV4vJBUDbwP+Gm6Y0k3SWXACcDPAMysy8ya0xtVWuUCRZJygQn0TxeRNTxx7FnSQ7iPJ5JmA28Bnk5vJGn3PeBLQDzdgWSAOQRjzN0R3rr7qaSJ6Q4qHcysEbiJYBy+jUDMzB5Kb1SjzxOHS5qkYuB+4Coza0l3POki6f3AFjNbke5YMkQu8FbgR+FsnjuAcdkmKGkSwZ2JOcB0YKKk89Mb1ejzxLFnyQwLP25IyiNIGneb2X+nO540Ow74oKTXCW5hniLpl+kNKa2iQNTM+mqh9xEkkvHo3cBrZtZkZt3AfwPvTHNMo84Tx575EO4hSSK4f/2imX0n3fGkm5lda2bVZjab4L+LR80s635VJsvMNgENkg4Pi04lGNl6PFoPHCtpQvj/zalk4YMCqZzIaUzb07DwaQ4rXY4DPgk8L2llWPYVM3sgjTG5zHI5cHf4I2sd8I9pjictzOxpSfcBzxI8jfgcWTj0iA854pxzbkT8VpVzzrkR8cThnHNuRDxxOOecGxFPHM4550bEE4dzzrkR8cTh3CiQ1CtpZcIyaj2nJc2WtGq0zufc/vJ+HM6Njp1mdlS6g3DuQPAah3MpJOl1Sf9H0vOS/i7psLB8tqRHJdVLekTSrLB8iqTfSqoLl77hKiKSfhLO8/CQpKK0XZQb9zxxODc6igbdqvpEwraYmS0GfkAwqi7ALcDPzWwJcDdwc1h+M/C4mR1JMN5T32gFc4FbzWwh0Ax8JMXX49weec9x50aBpDYzKx6i/HXgFDNbFw4UucnMKiRtBaaZWXdYvtHMKiU1AdVm1plwjtnAw2Y2N3z/ZSDPzL6R+itzbnde43Au9WwP6yPRmbDei7dPujTyxOFc6n0i4fXJcP0J+qcUPQ/4a7j+CPAZ2DWnedmBCtK5ZPmvFudGR1HCyMEQzL/d90juJEn1BLWGc8OyywlmzPsiwex5faPJXgncJukigprFZwhmknMuY3gbh3MpFLZx1JjZ1nTH4txo8VtVzjnnRsRrHM4550bEaxzOOedGxBOHc865EfHE4ZxzbkQ8cTjnnBsRTxzOOedG5P8DKtO4zhZFCcsAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "display_data", "data": { "application/javascript": [ "\n", " async function download(id, filename, size) {\n", " if (!google.colab.kernel.accessAllowed) {\n", " return;\n", " }\n", " const div = document.createElement('div');\n", " const label = document.createElement('label');\n", " label.textContent = `Downloading \"${filename}\": `;\n", " div.appendChild(label);\n", " const progress = document.createElement('progress');\n", " progress.max = size;\n", " div.appendChild(progress);\n", " document.body.appendChild(div);\n", "\n", " const buffers = [];\n", " let downloaded = 0;\n", "\n", " const channel = await google.colab.kernel.comms.open(id);\n", " // Send a message to notify the kernel that we're ready.\n", " channel.send({})\n", "\n", " for await (const message of channel.messages) {\n", " // Send a message to notify the kernel that we're ready.\n", " channel.send({})\n", " if (message.buffers) {\n", " for (const buffer of message.buffers) {\n", " buffers.push(buffer);\n", " downloaded += buffer.byteLength;\n", " progress.value = downloaded;\n", " }\n", " }\n", " }\n", " const blob = new Blob(buffers, {type: 'application/binary'});\n", " const a = document.createElement('a');\n", " a.href = window.URL.createObjectURL(blob);\n", " a.download = filename;\n", " div.appendChild(a);\n", " a.click();\n", " div.remove();\n", " }\n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "application/javascript": [ "download(\"download_be8d2354-08a5-48d8-9471-2396676df37f\", \"training & validation lossSST1.pdf\", 11746)" ], "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "code", "metadata": { "id": "Q-T-JjwwTAuG" }, "source": [ "from sklearn.metrics import classification_report,confusion_matrix,accuracy_score\n", "pred=model_conv.predict(X_valid)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Bs-6MEygTAuT", "outputId": "a6433616-a44a-4590-8a2c-99e659687a78" }, "source": [ "v = np.where(pred > 0.5, 1, 0)\n", "\n", "\n", "\n", "print(\"++++++++++++++++++++++=Testing Results++++++++++++++++++++\")\n", "\n", "print(\"Testing Accuracy\")\n", "print(accuracy_score(Y_valid,v))\n", "print(\"Traning Classifcation Report\")\n", "print(classification_report(Y_valid,v))\n", "\n", "print(\"Testing Confusion\")\n", "print(confusion_matrix(Y_valid.ravel(),v.ravel()))\n", "cm1 = confusion_matrix(Y_valid.ravel(),v.ravel())\n", "\n", "Accuracy = cm1[0,0]/(cm1[0,1]+cm1[0,0])\n", "print('Accuracy 0 class : ', Accuracy)\n", "\n", "Accuracy = cm1[1,1]/(cm1[1,0]+cm1[1,1])\n", "print('Accuracy 1 class : ', Accuracy)\n", "\n", "total1=sum(sum(cm1))\n", "\n", "Accuracy = cm1[0,1]/(cm1[0,0]+cm1[0,1])\n", "print('Error Rate for 0: ', Accuracy)\n", "\n", "\n", "Accuracy = cm1[1,0]/(cm1[1,1]+cm1[1,0])\n", "print('Error Rate for 1: ', Accuracy)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "++++++++++++++++++++++=Testing Results++++++++++++++++++++\n", "Testing Accuracy\n", "0.9261453396524486\n", "Traning Classifcation Report\n", " precision recall f1-score support\n", "\n", " 0 0.91 0.95 0.93 1285\n", " 1 0.94 0.90 0.92 1247\n", "\n", " micro avg 0.93 0.93 0.93 2532\n", " macro avg 0.93 0.93 0.93 2532\n", "weighted avg 0.93 0.93 0.93 2532\n", " samples avg 0.93 0.93 0.93 2532\n", "\n", "Testing Confusion\n", "[[2345 187]\n", " [ 187 2345]]\n", "Accuracy 0 class : 0.9261453396524486\n", "Accuracy 1 class : 0.9261453396524486\n", "Error Rate for 0: 0.07385466034755134\n", "Error Rate for 1: 0.07385466034755134\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "GuWV1VuIUxvV" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "5vlWvQ-oUxye" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "PxwtK5XM604I", "outputId": "f8403fd7-f5ea-4f1a-878d-50748e200947" }, "source": [ "import tensorflow.keras\n", "tokenizer = tensorflow.keras.preprocessing.text.Tokenizer(num_words=5000, lower=True,split=' ',filters='!\"#$%&()*+,-./:;<=>?@[\\\\]^_`{|}~\\t\\n')\n", "tokenizer.fit_on_texts(df[\"cleanText\"].values)\n", "#print(tokenizer.word_index) # To see the dicstionary\n", "X = tokenizer.texts_to_sequences(df[\"cleanText\"].values)\n", "X = tensorflow.keras.preprocessing.sequence.pad_sequences(X)\n", "\n", "\n", "from keras.layers import Dense, Flatten, LSTM, Conv1D, MaxPooling1D, Dropout, Activation,Embedding\n", "from keras.models import Sequential\n", "model_conv = Sequential()\n", "model_conv.add(Embedding(5000, 100, input_length=X.shape[1]))\n", "model_conv.add(Conv1D(128, 5, activation='relu'))\n", "model_conv.add(MaxPooling1D(pool_size=4))\n", "model_conv.add(Flatten())\n", "model_conv.add(Dense(32))\n", "model_conv.add(Dense(2, activation='softmax'))\n", "model_conv.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n", "\n", "#Y = data.Reviewer_Score\n", "Y = pd.get_dummies(df.sentiments).values\n", "\n", "X_train, X_valid, Y_train, Y_valid = train_test_split(X,Y, test_size = 0.25, random_state =2)\n", "batch_size=128\n", "#Here we train the Network.\n", "\n", "pred=model_conv.fit(X_train, Y_train, batch_size =batch_size, epochs =10, verbose =2,validation_data=(X_valid,Y_valid))\n", "pred" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Epoch 1/10\n", "60/60 - 4s - loss: 0.5159 - accuracy: 0.7592 - val_loss: 0.2455 - val_accuracy: 0.9036\n", "Epoch 2/10\n", "60/60 - 3s - loss: 0.1218 - accuracy: 0.9550 - val_loss: 0.1776 - val_accuracy: 0.9293\n", "Epoch 3/10\n", "60/60 - 3s - loss: 0.0542 - accuracy: 0.9828 - val_loss: 0.1563 - val_accuracy: 0.9439\n", "Epoch 4/10\n", "60/60 - 3s - loss: 0.0285 - accuracy: 0.9910 - val_loss: 0.1933 - val_accuracy: 0.9380\n", "Epoch 5/10\n", "60/60 - 3s - loss: 0.0166 - accuracy: 0.9953 - val_loss: 0.2084 - val_accuracy: 0.9376\n", "Epoch 6/10\n", "60/60 - 3s - loss: 0.0089 - accuracy: 0.9978 - val_loss: 0.2481 - val_accuracy: 0.9301\n", "Epoch 7/10\n", "60/60 - 3s - loss: 0.0054 - accuracy: 0.9986 - val_loss: 0.2714 - val_accuracy: 0.9325\n", "Epoch 8/10\n", "60/60 - 3s - loss: 0.0028 - accuracy: 0.9996 - val_loss: 0.2947 - val_accuracy: 0.9301\n", "Epoch 9/10\n", "60/60 - 3s - loss: 0.0020 - accuracy: 0.9997 - val_loss: 0.3206 - val_accuracy: 0.9277\n", "Epoch 10/10\n", "60/60 - 3s - loss: 9.5111e-04 - accuracy: 0.9999 - val_loss: 0.3442 - val_accuracy: 0.9285\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 28 } ] }, { "cell_type": "code", "metadata": { "id": "iEoJkkFb607R", "colab": { "base_uri": "https://localhost:8080/", "height": 573 }, "outputId": "1c6bc49b-0112-496b-fd09-eb283a100f67" }, "source": [ "import matplotlib.pyplot as plt\n", "from google.colab import files\n", "\n", "# Plot training & validation accuracy values\n", "plt.plot(pred.history['accuracy'])\n", "plt.plot(pred.history['val_accuracy'])\n", "plt.title('Model accuracy')\n", "plt.ylabel('Accuracy')\n", "plt.xlabel('Epoch')\n", "plt.legend(['Train', 'Test'], loc='upper left')\n", "plt.show()\n", "\n", "\n", "# Plot training & validation loss values\n", "plt.plot(pred.history['loss'])\n", "plt.plot(pred.history['val_loss'])\n", "plt.title('Model loss')\n", "plt.ylabel('Loss')\n", "plt.xlabel('Epoch')\n", "plt.legend(['Train', 'Test'], loc='upper left')\n", "plt.show()\n" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "code", "metadata": { "id": "wi4Fkbs2TCa1" }, "source": [ "from sklearn.metrics import classification_report,confusion_matrix,accuracy_score\n", "pred=model_conv.predict(X_valid)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "tGbk0uJeTCa3", "outputId": "6d840172-120c-490a-91fa-ca0a39bf364e" }, "source": [ "v = np.where(pred > 0.5, 1, 0)\n", "\n", "\n", "\n", "print(\"++++++++++++++++++++++=Testing Results++++++++++++++++++++\")\n", "\n", "print(\"Testing Accuracy\")\n", "print(accuracy_score(Y_valid,v))\n", "print(\"Traning Classifcation Report\")\n", "print(classification_report(Y_valid,v))\n", "\n", "print(\"Testing Confusion\")\n", "print(confusion_matrix(Y_valid.ravel(),v.ravel()))\n", "cm1 = confusion_matrix(Y_valid.ravel(),v.ravel())\n", "\n", "Accuracy = cm1[0,0]/(cm1[0,1]+cm1[0,0])\n", "print('Accuracy 0 class : ', Accuracy)\n", "\n", "Accuracy = cm1[1,1]/(cm1[1,0]+cm1[1,1])\n", "print('Accuracy 1 class : ', Accuracy)\n", "\n", "total1=sum(sum(cm1))\n", "\n", "Accuracy = cm1[0,1]/(cm1[0,0]+cm1[0,1])\n", "print('Error Rate for 0: ', Accuracy)\n", "\n", "\n", "Accuracy = cm1[1,0]/(cm1[1,1]+cm1[1,0])\n", "print('Error Rate for 1: ', Accuracy)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "++++++++++++++++++++++=Testing Results++++++++++++++++++++\n", "Testing Accuracy\n", "0.9285150078988942\n", "Traning Classifcation Report\n", " precision recall f1-score support\n", "\n", " 0 0.93 0.93 0.93 1285\n", " 1 0.92 0.93 0.93 1247\n", "\n", " micro avg 0.93 0.93 0.93 2532\n", " macro avg 0.93 0.93 0.93 2532\n", "weighted avg 0.93 0.93 0.93 2532\n", " samples avg 0.93 0.93 0.93 2532\n", "\n", "Testing Confusion\n", "[[2351 181]\n", " [ 181 2351]]\n", "Accuracy 0 class : 0.9285150078988942\n", "Accuracy 1 class : 0.9285150078988942\n", "Error Rate for 0: 0.07148499210110584\n", "Error Rate for 1: 0.07148499210110584\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "LWOflLHeU3qU" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "fn3yU3eiU3zS" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "Q6v9wXLs75wg", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "0adeacb2-00d9-4ab9-b3f9-823fa6c7b854" }, "source": [ "from keras import optimizers\n", "from keras.models import Sequential\n", "from keras.layers import Embedding\n", "from keras.layers import Dense, Flatten, LSTM, Conv1D, MaxPooling1D, Dropout, Activation,Embedding\n", "from keras.models import Sequential\n", "tokenizer = tensorflow.keras.preprocessing.text.Tokenizer(num_words=5000, lower=True,split=' ',filters='!\"#$%&()*+,-./:;<=>?@[\\\\]^_`{|}~\\t\\n')\n", "tokenizer.fit_on_texts(dataF[\"cleanText\"].values)\n", "#print(tokenizer.word_index) # To see the dicstionary\n", "X = tokenizer.texts_to_sequences(dataF[\"cleanText\"].values)\n", "X = tensorflow.keras.preprocessing.sequence.pad_sequences(X)\n", "#Deep Learning Network Structure\n", "model_conv = Sequential()\n", "model_conv.add(Embedding(5000,100, input_length=X.shape[1]))\n", "model_conv.add(Dropout(0.5))\n", "model_conv.add(LSTM(100))\n", "model_conv.add(Dense(2, activation='softmax'))\n", "model_conv.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n", "#Y = data.Reviewer_Score\n", "Y = pd.get_dummies(dataF.sentiments).values\n", "\n", "X_train, X_valid, Y_train, Y_valid = train_test_split(X,Y, test_size = 0.20, random_state =2)\n", "batch_size=128\n", "#Here we train the Network.\n", "\n", "pred=model_conv.fit(X_train, Y_train, batch_size =batch_size, epochs =10, verbose =2,validation_data=(X_valid,Y_valid))\n", "pred" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Epoch 1/10\n", "64/64 - 206s - loss: 0.4884 - accuracy: 0.7607 - val_loss: 0.1923 - val_accuracy: 0.9284\n", "Epoch 2/10\n", "64/64 - 210s - loss: 0.2005 - accuracy: 0.9268 - val_loss: 0.1298 - val_accuracy: 0.9521\n", "Epoch 3/10\n", "64/64 - 212s - loss: 0.0770 - accuracy: 0.9725 - val_loss: 0.1038 - val_accuracy: 0.9650\n", "Epoch 4/10\n", "64/64 - 216s - loss: 0.0411 - accuracy: 0.9874 - val_loss: 0.1103 - val_accuracy: 0.9620\n", "Epoch 5/10\n", "64/64 - 215s - loss: 0.0324 - accuracy: 0.9904 - val_loss: 0.1139 - val_accuracy: 0.9605\n", "Epoch 6/10\n", "64/64 - 214s - loss: 0.0218 - accuracy: 0.9931 - val_loss: 0.1362 - val_accuracy: 0.9556\n", "Epoch 7/10\n", "64/64 - 214s - loss: 0.0133 - accuracy: 0.9959 - val_loss: 0.1270 - val_accuracy: 0.9610\n", "Epoch 8/10\n", "64/64 - 217s - loss: 0.0095 - accuracy: 0.9973 - val_loss: 0.1474 - val_accuracy: 0.9561\n", "Epoch 9/10\n", "64/64 - 212s - loss: 0.0090 - accuracy: 0.9979 - val_loss: 0.1311 - val_accuracy: 0.9635\n", "Epoch 10/10\n", "64/64 - 211s - loss: 0.0070 - accuracy: 0.9973 - val_loss: 0.1685 - val_accuracy: 0.9566\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 26 } ] }, { "cell_type": "code", "metadata": { "id": "bRxehtUHR8w5" }, "source": [ "from sklearn.metrics import classification_report,confusion_matrix,accuracy_score\n", "pred=model_conv.predict(X_valid)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "KqGV37k0vnVX", "outputId": "93c7891a-4812-4f56-8551-5dc560af12fe" }, "source": [ "v = np.where(pred > 0.5, 1, 0)\n", "\n", "\n", "\n", "print(\"++++++++++++++++++++++=Testing Results++++++++++++++++++++\")\n", "\n", "print(\"Testing Accuracy\")\n", "print(accuracy_score(Y_valid,v))\n", "print(\"Traning Classifcation Report\")\n", "print(classification_report(Y_valid,v))\n", "\n", "print(\"Testing Confusion\")\n", "print(confusion_matrix(Y_valid.ravel(),v.ravel()))\n", "cm1 = confusion_matrix(Y_valid.ravel(),v.ravel())\n", "\n", "Accuracy = cm1[0,0]/(cm1[0,1]+cm1[0,0])\n", "print('Accuracy 0 class : ', Accuracy)\n", "\n", "Accuracy = cm1[1,1]/(cm1[1,0]+cm1[1,1])\n", "print('Accuracy 1 class : ', Accuracy)\n", "\n", "total1=sum(sum(cm1))\n", "\n", "Accuracy = cm1[0,1]/(cm1[0,0]+cm1[0,1])\n", "print('Error Rate for 0: ', Accuracy)\n", "\n", "\n", "Accuracy = cm1[1,0]/(cm1[1,1]+cm1[1,0])\n", "print('Error Rate for 1: ', Accuracy)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "++++++++++++++++++++++=Testing Results++++++++++++++++++++\n", "Testing Accuracy\n", "0.9565646594274433\n", "Traning Classifcation Report\n", " precision recall f1-score support\n", "\n", " 0 0.97 0.94 0.96 1027\n", " 1 0.94 0.97 0.96 999\n", "\n", " micro avg 0.96 0.96 0.96 2026\n", " macro avg 0.96 0.96 0.96 2026\n", "weighted avg 0.96 0.96 0.96 2026\n", " samples avg 0.96 0.96 0.96 2026\n", "\n", "Testing Confusion\n", "[[1938 88]\n", " [ 88 1938]]\n", "Accuracy 0 class : 0.9565646594274433\n", "Accuracy 1 class : 0.9565646594274433\n", "Error Rate for 0: 0.04343534057255676\n", "Error Rate for 1: 0.04343534057255676\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Pgr8AFdD18ax", "outputId": "d11057a8-4049-4bbb-b3f6-2f8aff94e2de" }, "source": [ "import nltk\n", "from textblob import TextBlob\n", "dataF['Polarity Score']=\"\"\n", "dataF['sentiments']=\"\"\n", "#df2 = pd.DataFrame(columns=['text', 'sentiment', 'score'])\n", "dataF['cleanText']=dataF['cleanText'].astype(str)\n", "for i in range(len(dataF)):\n", " sentiment = TextBlob(dataF['cleanText'][i])\n", " a=sentiment.sentiment.polarity\n", " #df2.loc[i] = [data['cleanText'][i]]+[str(0)]+ [a]\n", " dataF[\"Polarity Score\"][i]=a\n", "\n", "for i in range(len(dataF)):\n", " if(dataF['Polarity Score'][i]>0):\n", " dataF['sentiments'][i]=1\n", " else:\n", " dataF['sentiments'][i]=-1" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:11: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " # This is added back by InteractiveShellApp.init_path()\n", "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:17: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:15: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " from ipykernel import kernelapp as app\n" ], "name": "stderr" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "8iuZILUM18dp", "outputId": "d91317ff-bfd4-4f0c-f521-2e6dad59cb56" }, "source": [ "dataF['sentiments'].value_counts()" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "-1 5064\n", " 1 5064\n", "Name: sentiments, dtype: int64" ] }, "metadata": { "tags": [] }, "execution_count": 30 } ] } ] }