Skip to content

Instantly share code, notes, and snippets.

@nanaBaah
Created January 27, 2019 11:50
Show Gist options
  • Save nanaBaah/06803b443a2956c84ca03d1c09a9467b to your computer and use it in GitHub Desktop.
Save nanaBaah/06803b443a2956c84ca03d1c09a9467b to your computer and use it in GitHub Desktop.
Deception Detection
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Project: Natural Language Processing and the Web\n",
"\n",
"## **Open-Domain Deception Detection**\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style>.container { width:98% !important; }</style>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import scattertext as st\n",
"import spacy\n",
"\n",
"from IPython.display import IFrame\n",
"from IPython.core.display import display, HTML\n",
"display(HTML(\"<style>.container { width:98% !important; }</style>\"))\n",
"\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"assert st.__version__ >= '0.0.2.25'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **Truth and Lies Data set**\n",
"\n",
"#### Dataset consists of labelled text of truth and lies.\n",
"\n",
"#### Dataset is from https://web.eecs.umich.edu/~mihalcea/downloads.html#OpenDeception\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Negative 1811\n",
"Positive 1773\n",
"Name: label, dtype: int64\n"
]
}
],
"source": [
"rdf = pd.read_csv('train.txt', sep='\\t')\n",
"rdf['label'] = rdf['label'].apply(lambda x : {'lie': 'Negative', 'truth': 'Positive'}[x])\n",
"print(rdf.label.value_counts())"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"corpus = (st.CorpusFromPandas(rdf, \n",
" category_col='label', \n",
" text_col='text',\n",
" nlp = st.whitespace_nlp_with_sentences)\n",
" .build())\n",
"corpus.get_term_freq_df().to_csv('term_freqs.csv')\n",
"unigram_corpus = corpus.get_unigram_corpus()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **Visualization of the corpus using Scattertext**\n",
"\n",
"#### The x-axis indicates the rank of a word or bigram in the set of positive (truth) labels, and the y-axis represents negative (lie) labels.\n",
"\n",
"#### Ranks are determined using the \"dense\" ranking, meaning the most frequent terms, regardless of ties, are given rank 1, the next most frequent terms, regardless of ties, are given rank 2, and so on.\n",
"\n",
"#### Scattertext selectively labels points in such a way as to prevent labels from overlapping other elements of the graph. \n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/nana/anaconda3/envs/nlp/lib/python3.6/site-packages/scattertext/frequencyreaders/DefaultBackgroundFrequencies.py:30: FutureWarning: read_table is deprecated, use read_csv instead, passing sep='\\t'.\n",
" names=['word', 'background'])\n"
]
},
{
"data": {
"text/html": [
"\n",
" <iframe\n",
" width=\"1300\"\n",
" height=\"700\"\n",
" src=\"lies_truth_detection.html\"\n",
" frameborder=\"0\"\n",
" allowfullscreen\n",
" ></iframe>\n",
" "
],
"text/plain": [
"<IPython.lib.display.IFrame at 0x7f06bdd29da0>"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"html = st.produce_scattertext_explorer(\n",
" corpus,\n",
" category='Positive',\n",
" not_categories=['Negative'],\n",
" sort_by_dist=False,\n",
" term_scorer=st.RankDifference(),\n",
" transform=st.Scalers.percentile_dense\n",
")\n",
"file_name = 'lies_truth_detection.html'\n",
"open(file_name, 'wb').write(html.encode('utf-8'))\n",
"IFrame(src=file_name, width = 1300, height=700)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/nana/anaconda3/envs/nlp/lib/python3.6/site-packages/scattertext/frequencyreaders/DefaultBackgroundFrequencies.py:30: FutureWarning: read_table is deprecated, use read_csv instead, passing sep='\\t'.\n",
" names=['word', 'background'])\n"
]
},
{
"data": {
"text/html": [
"\n",
" <iframe\n",
" width=\"1300\"\n",
" height=\"700\"\n",
" src=\"lies_truth_analyzing.html\"\n",
" frameborder=\"0\"\n",
" allowfullscreen\n",
" ></iframe>\n",
" "
],
"text/plain": [
"<IPython.lib.display.IFrame at 0x7f06bda68c50>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"html = st.produce_scattertext_explorer(\n",
" corpus,\n",
" category='Positive',\n",
" not_categories=['Negative'],\n",
" sort_by_dist=False,\n",
" term_scorer=st.RankDifference(),\n",
")\n",
"file_name = 'lies_truth_analyzing.html'\n",
"open(file_name, 'wb').write(html.encode('utf-8'))\n",
"IFrame(src=file_name, width = 1300, height=700)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **Scaled F-Score**"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"from scipy.stats import hmean\n",
"\n",
"term_freq_df = corpus.get_unigram_corpus().get_term_freq_df()[['Positive freq', 'Negative freq']]\n",
"term_freq_df = term_freq_df[term_freq_df.sum(axis=1) > 0]\n",
"\n",
"term_freq_df['pos_precision'] = (term_freq_df['Positive freq'] * 1./\n",
" (term_freq_df['Positive freq'] + term_freq_df['Negative freq']))\n",
"\n",
"term_freq_df['pos_freq_pct'] = (term_freq_df['Positive freq'] * 1.\n",
" /term_freq_df['Positive freq'].sum())\n",
"\n",
"term_freq_df['pos_hmean'] = (term_freq_df\n",
" .apply(lambda x: (hmean([x['pos_precision'], x['pos_freq_pct']])\n",
" if x['pos_precision'] > 0 and x['pos_freq_pct'] > 0 \n",
" else 0), axis=1))\n",
"# term_freq_df.sort_values(by='pos_hmean', ascending=False).iloc[:10]"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"count 5282.000000\n",
"mean 0.000189\n",
"std 0.001359\n",
"min 0.000000\n",
"25% 0.000000\n",
"50% 0.000069\n",
"75% 0.000138\n",
"max 0.050526\n",
"Name: pos_freq_pct, dtype: float64"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"term_freq_df.pos_freq_pct.describe()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"count 5282.000000\n",
"mean 0.489611\n",
"std 0.421531\n",
"min 0.000000\n",
"25% 0.000000\n",
"50% 0.500000\n",
"75% 1.000000\n",
"max 1.000000\n",
"Name: pos_precision, dtype: float64"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"term_freq_df.pos_precision.describe()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <iframe\n",
" width=\"1300\"\n",
" height=\"700\"\n",
" src=\"not_normed_freq_prec.html\"\n",
" frameborder=\"0\"\n",
" allowfullscreen\n",
" ></iframe>\n",
" "
],
"text/plain": [
"<IPython.lib.display.IFrame at 0x7f06b7a8d0b8>"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"freq = term_freq_df.pos_freq_pct.values\n",
"prec = term_freq_df.pos_precision.values\n",
"html = st.produce_scattertext_explorer(\n",
" corpus.remove_terms(set(corpus.get_terms()) - set(term_freq_df.index)),\n",
" category='Positive',\n",
" not_category_name='Negative',\n",
" not_categories=['Negative'],\n",
" \n",
" x_label = 'Portion of words used in positive reviews',\n",
" original_x = freq,\n",
" x_coords = (freq - freq.min())/freq.max(),\n",
" x_axis_values = [int(freq.min()*1000)/1000., \n",
" int(freq.max() * 1000)/1000.],\n",
" \n",
" y_label = 'Portion of documents containing word that are positive', \n",
" original_y = prec,\n",
" y_coords = (prec - prec.min())/prec.max(),\n",
" y_axis_values = [int(prec.min() * 1000)/1000., \n",
" int((prec.max()/2.)*1000)/1000., \n",
" int(prec.max() * 1000)/1000.],\n",
" scores = term_freq_df.pos_hmean.values,\n",
" \n",
" sort_by_dist=False,\n",
" show_characteristic=False\n",
")\n",
"file_name = 'not_normed_freq_prec.html'\n",
"open(file_name, 'wb').write(html.encode('utf-8'))\n",
"IFrame(src=file_name, width = 1300, height=700)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA5QAAAJiCAYAAAC4io34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3Xd4VFXixvH3pFADoYMQIICIQIAQCEWqdAjSVhQExIRYsWAXd5W4NnZVQCy0kIAiooJYEax0QcOCiiigNKUI0gQSJOX8/kj5UdImTLgzyffzPPNc57Z5Z1xdXs+95xprrQAAAAAAcJWP0wEAAAAAAN6JQgkAAAAAKBAKJQAAAACgQCiUAAAAAIACoVACAAAAAAqEQgkAAAAAKBAKJQAAAACgQCiUAAAAAIACoVACAAAAAArEz+kAnqhKlSo2ODjY6RiA59i6NX3ZqJGzOQAAAHBJbNiw4U9rbdW89qNQZiM4OFgJCQlOxwA8R9eu6cvly51MAQAAgEvEGLM7P/txySsAAAAAoEAolAAAAACAAqFQAgAAAAAKhHsoAQAAUCiSk5P1+++/6/Tp005HAZCDUqVKKSgoSP7+/gU6nkIJAACAQvH777+rXLlyCg4OljHG6TgAzmOt1eHDh/X777+rXr16BToHl7wCAACgUJw+fVqVK1emTAIeyhijypUrX9RVBBRKAAAAFBrKJODZLvafUQolAAAAAKBAKJQAAAAosgICAtx+zqlTp6px48YaMWKE28/taf7++2/16NFDoaGheuutt87ZdtNNN2n58uXq2rWrdu3a5Ug+T8hQ3DEpDwAAAOCCV199VZ988skFk5ikpKTIz69o/fF648aNSk5O1qZNm5yOAg/FCCUAAACKld27d6t79+5q3ry5unfvrj179kiSfv31V7Vr107h4eF6/PHHsx3dvO2227Rjxw4NGDBAkydPVkxMjG655Rb16tVLN954o1JTU/Xggw8qPDxczZs314wZMySlz6Z55513qkmTJoqIiFC/fv20cOFCSVJwcLD+/PNPSVJCQoK6du0qSTp16pSioqIUHh6uli1b6v3335ckzZkzR0OGDFGfPn3UsGFDPfTQQ1n5li5dqrCwMLVo0ULdu3dXWlqaGjZsqEOHDkmS0tLSdPnll2d9XqYjR45o0KBBat68udq1a6fvv/9eBw8e1MiRI7Vp0yaFhobq119/PeeYwMBAlShRQpUqVZKvr68kafbs2briiivUtWtX3XzzzbrzzjslSR9++KHatm2rli1bqkePHvrjjz8kSTExMRo9erR69eql4OBgvfvuu3rooYfUrFkz9enTR8nJyZKkDRs2qEuXLmrVqpV69+6t/fv355gBl5i1ltd5r1atWlkAZ+nSJf0FAIALtmzZ8v9v7rnn////xF2ve+7JM0PZsmUvWNe/f387Z84ca621s2fPtgMHDrTWWhsREWHnz59vrbV22rRp2R5rrbV169a1hw4dstZaO2HCBBsWFmYTExOttdbOmDHDPvnkk9Zaa0+fPm1btWpld+zYYRctWmR79OhhU1JS7N69e21gYKB95513Ljjft99+a7tk/H/u+PHj7euvv26ttfbo0aO2YcOG9uTJkzY+Pt7Wq1fPHjt2zCYlJdk6derYPXv22IMHD9qgoCC7Y8cOa621hw8fttZaGxMTYydPnmyttXbZsmV2yJAhF3ynO++808bExFhrrf3iiy9sixYtrLXWfvXVVzYiIiLP39laa/fu3Wvr1q1rDx8+bM+cOWM7duxox44da6219siRIzYtLc1aa+2sWbPsfffdl/X7dejQwZ45c8Zu2rTJli5d2i5ZssRaa+2gQYPs4sWL7ZkzZ2z79u3twYMHrbXWLliwwEZGRuYrE/LnnH9WM0hKsPnoTkVrTB4AAADIw9dff613331XkjRq1KisEb6vv/5a7733niTphhtu0AMPPJCv8w0YMEClS5eWJH366af6/vvvs0Yfjx8/ru3bt2vlypUaPny4fH19VbNmTXXr1i3P83766af64IMP9Pzzz0tKfwxL5mhq9+7dFRgYKElq0qSJdu/eraNHj6pz585Zl+JWqlRJkhQVFaWBAwdq3LhxiouLU2Rk5AWftXr1ai1atEiS1K1bNx0+fFjHjx/P1/fP9M0336hLly5Znzt06FBt27ZNUvozSa+//nrt379fZ86cOedy4b59+8rf31/NmjVTamqq+vTpI0lq1qyZdu3apa1bt2rz5s3q2bOnJCk1NVWXXXaZS9lQeCiUAAAAKHxTpjidIEcX+9iEsmXLZv21tVYvvfSSevfufc4+S5YsyfFz/Pz8lJaWJknnPA/QWqtFixapUaNG5+y/fv16lSxZMuu9r6+vUlJSZK3N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ffXVrCNJkqRWqLaC8gDg9ZTSpNo6SindD8wEDi5FMEnSinXq1Il7772XlVZaiR/96Ed8+OGHWUeSJEmtTG0F5XeBxwro7wlgm6LTSJIK0qNHD+655x7mzJnDwIED+eqrr7KOJEmSWpHaCsq1gPcL6O99YM3i40iSCrXjjjtyyy238NRTT3H00UeTUso6kiRJaiVqKygXAqsW0N+qgF+PS1IjO+igg7jgggu47bbbGDNmTNZxJElSK1HbfSjfBrYvoL8+wFvFx5EkFeu0005j5syZ/OpXv6Jnz54MGjQo60iSJKmFq+0I5WPAThHRp7aOImI7YGfg0RLkkiQVKCK45ppr2H333TnmmGOYMmVK1pEkSVILV1tBeRWQgDsiYvOaGkVEb+AOYBkwrnTxJEmFWGmllbjzzjvZaKONGDhwINOnT886kiRJasFWWFCmlGYAvwI2BF6MiN9HxNER0T8i9o6IwRHxe+BFoAdwTn4bSVJGunTpwt///ndWXnll9t57b2bM8NeyJElqGLUdoSSl9CvgDCCAnwLXA38H7gduyC8rA0anlM5ruKiSpLraaKONmDx5Mikl9txzT954442sI0mSpBao1oISIKV0PtALOJfcNZKvAjPyP/8K6JVSuqChQkqSCte7d28eeughFi5cyB577ME777yTdSRJktTC1DbK63IppdnA2Q2YRZJUYltvvTUPPPAAe+65J3vuuSePP/4466yzTtaxJElSC1GnI5SSpOarT58+TJo0iXfeeYe9996bjz76KOtIkiSphbCglKRWYJddduFvf/sbM2fOZJ999mHevHlZR5IkSS2ABaUktRJ77LEHf/nLX5g+fTo//OEPmT9/ftaRJElSM2dBKUmtyA9/+ENuu+02nnnmGQYMGOCRSkmSVC8WlJLUyhx44IHLi8rddtuNuXPnZh1JkiQ1UxaUktQKHXzwwdx7773MmjWLXXfdlVmzZmUdSZIkNUMWlJLUSvXv35+HH36YefPmscsuuzBt2rSsI0mSpGbGglKSWrEdd9yRf/zjH7Rr147ddtuNKVOmZB1JkiQ1IxaUktTKbb755jz55JOss8469O/fn3vvvTfrSJIkqZmwoJQkscEGGzBlyhS23HJLBg4cyM0335x1JEmS1AxYUEqSAOjatSuPPPII/fr148gjj+Tcc8+lvLw861iSJKkJs6CUJC232mqrcd999zFo0CDOOussDj74YObPn591LEmS1ERZUEqSvqZ9+/bcfPPNXHrppdx111307dvX24pIkqRqWVBKkr4hIjj11FN54IEHePfdd9l+++156KGHso4lSZKaGAtKSVKN9tprL5577jm6d+/OgAEDuOSSS0gpZR1LkiQ1ERaUkqQV2njjjXnqqac44IAD+L//+z8GDRrEggULso4lSZKaAAtKSVKtVl11VW6//XbOO+88brvtNnbddVdmzJiRdSxJkpQxC0pJUp1EBKNHj+Zvf/sbs2fPZtttt+Xaa6/1FFhJkloxC0pJUkF+9KMfMX36dHbZZReOP/549ttvP95///2sY0mSpAxYUEqSCrbuuuty//33c/nllzN58mS22mor/va3v2UdS5IkNTILSklSUcrKyjjppJN4/vnnWXfdddl///0ZOnQoX375ZdbRJElSI7GglCTVyxZbbME///lPRo4cyfjx4/nud7/L1KlTs44lSZIagQWlJKne2rdvz0UXXcSjjz7KokWL2HnnnTn++OP55JNPso4mSZIakAWlJKlkdtttN6ZPn86IESO4/vrr2WyzzZgwYQLl5eVZR5MkSQ3AglKSVFKrr746l112GS+88AK9evXi6KOP5vvf/z4vv/xy1tEkSVKJWVBKkhrE1ltvzZQpU7jxxhuZMWMG2267Laeeeiqff/551tEkSVKJWFBKkhpMWVkZgwcPZsaMGRx77LGMHTuW3r17M2HCBJYuXZp1PEmSVE8WlJKkBrfGGmtw7bXXMnXqVNZff32OPvpottxyS26//Xavr5QkqRmzoJQkNZoddtiBqVOn8te//pW2bdtyyCGHsN1223HfffeRUso6niRJKpAFpSSpUUUEAwcOZNq0afz+97/n888/Z99992XXXXfl8ccfzzqeJEkqgAWlJCkTbdq04Wc/+xmvvvoq1113HbNnz6Zfv37svffeTJ482SOWkiQ1AxaUkqRMtWvXjiFDhjBz5kwuu+wypk+fzt577813vvMdJk6cyKJFi7KOKEmSamBBKUlqElZeeWVOOeUUZs+ezYQJEwAYPHgwG264Ieeddx4fffRRxgklSVJVFpSSpCalffv2HHXUUUybNo2HHnqIbbfdljPPPJP111+foUOH8v/+3//LOqIkScqzoJQkNUkRwV577cWkSZP497//zeGHH87EiRPZYost2HHHHbn22muZN29e1jElSWrVLCglSU3et7/9bcaPH8/bb7/NZZddxsKFCzn++ONZZ511OOyww3jwwQdZtmxZ1jElSWp1LCglSc1G165dOeWUU5g2bRrPPfccxx57LA888AD77LMPPXr0YPTo0fzrX/9yhFhJkhqJBaUkqdmJCLbbbjuuuuoq5syZw+23385WW23FhRdeyFZbbUWvXr047bTTmDp1KuXl5VnHlSSpxbKglCQ1ax06dODggw9m0qRJvPvuu1xzzTVsvPHGXHbZZfTt25f111+f4cOH8/DDD7NkyZKs40qS1KJYUEqSWox11lmHoUOH8sADD/DBBx9wyy23sNNOOzFhwgT22msv1l57bQ466CCuvfZaZs2a5amxkiTVU9usA0iS1BC6dOnCoEGDGDRoEAsWLODBBx/knnvuYfLkydx5550A9OjRg7322ou99tqLPfbYg65du2acWpKk5sWCUpLU4q2yyioMHDiQgQMHklJi5syZTJ48mcmTJ3PHHXdwww03ALDVVlvRt29fdtppJ/r27UuvXr0oK/NkHkmSamJBKUlqVSKCXr160atXL4YNG8bSpUt5fGRSrAAAHGVJREFU4YUXeOihh5gyZQq3334748ePB3JHOXfaaaflBeZ2223HGmuskfErkCSp6bCglCS1am3btmWHHXZghx12AKC8vJwZM2bw9NNPM3XqVJ5++mnuv//+5ddbdu/ena233prvfOc7y6eePXvSpk2bLF+GJEmZsKCUJKmSsrIyNt98czbffHOOPvpoAD777DOeffZZXnzxRV5++WWmTZvGgw8+yNKlS4HcSLNbbLEFvXv3ZrPNNqNXr15sttlm9OzZk44dO2b5ciRJalBNpqCMiO7Ar4ABwJrAXOAu4JyU0qcF9LMGcBYwEOgGfAzcD5yVUnqn1LklSS1fp06dlg/eU2HRokW88sorTJs2jWnTpjF9+nSmTJnCrbfe+rVt11tvPTbbbDM23XRTevTowYYbbrh86tatm0c2JUnNWpMoKCNiE+ApYG3gbuBVYAfgZGBAROySUvq4Dv2sme+nF/AI8EegNzAY+FFE9E0pvd4wr0KS1Jq0b9+ebbbZhm222eZryxcsWMB//vMfZsyYwWuvvcZrr73GjBkzuPPOO/n446//V9auXTvWX399NtxwQ7p37866665Lt27dvjFf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\n",
"text/plain": [
"<Figure size 1080x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib\n",
"import seaborn as sns\n",
"from scipy.stats import norm\n",
"\n",
"fig, ax = plt.subplots(figsize=(15,10))\n",
"freqs = term_freq_df.pos_freq_pct[term_freq_df.pos_freq_pct > 0]\n",
"log_freqs = np.log(freqs)\n",
"\n",
"sns.distplot(log_freqs[:1000], kde=False, rug=True, hist=False, rug_kws={\"color\": \"k\"})\n",
"\n",
"x = np.linspace(log_freqs.min(), \n",
" log_freqs.max(), \n",
" 100)\n",
"frozen_norm = norm(log_freqs.mean(), log_freqs.std())\n",
"y = frozen_norm.pdf(x)\n",
"plt.plot(x, y ,color='k')\n",
"term = 'game'\n",
"word_freq = log_freqs.loc[term]\n",
"term_cdf = frozen_norm.cdf(word_freq)\n",
"plt.axvline(x=word_freq, color='red', label='Log frequency of \"'+term+'\"')\n",
"plt.fill_between(x[x < word_freq], \n",
" y[x < word_freq], y[x < word_freq] * 0, \n",
" facecolor='blue', \n",
" alpha=0.5,\n",
" label=\"Log-normal CDF of %s: $%0.3f \\in [0,1]$\" % (term, term_cdf) )\n",
"ax.set_xlabel('Log term frequency')\n",
"ax.set_ylabel('Cumulative term probability')\n",
"plt.legend()\n",
"for item in ([ax.title, ax.xaxis.label, ax.yaxis.label] +\n",
" ax.get_xticklabels() + ax.get_yticklabels() ):\n",
" item.set_fontsize(20)\n",
"plt.rc('legend', fontsize=20) \n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"from scipy.stats import norm\n",
"\n",
"def normcdf(x):\n",
" return norm.cdf(x, x.mean(), x.std ())\n",
"\n",
"term_freq_df['pos_precision_normcdf'] = normcdf(term_freq_df.pos_precision)\n",
"\n",
"term_freq_df['pos_freq_pct_normcdf'] = normcdf(term_freq_df.pos_freq_pct.values)\n",
"\n",
"term_freq_df['pos_scaled_f_score'] = hmean([term_freq_df['pos_precision_normcdf'], term_freq_df['pos_freq_pct_normcdf']])\n",
"\n",
"#term_freq_df.sort_values(by='pos_scaled_f_score', ascending=False).iloc[:10]"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/nana/anaconda3/envs/nlp/lib/python3.6/site-packages/scattertext/frequencyreaders/DefaultBackgroundFrequencies.py:30: FutureWarning: read_table is deprecated, use read_csv instead, passing sep='\\t'.\n",
" names=['word', 'background'])\n"
]
},
{
"data": {
"text/html": [
"\n",
" <iframe\n",
" width=\"1300\"\n",
" height=\"700\"\n",
" src=\"normed_freq_prec.html\"\n",
" frameborder=\"0\"\n",
" allowfullscreen\n",
" ></iframe>\n",
" "
],
"text/plain": [
"<IPython.lib.display.IFrame at 0x7f06b87e95f8>"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"freq = term_freq_df.pos_freq_pct_normcdf.values\n",
"prec = term_freq_df.pos_precision_normcdf.values\n",
"html = st.produce_scattertext_explorer(\n",
" corpus.remove_terms(set(corpus.get_terms()) - set(term_freq_df.index)),\n",
" category='Positive',\n",
" not_category_name='Negative',\n",
" not_categories=['Negative'],\n",
" \n",
" x_label = 'Portion of words used in positive reviews (norm-cdf)',\n",
" original_x = freq,\n",
" x_coords = (freq - freq.min())/freq.max(),\n",
" x_axis_values = [int(freq.min()*1000)/1000., \n",
" int(freq.max() * 1000)/1000.],\n",
" \n",
" y_label = 'documents containing word that are positive (norm-cdf)', \n",
" original_y = prec,\n",
" y_coords = (prec - prec.min())/prec.max(),\n",
" y_axis_values = [int(prec.min() * 1000)/1000., \n",
" int((prec.max()/2.)*1000)/1000., \n",
" int(prec.max() * 1000)/1000.],\n",
" scores = term_freq_df.pos_scaled_f_score.values,\n",
" \n",
" sort_by_dist=False,\n",
" show_characteristic=False\n",
")\n",
"file_name = 'normed_freq_prec.html'\n",
"open(file_name, 'wb').write(html.encode('utf-8'))\n",
"IFrame(src=file_name, width = 1300, height=700)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"term_freq_df['neg_precision_normcdf'] = normcdf((term_freq_df['Negative freq'] * 1./\n",
" (term_freq_df['Negative freq'] + term_freq_df['Positive freq'])))\n",
"\n",
"term_freq_df['neg_freq_pct_normcdf'] = normcdf((term_freq_df['Negative freq'] * 1.\n",
" /term_freq_df['Negative freq'].sum()))\n",
"\n",
"term_freq_df['neg_scaled_f_score'] = hmean([term_freq_df['neg_precision_normcdf'], term_freq_df['neg_freq_pct_normcdf']])\n",
"\n",
"term_freq_df['scaled_f_score'] = 0\n",
"term_freq_df.loc[term_freq_df['pos_scaled_f_score'] > term_freq_df['neg_scaled_f_score'], \n",
" 'scaled_f_score'] = term_freq_df['pos_scaled_f_score']\n",
"term_freq_df.loc[term_freq_df['pos_scaled_f_score'] < term_freq_df['neg_scaled_f_score'], \n",
" 'scaled_f_score'] = 1-term_freq_df['neg_scaled_f_score']\n",
"term_freq_df['scaled_f_score'] = 2 * (term_freq_df['scaled_f_score'] - 0.5)\n",
"#term_freq_df.sort_values(by='scaled_f_score', ascending=False).iloc[:10]"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <iframe\n",
" width=\"1300\"\n",
" height=\"700\"\n",
" src=\"sfs_explain.html\"\n",
" frameborder=\"0\"\n",
" allowfullscreen\n",
" ></iframe>\n",
" "
],
"text/plain": [
"<IPython.lib.display.IFrame at 0x7f06b69df7f0>"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"is_pos = term_freq_df.pos_scaled_f_score > term_freq_df.neg_scaled_f_score\n",
"freq = term_freq_df.pos_freq_pct_normcdf*is_pos - term_freq_df.neg_freq_pct_normcdf*~is_pos\n",
"prec = term_freq_df.pos_precision_normcdf*is_pos - term_freq_df.neg_precision_normcdf*~is_pos\n",
"def scale(ar): \n",
" return (ar - ar.min())/(ar.max() - ar.min())\n",
"def close_gap(ar): \n",
" ar[ar > 0] -= ar[ar > 0].min()\n",
" ar[ar < 0] -= ar[ar < 0].max()\n",
" return ar\n",
"\n",
"html = st.produce_scattertext_explorer(\n",
" corpus.remove_terms(set(corpus.get_terms()) - set(term_freq_df.index)),\n",
" category='Positive',\n",
" not_category_name='Negative',\n",
" not_categories=['Negative'],\n",
" \n",
" x_label = 'Frequency',\n",
" original_x = freq,\n",
" x_coords = scale(close_gap(freq)),\n",
" x_axis_labels = ['Frequent in Neg', \n",
" 'Not Frequent', \n",
" 'Frequent in Pos'],\n",
" \n",
" y_label = 'Precision', \n",
" original_y = prec,\n",
" y_coords = scale(close_gap(prec)),\n",
" y_axis_labels = ['Neg Precise', \n",
" 'Imprecise', \n",
" 'Pos Precise'],\n",
" \n",
" \n",
" scores = (term_freq_df.scaled_f_score.values + 1)/2,\n",
" sort_by_dist=False,\n",
" show_characteristic=False\n",
")\n",
"file_name = 'sfs_explain.html'\n",
"open(file_name, 'wb').write(html.encode('utf-8'))\n",
"IFrame(src=file_name, width = 1300, height=700)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <iframe\n",
" width=\"1300\"\n",
" height=\"700\"\n",
" src=\"freq_sfs.html\"\n",
" frameborder=\"0\"\n",
" allowfullscreen\n",
" ></iframe>\n",
" "
],
"text/plain": [
"<IPython.lib.display.IFrame at 0x7f06b69d3978>"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"html = st.produce_frequency_explorer(\n",
" corpus.remove_terms(set(corpus.get_terms()) - set(term_freq_df.index)),\n",
" category='Positive',\n",
" not_category_name='Negative',\n",
" not_categories=['Negative'],\n",
" term_scorer=st.ScaledFScorePresets(beta=1, one_to_neg_one=True),\n",
" grey_threshold=0\n",
")\n",
"file_name = 'freq_sfs.html'\n",
"open(file_name, 'wb').write(html.encode('utf-8'))\n",
"IFrame(src=file_name, width = 1300, height=700)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment