Skip to content

Instantly share code, notes, and snippets.

@algorithmcardboard
Last active December 7, 2017 07:08
Show Gist options
  • Save algorithmcardboard/222d72698580c2e9b2bdbf2cc887c12d to your computer and use it in GitHub Desktop.
Save algorithmcardboard/222d72698580c2e9b2bdbf2cc887c12d to your computer and use it in GitHub Desktop.
Racist AI without trying
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib\n",
"import seaborn\n",
"import re\n",
"import statsmodels.formula.api\n",
"\n",
"from sklearn.linear_model import SGDClassifier\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.metrics import accuracy_score"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"seaborn.set_context('notebook', rc={'figure.figsize': (10, 6)}, font_scale=1.5)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1917494, 300)"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def load_embeddings(filename):\n",
" \"\"\"\n",
" Load a DataFrame from the generalized text format used by word2vec, GloVe,\n",
" fastText, and ConceptNet Numberbatch. The main point where they differ is\n",
" whether there is an initial line with the dimensions of the matrix.\n",
" \"\"\"\n",
" labels = []\n",
" rows = []\n",
" with open(filename, encoding='utf-8') as infile:\n",
" for i, line in enumerate(infile):\n",
" items = line.rstrip().split(' ')\n",
" if len(items) == 2:\n",
" # This is a header row giving the shape of the matrix\n",
" continue\n",
" labels.append(items[0])\n",
" values = np.array([float(x) for x in items[1:]], 'f')\n",
" rows.append(values)\n",
" \n",
" arr = np.vstack(rows)\n",
" return pd.DataFrame(arr, index=labels, dtype='f')\n",
"\n",
"embeddings = load_embeddings('/data/glove/42B/glove.42B.300d.txt')\n",
"embeddings.shape"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"def load_lexicon(filename):\n",
" \"\"\"\n",
" Load a file from Bing Liu's sentiment lexicon\n",
" (https://www.cs.uic.edu/~liub/FBS/sentiment-analysis.html), containing\n",
" English words in Latin-1 encoding.\n",
" \n",
" One file contains a list of positive words, and the other contains\n",
" a list of negative words. The files contain comment lines starting\n",
" with ';' and blank lines, which should be skipped.\n",
" \"\"\"\n",
" lexicon = []\n",
" with open(filename, encoding='latin-1') as infile:\n",
" for line in infile:\n",
" line = line.rstrip()\n",
" if line and not line.startswith(';'):\n",
" lexicon.append(line)\n",
" return lexicon\n",
"\n",
"pos_words = load_lexicon('/data/lexicon/positive-words.txt')\n",
"neg_words = load_lexicon('/data/lexicon/negative-words.txt')"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/lib/python3.6/site-packages/ipykernel_launcher.py:1: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"http://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
" \"\"\"Entry point for launching an IPython kernel.\n",
"/usr/lib/python3.6/site-packages/ipykernel_launcher.py:2: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"http://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
" \n"
]
}
],
"source": [
"pos_vectors = embeddings.loc[pos_words].dropna()\n",
"neg_vectors = embeddings.loc[neg_words].dropna()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"vectors = pd.concat([pos_vectors, neg_vectors])\n",
"targets = np.array([1 for entry in pos_vectors.index] + [-1 for entry in neg_vectors.index])\n",
"labels = list(pos_vectors.index) + list(neg_vectors.index)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"train_vectors, test_vectors, train_targets, test_targets, train_labels, test_labels = \\\n",
" train_test_split(vectors, targets, labels, test_size=0.1, random_state=0)\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"SGDClassifier(alpha=0.0001, average=False, class_weight=None, epsilon=0.1,\n",
" eta0=0.0, fit_intercept=True, l1_ratio=0.15,\n",
" learning_rate='optimal', loss='log', max_iter=100, n_iter=None,\n",
" n_jobs=1, penalty='l2', power_t=0.5, random_state=0, shuffle=True,\n",
" tol=None, verbose=0, warm_start=False)"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model = SGDClassifier(loss='log', random_state=0, max_iter=100)\n",
"model.fit(train_vectors, train_targets)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.96380090497737558"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"accuracy_score(model.predict(test_vectors), test_targets)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sentiment</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>fidgety</th>\n",
" <td>-2.890733</td>\n",
" </tr>\n",
" <tr>\n",
" <th>interrupt</th>\n",
" <td>-9.441338</td>\n",
" </tr>\n",
" <tr>\n",
" <th>staunch</th>\n",
" <td>0.339096</td>\n",
" </tr>\n",
" <tr>\n",
" <th>improperly</th>\n",
" <td>-10.434624</td>\n",
" </tr>\n",
" <tr>\n",
" <th>taxing</th>\n",
" <td>0.585931</td>\n",
" </tr>\n",
" <tr>\n",
" <th>works</th>\n",
" <td>7.502363</td>\n",
" </tr>\n",
" <tr>\n",
" <th>low-cost</th>\n",
" <td>9.562874</td>\n",
" </tr>\n",
" <tr>\n",
" <th>disapointment</th>\n",
" <td>-8.425724</td>\n",
" </tr>\n",
" <tr>\n",
" <th>shortcomings</th>\n",
" <td>-3.418946</td>\n",
" </tr>\n",
" <tr>\n",
" <th>belittling</th>\n",
" <td>-7.035569</td>\n",
" </tr>\n",
" <tr>\n",
" <th>perverts</th>\n",
" <td>-5.580195</td>\n",
" </tr>\n",
" <tr>\n",
" <th>discredit</th>\n",
" <td>-4.878095</td>\n",
" </tr>\n",
" <tr>\n",
" <th>fragmented</th>\n",
" <td>-7.178801</td>\n",
" </tr>\n",
" <tr>\n",
" <th>foolhardy</th>\n",
" <td>-7.126639</td>\n",
" </tr>\n",
" <tr>\n",
" <th>undecided</th>\n",
" <td>-2.925497</td>\n",
" </tr>\n",
" <tr>\n",
" <th>handily</th>\n",
" <td>1.725825</td>\n",
" </tr>\n",
" <tr>\n",
" <th>demonized</th>\n",
" <td>-6.745839</td>\n",
" </tr>\n",
" <tr>\n",
" <th>easygoing</th>\n",
" <td>8.493983</td>\n",
" </tr>\n",
" <tr>\n",
" <th>hate</th>\n",
" <td>-9.681746</td>\n",
" </tr>\n",
" <tr>\n",
" <th>comical</th>\n",
" <td>-3.786152</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" sentiment\n",
"fidgety -2.890733\n",
"interrupt -9.441338\n",
"staunch 0.339096\n",
"improperly -10.434624\n",
"taxing 0.585931\n",
"works 7.502363\n",
"low-cost 9.562874\n",
"disapointment -8.425724\n",
"shortcomings -3.418946\n",
"belittling -7.035569\n",
"perverts -5.580195\n",
"discredit -4.878095\n",
"fragmented -7.178801\n",
"foolhardy -7.126639\n",
"undecided -2.925497\n",
"handily 1.725825\n",
"demonized -6.745839\n",
"easygoing 8.493983\n",
"hate -9.681746\n",
"comical -3.786152"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def vecs_to_sentiment(vecs):\n",
" # predict_log_proba gives the log probability for each class\n",
" predictions = model.predict_log_proba(vecs)\n",
"\n",
" # To see an overall positive vs. negative classification in one number,\n",
" # we take the log probability of positive sentiment minus the log\n",
" # probability of negative sentiment.\n",
" return predictions[:, 1] - predictions[:, 0]\n",
"\n",
"\n",
"def words_to_sentiment(words):\n",
" vecs = embeddings.loc[words].dropna()\n",
" log_odds = vecs_to_sentiment(vecs)\n",
" return pd.DataFrame({'sentiment': log_odds}, index=vecs.index)\n",
"\n",
"\n",
"# Show 20 examples from the test set\n",
"words_to_sentiment(test_labels).iloc[:20]"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"import re\n",
"TOKEN_RE = re.compile(r\"\\w.*?\\b\")\n",
"# The regex above finds tokens that start with a word-like character (\\w), and continues\n",
"# matching characters (.+?) until the next word break (\\b). It's a relatively simple\n",
"# expression that manages to extract something very much like words from text.\n",
"\n",
"\n",
"def text_to_sentiment(text):\n",
" tokens = [token.casefold() for token in TOKEN_RE.findall(text)]\n",
" sentiments = words_to_sentiment(tokens)\n",
" return sentiments['sentiment'].mean()"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"4.4212854502817631"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"text_to_sentiment(\"this example is pretty cool\")"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"3.2189631604955524"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"text_to_sentiment(\"this example is okay\")\n"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"-1.072391005633518"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"text_to_sentiment(\"meh, this example sucks\")"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"2.1735921314340145"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"text_to_sentiment(\"Let's go get Italian food\")\n"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1.5905418095383308"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"text_to_sentiment(\"Let's go get Chinese food\")"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.54126046303209374"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"text_to_sentiment(\"Let's go get Mexican food\")"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"2.3079193536702465"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"text_to_sentiment(\"My name is Emily\")\n"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1.4162316643176718"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"text_to_sentiment(\"My name is Heather\")"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.95921221381401411"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"text_to_sentiment(\"My name is Yvette\")"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"-0.40903497719475124"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"text_to_sentiment(\"My name is Shaniqua\")"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1.9102779002700905"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"text_to_sentiment(\"My name is Musk\")"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [],
"source": [
"NAMES_BY_ETHNICITY = {\n",
" # The first two lists are from the Caliskan et al. appendix describing the\n",
" # Word Embedding Association Test.\n",
" 'White': [\n",
" 'Adam', 'Chip', 'Harry', 'Josh', 'Roger', 'Alan', 'Frank', 'Ian', 'Justin',\n",
" 'Ryan', 'Andrew', 'Fred', 'Jack', 'Matthew', 'Stephen', 'Brad', 'Greg', 'Jed',\n",
" 'Paul', 'Todd', 'Brandon', 'Hank', 'Jonathan', 'Peter', 'Wilbur', 'Amanda',\n",
" 'Courtney', 'Heather', 'Melanie', 'Sara', 'Amber', 'Crystal', 'Katie',\n",
" 'Meredith', 'Shannon', 'Betsy', 'Donna', 'Kristin', 'Nancy', 'Stephanie',\n",
" 'Bobbie-Sue', 'Ellen', 'Lauren', 'Peggy', 'Sue-Ellen', 'Colleen', 'Emily',\n",
" 'Megan', 'Rachel', 'Wendy'\n",
" ],\n",
"\n",
" 'Black': [\n",
" 'Alonzo', 'Jamel', 'Lerone', 'Percell', 'Theo', 'Alphonse', 'Jerome',\n",
" 'Leroy', 'Rasaan', 'Torrance', 'Darnell', 'Lamar', 'Lionel', 'Rashaun',\n",
" 'Tyree', 'Deion', 'Lamont', 'Malik', 'Terrence', 'Tyrone', 'Everol',\n",
" 'Lavon', 'Marcellus', 'Terryl', 'Wardell', 'Aiesha', 'Lashelle', 'Nichelle',\n",
" 'Shereen', 'Temeka', 'Ebony', 'Latisha', 'Shaniqua', 'Tameisha', 'Teretha',\n",
" 'Jasmine', 'Latonya', 'Shanise', 'Tanisha', 'Tia', 'Lakisha', 'Latoya',\n",
" 'Sharise', 'Tashika', 'Yolanda', 'Lashandra', 'Malika', 'Shavonn',\n",
" 'Tawanda', 'Yvette'\n",
" ],\n",
" \n",
" # This list comes from statistics about common Hispanic-origin names in the US.\n",
" 'Hispanic': [\n",
" 'Juan', 'José', 'Miguel', 'Luís', 'Jorge', 'Santiago', 'Matías', 'Sebastián',\n",
" 'Mateo', 'Nicolás', 'Alejandro', 'Samuel', 'Diego', 'Daniel', 'Tomás',\n",
" 'Juana', 'Ana', 'Luisa', 'María', 'Elena', 'Sofía', 'Isabella', 'Valentina',\n",
" 'Camila', 'Valeria', 'Ximena', 'Luciana', 'Mariana', 'Victoria', 'Martina'\n",
" ],\n",
" \n",
" # The following list conflates religion and ethnicity, I'm aware. So do given names.\n",
" #\n",
" # This list was cobbled together from searching baby-name sites for common Muslim names,\n",
" # as spelled in English. I did not ultimately distinguish whether the origin of the name\n",
" # is Arabic or Urdu or another language.\n",
" #\n",
" # I'd be happy to replace it with something more authoritative, given a source.\n",
" 'Arab/Muslim': [\n",
" 'Mohammed', 'Omar', 'Ahmed', 'Ali', 'Youssef', 'Abdullah', 'Yasin', 'Hamza',\n",
" 'Ayaan', 'Syed', 'Rishaan', 'Samar', 'Ahmad', 'Zikri', 'Rayyan', 'Mariam',\n",
" 'Jana', 'Malak', 'Salma', 'Nour', 'Lian', 'Fatima', 'Ayesha', 'Zahra', 'Sana',\n",
" 'Zara', 'Alya', 'Shaista', 'Zoya', 'Yasmin'\n",
" ]\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/lib/python3.6/site-packages/ipykernel_launcher.py:12: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"http://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
" if sys.path[0] == '':\n"
]
}
],
"source": [
"def name_sentiment_table():\n",
" frames = []\n",
" for group, name_list in sorted(NAMES_BY_ETHNICITY.items()):\n",
" lower_names = [name.lower() for name in name_list]\n",
" sentiments = words_to_sentiment(lower_names)\n",
" sentiments['group'] = group\n",
" frames.append(sentiments)\n",
"\n",
" # Put together the data we got from each ethnic group into one big table\n",
" return pd.concat(frames)\n",
"\n",
"name_sentiments = name_sentiment_table()"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sentiment</th>\n",
" <th>group</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>mohammed</th>\n",
" <td>0.041447</td>\n",
" <td>Arab/Muslim</td>\n",
" </tr>\n",
" <tr>\n",
" <th>alya</th>\n",
" <td>3.915187</td>\n",
" <td>Arab/Muslim</td>\n",
" </tr>\n",
" <tr>\n",
" <th>terryl</th>\n",
" <td>-2.009098</td>\n",
" <td>Black</td>\n",
" </tr>\n",
" <tr>\n",
" <th>josé</th>\n",
" <td>-0.085082</td>\n",
" <td>Hispanic</td>\n",
" </tr>\n",
" <tr>\n",
" <th>luciana</th>\n",
" <td>1.465974</td>\n",
" <td>Hispanic</td>\n",
" </tr>\n",
" <tr>\n",
" <th>hank</th>\n",
" <td>-0.279101</td>\n",
" <td>White</td>\n",
" </tr>\n",
" <tr>\n",
" <th>megan</th>\n",
" <td>3.208251</td>\n",
" <td>White</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" sentiment group\n",
"mohammed 0.041447 Arab/Muslim\n",
"alya 3.915187 Arab/Muslim\n",
"terryl -2.009098 Black\n",
"josé -0.085082 Hispanic\n",
"luciana 1.465974 Hispanic\n",
"hank -0.279101 White\n",
"megan 3.208251 White"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"name_sentiments.iloc[::25]"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(-10, 10)"
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nBHXh/9N6xXqcNeYhAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f166f92e390>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot = seaborn.swarmplot(x='group', y='sentiment', data=name_sentiments)\n",
"plot.set_ylim([-10, 10])"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZcAAAEaCAYAAADdSBoLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAH7pJREFUeJzt3XmcHVWd9/HPt5NAEtI0McBjGMWo\n4CjuEheCj0QRlIAiYRWUMOIoggwo4iPKEpzRQRZFGRV8FAEfAQUbZH+GXQZQIMq4YJAtCAbZCR0S\nIEn/5o9Tt1O5fXu53ef27dv9fb9e99VdVedW/W7d5VfnnKo6igjMzMxyamt2AGZmNvY4uZiZWXZO\nLmZmlp2Ti5mZZefkYmZm2Tm5mJlZdk4uZmaWnZOLmZll5+RiZmbZTWx2AM2y8cYbx6xZs5odhplZ\nS1m0aNETEbHJQOXGbXKZNWsWd9xxR7PDMDNrKZIeHEw5N4uZmVl2LZVcJO0h6RZJT0p6XtLdko6W\ntF6zYzMzs7VarVlsBnAdcBLwDPAOYCHwUuCzzQvLzMzKWiq5RMQZVbOul7QhcIikQ8PjB5iZjQot\n1SzWhycBN4uZmY0iLVVzqZA0AVgfeBvwL8D3XWsxMxs9WjK5AM+RkgvAOcCRg3mSpIXAcQAzZ85s\nSGBmZv3p7u6mq6urZzoiWL58ec/0tGnTkNQz3d7eTltb6zUyqRUP+CW9DZhK6tA/Fjg3Ig6uZx2z\nZ88OX+diZiNt2bJlzJ8/f9DlOzs76ejoaGBE9ZG0KCJmD1SuJWsuEfHb4t//kvQEcLakUyLivmbG\nZWZmSevVtXqrJJpXNjUKMzPr0ZI1lyrbFn8faGoUZmaD0N7eTmdnZ890V1cXCxYs6Jk+++yzaW9v\nX6d8K2qp5CLpKuAa4E/AGlJiOQL4mZvEzKwVtLW19duH0t7ePqr6WIaqpZILcDtwADALWA3cDxwF\nnN68kMzMrFpLJZeIOAY4ptlxmJlZ/8ZCh76ZmY0yTi5mZpadk4uZmWXn5GJmZtk5uZiZWXZOLmZm\nlp2Ti5mZZefkYmZm2Tm5mJlZdk4uZmaWnZOLmZll5+RiZmbZObmYmVl2Ti5mZpadk4uZmWXn5GJm\nZtk5uZiZWXZOLmZmlp2Ti5mZZefkYmZm2U1sdgBmZs1043u2a+r2VwBMWvtTfMuHPszUJsWy3a9u\n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\nNhua7QhZXu4AAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f166be75780>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot = seaborn.barplot(x='group', y='sentiment', data=name_sentiments, capsize=.1)"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<table class=\"simpletable\">\n",
"<caption>OLS Regression Results</caption>\n",
"<tr>\n",
" <th>Dep. Variable:</th> <td>sentiment</td> <th> R-squared: </th> <td> 0.202</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Model:</th> <td>OLS</td> <th> Adj. R-squared: </th> <td> 0.185</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Method:</th> <td>Least Squares</td> <th> F-statistic: </th> <td> 12.53</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Date:</th> <td>Wed, 06 Dec 2017</td> <th> Prob (F-statistic):</th> <td>2.36e-07</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Time:</th> <td>14:35:17</td> <th> Log-Likelihood: </th> <td> -358.03</td>\n",
"</tr>\n",
"<tr>\n",
" <th>No. Observations:</th> <td> 153</td> <th> AIC: </th> <td> 724.1</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Df Residuals:</th> <td> 149</td> <th> BIC: </th> <td> 736.2</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Df Model:</th> <td> 3</td> <th> </th> <td> </td> \n",
"</tr>\n",
"<tr>\n",
" <th>Covariance Type:</th> <td>nonrobust</td> <th> </th> <td> </td> \n",
"</tr>\n",
"</table>"
],
"text/plain": [
"<class 'statsmodels.iolib.table.SimpleTable'>"
]
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ols_model = statsmodels.formula.api.ols('sentiment ~ group', data=name_sentiments).fit()\n",
"ols_model.summary().tables[0]"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"12.534892686341696"
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ols_model.fvalue"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [],
"source": [
"def retrain_model(new_embs):\n",
" \"\"\"\n",
" Repeat the steps above with a new set of word embeddings.\n",
" \"\"\"\n",
" global model, embeddings, name_sentiments\n",
" embeddings = new_embs\n",
" pos_vectors = embeddings.loc[pos_words].dropna()\n",
" neg_vectors = embeddings.loc[neg_words].dropna()\n",
" vectors = pd.concat([pos_vectors, neg_vectors])\n",
" targets = np.array([1 for entry in pos_vectors.index] + [-1 for entry in neg_vectors.index])\n",
" labels = list(pos_vectors.index) + list(neg_vectors.index)\n",
"\n",
" train_vectors, test_vectors, train_targets, test_targets, train_labels, test_labels = \\\n",
" train_test_split(vectors, targets, labels, test_size=0.1, random_state=0)\n",
" \n",
" model = SGDClassifier(loss='log', random_state=0, n_iter=100)\n",
" model.fit(train_vectors, train_targets)\n",
" \n",
" accuracy = accuracy_score(model.predict(test_vectors), test_targets)\n",
" print(\"Accuracy of sentiment: {:.2%}\".format(accuracy))\n",
" \n",
" name_sentiments = name_sentiment_table()\n",
" ols_model = statsmodels.formula.api.ols('sentiment ~ group', data=name_sentiments).fit()\n",
" print(\"F-value of bias: {:.3f}\".format(ols_model.fvalue))\n",
" print(\"Probability given null hypothesis: {:.3}\".format(ols_model.f_pvalue))\n",
" \n",
" # Show the results on a swarm plot, with a consistent Y-axis\n",
" plot = seaborn.swarmplot(x='group', y='sentiment', data=name_sentiments)\n",
" plot.set_ylim([-10, 10])"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"ename": "ModuleNotFoundError",
"evalue": "No module named 'conceptnet5'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-58-21e976c558c1>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mconceptnet5\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvectors\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformats\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mload_word2vec_bin\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'conceptnet5'"
]
}
],
"source": [
"from conceptnet5.vectors.formats import load_word2vec_bin"
]
},
{
"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.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment