diff --git a/README.md b/README.md index 0ac071a..35ca5ac 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Then install required python packages ## Applications -okCupid provides self descriptions, selfies and big questionnaires that are really interesting for anyone interested in psychometrics. +okCupid provides self descriptions, selfies and big questionnaires that are really useful for anyone interested in psychometrics. For now I just used it to scrape self descriptions and train an AI to generate new ones. You can check more about it [here](https://mathigatti.com/2021/02/15/okcupid-synthetic-profiles/). @@ -28,7 +28,7 @@ This scraper has two script, the first one downloads the profile data (except th Using this script and changing your profile details, like gender, sexual orientation and location you can scrape pretty much all users in a given location in okCupid. -You can run it like this +You can run it like this, users data will be downloaded into _users_ folder - python users_by_discover.py @@ -36,8 +36,14 @@ You can also try the _users_by_question.py_ script, it search for users that ans ### Download questions +You can run it like this, users answers will be downloaded into _answers_ folder + - python users_by_question.py +### Parsing data + +In the testing.ipynb notebook you can check some examples of how to process the data. Users data is downloaded as HTML so I use beautifulSoup to parse it and extract the relevant information. Users questions are in JSON format so it's easier to process. + ## Extra ### Related datasets diff --git a/testing.ipynb b/testing.ipynb new file mode 100644 index 0000000..5a3d5fc --- /dev/null +++ b/testing.ipynb @@ -0,0 +1,347 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Parsing HTML files containing users data" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 21628/21628 [02:31<00:00, 142.31it/s]\n" + ] + } + ], + "source": [ + "from bs4 import BeautifulSoup\n", + "from glob import glob\n", + "import json\n", + "from collections import defaultdict\n", + "import random\n", + "import json\n", + "from tqdm import tqdm\n", + "\n", + "def looking_for(text):\n", + " text = text.replace(\"& \", \"\")\n", + " text = text.split(\"Looking for \")[-1]\n", + " if \" | \" in text: \n", + " gender = text.split(\" | \")[0].split(\", \")\n", + " relationship_type = text.split(\" | \")[1].split(\", \")\n", + " return gender, relationship_type\n", + " else:\n", + " if \"man\" in text.lower():\n", + " return text.split(\", \"), \"\"\n", + " else:\n", + " return \"\", text.split(\", \")\n", + " \n", + "with open(\"title2topic.json\",'r') as f:\n", + " title2topic = json.load(f)\n", + "\n", + "basic_values = {\n", + " \"name\": (\"profile-basics-username-text\", \"cardsummary-item cardsummary-realname\"),\n", + " \"age\": (\"profile-basics-asl-age\", \"cardsummary-item cardsummary-age\"),\n", + " \"location\": (\"profile-basics-asl-location\", \"cardsummary-item cardsummary-location\")\n", + "}\n", + "\n", + "essays_class = (\"profile-essay\", \"qmessays-essay\")\n", + "image_class = (\"profile-thumb\", \"qmcard-carousel-viewport-inner\")\n", + "\n", + "users = glob(\"users/*.html\")\n", + "random.shuffle(users)\n", + "\n", + "users_basics = []\n", + "\n", + "for user in tqdm(users):\n", + " with open(user,'r') as f:\n", + " data = f.read()\n", + " basics = {}\n", + "\n", + " user_id = user[6:-5]\n", + " soup = BeautifulSoup(data)\n", + "\n", + " r = soup.find(\"span\",{\"class\":\"profile-basics-username-text\"})\n", + "\n", + " if r:\n", + " index = 0\n", + " else:\n", + " index = 1\n", + "\n", + " for name, value in basic_values.items():\n", + " basics[name] = soup.find(\"span\",{\"class\": value[index]}).text\n", + " basics[\"age\"] = int(basics[\"age\"])\n", + "\n", + " basics = {}\n", + " values = [v.text for v in soup.find_all(\"div\", {\"class\": \"matchprofile-details-text\"})]\n", + " \n", + " first = 0\n", + " for term in [\"VACCINATED\"]:\n", + " if term in values[first]:\n", + " first += 1\n", + "\n", + " sexual_basics = values[first].split(\" | \")\n", + " \n", + " if len(sexual_basics) == 3:\n", + " gender, sexual_orientation, relationship_type = sexual_basics\n", + " elif len(sexual_basics) == 4:\n", + " gender, sexual_orientation, bdsm, relationship_type = sexual_basics\n", + " elif len(sexual_basics) == 2:\n", + " gender, relationship_type = sexual_basics\n", + " relationship_type = \"\"\n", + " else:\n", + " print(values[0])\n", + " continue\n", + "\n", + " lf_gender, lf_relationship_type = looking_for(values[-1])\n", + " basics[\"user_id\"] = user_id\n", + " basics[\"gender\"] = gender\n", + " basics[\"sexual_orientation\"] = sexual_orientation\n", + " basics[\"relationship_type\"] = relationship_type\n", + " basics[\"looking_for_gender\"] = lf_gender\n", + " basics[\"looking_for_relationship_type\"] = lf_relationship_type\n", + " basics[\"extra\"] = \" | \".join(values[first:-1])\n", + " users_basics.append(basics)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "df = pd.DataFrame(users_basics)\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "essays = []\n", + "for answer in soup.find_all(\"div\", {\"class\": essays_class[index]}):\n", + " if index == 1:\n", + " try:\n", + " title = answer.find(\"h2\").text\n", + " except:\n", + " continue\n", + " topic = title2topic[title]\n", + " else:\n", + " try:\n", + " topic, title = [t.text for t in answer.find_all(\"h2\")]\n", + " except:\n", + " continue\n", + "\n", + " essays.append( {\"user_id\": user_id, \"topic\": topic, \"title\": title, \"answer\": answer.find(\"p\").text.strip()} )\n", + "\n", + "essays = pd.DataFrame(essays)\n", + "essays.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 461, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 461, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAEICAYAAACzliQjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAAryElEQVR4nO3deXyc1X3v8c9Pu7VbtizLkrwAxpZxWIwgbKEEMEtKA21DC9kopde3KYTkJm0uubkkaXtzS265TUPbS0qCE9KyJAESXEoCBAg0NBiEMd5kg8FYkhdJtmRJthZr+d0/5hl7kCVrGXmekeb7fr3mpZnznJnnN4t+c+Y85znH3B0REUkNaWEHICIiiaOkLyKSQpT0RURSiJK+iEgKUdIXEUkhSvoiIilk1KRvZqvNrNnMNg0p/6yZbTWzzWb2f2LKv2xm281sm5ldGVN+VVC23czumNynISIiY2GjjdM3s4uBg8AP3X15UPZh4CvAb7t7r5nNcfdmM1sGPAycC8wDfgmcGjzUW8BKoBF4DbjR3bccb9+zZ8/2hQsXTvS5iYikpNdff32fu5cOty1jtDu7+0tmtnBI8WeAu9y9N6jTHJRfCzwSlO8ws+1EvgAAtrv7uwBm9khQ97hJf+HChdTW1o4WooiIxDCznSNtm2if/qnAh8xsrZm9aGbnBOUVQENMvcagbKTy4YJdZWa1Zlbb0tIywfBERGQ4E036GUAJcB7wF8CPzcwmIyB3v8/da9y9prR02F8nIiIyQaN274ygEXjcIwcEXjWzQWA2sAuoiqlXGZRxnHIREUmQiSb9nwEfBl4ws1OBLGAfsAZ4yMz+jsiB3MXAq4ABi81sEZFkfwPw8fhCF5FU0NfXR2NjIz09PWGHknRycnKorKwkMzNzzPcZNemb2cPAJcBsM2sEvgasBlYHwzgPAzcFrf7NZvZjIgdo+4Fb3X0geJzbgKeBdGC1u28ez5MTkdTU2NhIQUEBCxcuZJJ6kacFd2f//v00NjayaNGiMd9vLKN3bhxh0ydHqP8N4BvDlD8FPDXmyEREgJ6eHiX8YZgZs2bNYrwDXnRGrogkPSX84U3kdVHSnySDg87GxnZ+8PIO9rar71FEktNED+RK4Dfv7OehV+v59dsttHX1AbCno4cvX10dcmQiIsdSSz9OX/nZRl56q4UPL53D3//hmZxals+W3R1hhyUiU9Du3bv52Mc+Nuy2Sy65ZFJmKFBLPw6dPX2823KIL648lc9ethiAl7fv44VtOpNYREbW399PRsax6XfevHk8+uijJ3TfSvpx2By06JdXFh0pqy4v5CevN9Lc2cOcgpywQhOZlv7y3zZP+i/pZfMK+drvnHbcOu+99x7XXHMNmzZFJhu+++67OXjwICUlJXznO98hIyODZcuW8cgjj3Do0CE++9nPsmnTJvr6+vj617/Otddeyw9+8AMef/xxDh48yMDAAC+++OJx99Pd3c3NN9/Mm2++ydKlS+nu7p6U56ukH4eNje0AfKDi/UkfoG5Pp5K+yDR31113sWPHDrKzszlw4AAA3/jGN7j00ktZvXo1Bw4c4Nxzz+Xyyy8HYN26dWzYsIGSkpJRH/vee+8lNzeXuro6NmzYwIoVKyYlZiX9OGzc1c68ohxm52cfKVt2JOl38Funau4gkck0Wos80U4//XQ+8YlPcN1113HdddcB8Mwzz7BmzRruvvtuIHKeQX19PQArV64cU8IHeOmll7j99tuP7Of000+flJh1IDcOG3e184GYrh2AotxMKopn6GCuyDSSkZHB4ODgkdvRKSH+/d//nVtvvZV169Zxzjnn0N/fj7vz2GOPsX79etavX099fT3V1ZHRfHl5eaHEH0tJf4I6evrYse8Qp1cWH7OturyAuj1K+iLTRVlZGc3Nzezfv5/e3l6efPJJBgcHaWho4MMf/jDf/OY3aW9v5+DBg1x55ZX8wz/8A9EFqt54440J7fPiiy/moYceAmDTpk1s2LBhUp6LuncmaNOuSH/+8oqiY7YtKy/khW0t9PQNkJOZnujQRGSSZWZm8tWvfpVzzz2XiooKli5dysDAAJ/85Cdpb2/H3bn99tspLi7mzjvv5POf/zynn346g4ODLFq0iCeffHLc+/zMZz7DzTffTHV1NdXV1Zx99tmT8lxGXS4xTDU1NZ6sK2f984vv8Dc/38q6O1dSkpf1vm0/37iHzzy4jjW3XTjsLwERGbu6uroj3SNyrOFeHzN73d1rhquv7p0J2rCrnYriGcckfIgMAQPUxSMiSUfdOxO0aVc7p1ce27UDUDUzl7ysdOr2dCY4KhGZCjZu3MinPvWp95VlZ2ezdu3aE75vJf0JaO/qY+f+Lv7wnKpht6elGUvLCzWCR2SSuPu0mmnzAx/4AOvXr4/7cSbSPa/unQnYtPvYk7KGWlZeSN2ejgm9KSJyVE5ODvv379f/0hDRRVRycsZ3Eqha+hOwYZgzcYeqLi/kX17ZSWNbN1UluYkKTWTaqayspLGxcdyLhaSC6HKJ4zGW5RJXA9cAze6+fMi2LwJ3A6Xuvs8iv7++DXwE6AL+yN3XBXVvAv5ncNf/5e4PjCvSJLJx1wGqSmZQnHvsQdyo6vICALbs6VDSF4lDZmbmuJYDlOMbS/fOD4CrhhaaWRVwBVAfU3w1kcXQFwOrgHuDuiVE1tb9IHAu8DUzmxlP4GHauKud0yuKj1tn6dxC0kwjeEQkuYya9N39JaB1mE3fAr4ExHa0XQv80CNeAYrNrBy4EnjW3VvdvQ14lmG+SKaCtkOHaWjtPmb6haFmZKWzcHaeDuaKSFKZ0IFcM7sW2OXubw7ZVAE0xNxuDMpGKh/usVeZWa2Z1SZjH95YDuJGLSsvpG6vkr6IJI9xJ30zywX+B/DVyQ8H3P0+d69x95rS0uSbpTJ6EHf5vNGTfnV5IQ2t3XT09J3osERExmQiLf2TgUXAm2b2HlAJrDOzucAuIHbwemVQNlL5lLNldwdVJTMoys0cte5pwZm50Xn3RUTCNu6k7+4b3X2Ouy9094VEumpWuPteYA3waYs4D2h39z3A08AVZjYzOIB7RVA25dTt6aB6buGY6p67qISsjDSe39p8gqMSERmbUZO+mT0M/AZYYmaNZnbLcao/BbwLbAe+C/wZgLu3An8NvBZc/ioom1K6DvezY/+hI6tjjSY3K4MLTp7Fc3VNOrFERJLCqOP03f3GUbYvjLnuwK0j1FsNrB5nfEll295O3Blz0ge4rLqMO3+2iXdaDnHKnPwTGJ2IyOg0DcM4RCdQWzaepL90DgDP1TWdkJhERMZDSX8c6vZ0kJ+dQeXMGWO+z7ziGSwrL+S5OvXri0j4lPTHoW5PB0vnFpCWNr7Z/i5fVkbtzlbaDh0+QZGJiIyNkv4YDQ46W/d2jqs/P+ry6jkMOrywTa19EQmXkv4YNbZ1c7C3f0JJf/m8IuYUZKuLR0RCp6Q/RluCidOiSyGOR1qacVn1HF58q4XD/YOTHZqIyJgp6Y9R3Z4O0gyWlBVM6P6XLS3jYG8/r+6YcqcniMg0oqQ/RnV7Olg4O48ZWekTuv+Fp8wmOyONX2ropoiESEl/jOr2dkyoPz9qRlY6F50ym2e3NDE4qLNzRSQcSvpj0NnTR0Nr97hOyhrOtWdVsOtAN/++cc8kRSYiMj5K+mOwdW/kTNzoEogTdc0HyllSVsC3nn2L/gEd0BWRxFPSH4PokofxdO9AZBTPF684lXf3HeLxdVNyZmkRmeKU9Mdgy+4OinMzmVuYE/djrVxWxhlVxfz9L9+it3/gfdv2tvfQp18AInICKemPQXQOfbPxTb8wHDPjL65Ywu72Hh5aG1lTvn9gkL97ZhsX3PUc9zz3dtz7EBEZiZL+KAYGnW1NE5t+YSQXnjKL80+axT+9sJ1tezv5g3/+Dfc8v528rAye3LBHc++LyAmjpD+KHfsO0dM3GPdB3Fhmxp9fuYR9Bw9z1bdf4u3mg9xz41l86eql7Nh3iHdaDk7avkREYinpj+LFt1oAOKOqeFIf9+wFM7n+7EouPHk2T93+IT56xjxWVpcB8PRmncAlIifGWJZLXG1mzWa2Kabsb81sq5ltMLOfmllxzLYvm9l2M9tmZlfGlF8VlG03szsm/ZmcAAODzgP/+R5nL5jJqROcfuF4/vb6M/jXP/kgVSW5AMwtyuGMyiKe2aKkLyInxlha+j8ArhpS9iyw3N1PB94CvgxgZsuAG4DTgvv8PzNLN7N04J+Aq4FlwI1B3aT2/NZm6lu7+OMLFyVsnyuXlfFmwwGaOnoStk8RSR2jJn13fwloHVL2jLv3BzdfASqD69cCj7h7r7vvILJA+rnBZbu7v+vuh4FHgrpJbfWvdzCvKIcrTytL2D6vOG0uAM+qtS8iJ8Bk9On/MfDz4HoF0BCzrTEoG6n8GGa2ysxqzay2paVlEsKbmLo9Hfzm3f18+oKFZKQn7tDH4jn5LJyVqy4eETkh4spmZvYVoB94cHLCAXe/z91r3L2mtLR0sh523L7/8g5mZKZzwzlVCd2vmbFyWRm/eWcfnT19Cd23iEx/E076ZvZHwDXAJ/zowPJdQGyWrAzKRipPSvsO9vKz9bv5/bMrKM7NSvj+rzhtLn0Dzq+2hfdLR0SmpwklfTO7CvgS8FF374rZtAa4wcyyzWwRsBh4FXgNWGxmi8wsi8jB3jXxhX7iPLS2nsP9g/zRBYk7gBtrxfyZzMrLUr++iEy6jNEqmNnDwCXAbDNrBL5GZLRONvBsMDXBK+7+p+6+2cx+DGwh0u1zq7sPBI9zG/A0kA6sdvfNJ+D5xG1g0PmXV3ZyyZJSTpmTH0oM6cHyij/fuJfD/YNkZeh0ChGZHKMmfXe/cZji+49T/xvAN4Ypfwp4alzRhaCxrYuWzl4+srw81DhWLpvLj2sbeX1nG+efPCvUWERk+lATcoid+yO9VQtm5YYax5nBGcDRaZ1FRCaDkv4QO1ujST8v1DhKC7KZlZfF1r1K+iIyeZT0h6jff4jsjDTmFGSHHQpL5hawLVi1S0RkMijpD7FzfxcLZuWSlhb/3PnxWjK3gLeaDmohdRGZNEr6Q9S3djG/JNyunailcwvo7hugvrVr9MoiImOgpB/D3Y+09JPBkrmRhVu2qotHRCaJkn6Mls5euvsGkibpn1qWjxnq1xeRSaOkHyM6cmd+SXIk/dysDOaX5LKtSSN4RGRyKOnHODpGPzn69AGWlBWoe0dEJo2Sfoz6/YdIM6gonhF2KEcsLS/kvX2H6OkbCDsUEZkGlPRj7GztYl7xjKSa62bp3AIGHbY3a7F0EYlf8mS3JLBzfxcLk6hrByJj9UHTMYjI5FDSj1Hf2sX8JBm5E7VwVh7ZGWkawSMik0JJP9DR00frocMsSJKRO1Hpacbisny2NSnpi0j8lPQD9Ukyu+ZwlpQVagSPiEwKJf1AdLhmskzBEGvp3AJaOntpPXQ47FBEZIobNemb2WozazazTTFlJWb2rJm9HfydGZSbmd1jZtvNbIOZrYi5z01B/bfN7KYT83QmbmfrIYCk69OHowdzNc2yiMRrLC39HwBXDSm7A3jO3RcDzwW3Aa4msi7uYmAVcC9EviSILLP4QeBc4GvRL4pkUb+/i9n5WeRnj7qYWMItDZK+DuaKSLxGTfru/hLQOqT4WuCB4PoDwHUx5T/0iFeAYjMrB64EnnX3VndvA57l2C+SUO3c35U00y8MVVqQzczcTCV9EYnbRPv0y9x9T3B9L1AWXK8AGmLqNQZlI5UnjfrW5BujH2VmLJmr6RhEJH5xH8h1dwcmbZUPM1tlZrVmVtvS0jJZD3tcvf0D7G7vTsr+/Kilcwt5q6lTC6qISFwmmvSbgm4bgr/NQfkuoCqmXmVQNlL5Mdz9Pnevcfea0tLSCYY3Pg2t3bgn53DNqKVzC+g6rAVVRCQ+E036a4DoCJybgCdiyj8djOI5D2gPuoGeBq4ws5nBAdwrgrKkUB8duZOEwzWjls2LLKii6RhEJB5jGbL5MPAbYImZNZrZLcBdwEozexu4PLgN8BTwLrAd+C7wZwDu3gr8NfBacPmroCwp7EziE7OiTi0rIM2U9EUkPqOOT3T3G0fYdNkwdR24dYTHWQ2sHld0CbJzfxd5WenMyssKO5QR5WSmc1JpPlv26GCuiEyczsglOtFaHmYWdijHVV1eqJa+iMRFSZ9I0k+2idaGU11ewK4D3bR394UdiohMUSmf9N2dxrYuqkqSZ7WskVSXRw7mblVrX0QmKOWT/r6Dh+npG6RyZvK39JeVawSPiMQn5ZN+Q1tk5M5UaOnPKcimJC+LLUr6IjJBKZ/0G9u6AaZES9/MqC4voE4jeERkgpT0g5Z+5czkb+kDVM8tZFtTJ/0Dg2GHIiJTUMon/YbWbmblZZGblXxTKg+nuryQw/2D7Nh3KOxQRGQKSvmk39jWNWVa+XB0BI/69UVkIpT027qpnAJj9KNOmZNPZrqpX19EJiSlk/7goLOrrXtKtfSzMtI4uTRfwzZFZEJSOuk3d/ZyeGBqjNGPtUzTMYjIBKV00o+O3KmaQi19iEyz3NzZy/6DvWGHIiJTTIon/akzRj9W9ZEzc9WvLyLjk9JJv6F1ao3Rj6rWdAwiMkEpnfQb27opLcgmJzM97FDGpSQvi7LCbCV9ERm3lE76DVNsjH6s5fOKeL2+jci6NSIiYxNX0jez/2Zmm81sk5k9bGY5ZrbIzNaa2XYz+5GZZQV1s4Pb24PtCyflGcShsa2bqinWnx91ydI57NzfxTstB8MORUSmkAknfTOrAG4Hatx9OZAO3AB8E/iWu58CtAG3BHe5BWgLyr8V1AvNwKCz+8DUGqMf6/LqOQA8u6U55EhEZCqJt3snA5hhZhlALrAHuBR4NNj+AHBdcP3a4DbB9sssxPUJ93b00D/oU27kTlR50QyWVxTyy7qmsEMRkSlkwknf3XcBdwP1RJJ9O/A6cMDd+4NqjUBFcL0CaAju2x/UnzX0cc1slZnVmlltS0vLRMMbVWPr1JlHfySXV5exrr6NfRqvLyJjFE/3zkwirfdFwDwgD7gq3oDc/T53r3H3mtLS0ngfbkQNU3SMfqzLq8twh+e3qotHRMYmnu6dy4Ed7t7i7n3A48CFQHHQ3QNQCewKru8CqgCC7UXA/jj2H5fGti7MYF5xTlghxO20eYWUF+Xwyy3q4hGRsYkn6dcD55lZbtA3fxmwBXgB+FhQ5ybgieD6muA2wfbnPcTxhg2t3ZQV5JCdMbXG6McyMy6rnsN/vL2Pnr6BsMMRkSkgnj79tUQOyK4DNgaPdR/w34EvmNl2In329wd3uR+YFZR/AbgjjrjjNtXm0R/J5dVldPcN8J/v7As7FBGZAuJaLsrdvwZ8bUjxu8C5w9TtAa6PZ3+TqbGtm3MXlYQdRtzOP3kWeVnp/LKumUuXloUdjogkuZQ8I7dvYJA97VN3jH6s7Ix0Lj61lOfqmhgc1Nm5InJ8KZn097b3MOhM2bNxh7q8uoymjl427W4POxQRSXIpmfSn6uyaI/nw0jmkGTz4Sn3YoYhIkkvJpD9V59EfSUleFrdctIgf1TbwxPpdo99BRFJWSib9hrYu0gzKp/AY/aG+dNVSzlk4kzse28jbTVpcRUSGl5JJf/eBHuYU5JCZPn2efmZ6Gv/48RXkZafzp//6Ood6+0e/k4iknOmT9cahqaOHsqLp08qPKivM4Z4bz2LHvkPc8fhGzbUvIsdI2aQ/tzA77DBOiAtOns0Xr1jCv725m5e3hzbLhYgkqZRM+ns7ephbOP1a+lE3XbAQgHX1beEGIiJJJ+WSftfhfjp7+pkzjZN+fnYGi2bnsVnj9kVkiJRL+k0dkbnnp3NLHyIzcG7apYXTReT9Ui7p723vAWDuNDyQG+u0eUXsOtDNga7DYYciIkkk5ZJ+c2ck6ZdN0wO5UcsrCgHYvFutfRE5KuWSfrSlXzbtu3eKANi0S/36InJU6iX9jh5ys9LJz45rVumkV5KXxbyiHLX0ReR9Ui7pN3f0Mrcwh8hiX9PbaRVFmnlTRN4n5ZL+3o6ead+1E3XavEJ27DukKRlE5Ii4kr6ZFZvZo2a21czqzOx8Mysxs2fN7O3g78ygrpnZPWa23cw2mNmKyXkK47O3vWfaH8SNWj6vCHeo26MuHhGJiLel/23gF+6+FDgDqCOy9u1z7r4YeI6ja+FeDSwOLquAe+Pc97i5O82d03PeneGcphE8IjLEhJO+mRUBFxMsfO7uh939AHAt8EBQ7QHguuD6tcAPPeIVoNjMyie6/4loPXSYvgGf9idmRc0tzGFWXpZG8IjIEfG09BcBLcD3zewNM/uemeUBZe6+J6izF4iu1l0BNMTcvzEoex8zW2VmtWZW29LSEkd4x4qejZsqffpmxrJ5hWrpi8gR8ST9DGAFcK+7nwUc4mhXDgAemdt3XPP7uvt97l7j7jWlpaVxhHespo7UGKMfa3lFEW81ddLbPxB2KCKSBOJJ+o1Ao7uvDW4/SuRLoCnabRP8bQ627wKqYu5fGZQlzN6O1DgbN9Zp8wrpH3TebjoYdigikgQmnPTdfS/QYGZLgqLLgC3AGuCmoOwm4Ing+hrg08EonvOA9phuoISItvTnFKRQS19n5opIjHhPS/0s8KCZZQHvAjcT+SL5sZndAuwE/iCo+xTwEWA70BXUTaimjh5m52eRlZE6pyfML8klPztDJ2mJCBBn0nf39UDNMJsuG6auA7fGs7947W3vSalWPkBamg7mishRqdPkJTJ6Z7pPqTyc5fOKqNvTQd/AYNihiEjIUizpp84UDLEuOHkWPX2DPFfXPHplEZnWUibp9/YPsP/Q4ZQauRN1yZJSyotyeHDtzrBDEZGQpUzSb+lMjWUSh5ORnsYN58znP97ex879h8IOR0RClDJJ/8iJWSnYpw/wh+dUkZ5mPPRqfdihiEiIUijpB1MwpNjonai5RTlcXj2Hn9Q26uxckRSWMkk/VRZEP55PfHABrYcO84tNe8MORURCkjJJv6mjh6z0NGbmZoYdSmguOmU280tyeXCtunhEUlVKJf05hdkpsUziSNLSjI9/cD6v7mjl7abOsMMRkRCkTNLf29GTkiN3hrr+7Eoy002tfZEUlTJJv6mjNyVPzBpqVn42ly0t4+nN6tcXSUUpkfTdPWXPxh3OeSeVsKe9h90HusMORUQSLCWSfmdvP12HB5hblHpn4w6nZmEJALU720KOREQSLSWSflN76q2YdTxL5xaQm5XOOiV9kZSTGkk/xdbGHU1GehpnVhVTu7M17FBEJMFSIulH+67LU/jErKHOXjCTuj2dHOrtDzsUEUmguJO+maWb2Rtm9mRwe5GZrTWz7Wb2o2BVLcwsO7i9Pdi+MN59j1VDWxdpBvOKZyRql0nv7AUzGRh03mw4EHYoIpJAk9HS/xxQF3P7m8C33P0UoA24JSi/BWgLyr8V1EuIhtYuyotmkJmeEj9sxuSs+TMx08FckVQTVxY0s0rgt4HvBbcNuBR4NKjyAHBdcP3a4DbB9sssQafHNrR1U1WiVn6sohmZnDqngNeV9EVSSrxN378HvgRE1+GbBRxw92hHcSNQEVyvABoAgu3tQf0TrqG1i6qZuYnY1ZSyYsFM1tW3MTjoYYciIgky4aRvZtcAze7++iTGg5mtMrNaM6ttaWmJ+/F6+gZo7uylqkRJf6iaBTPp7Onn7eaDYYciIgkST0v/QuCjZvYe8AiRbp1vA8VmlhHUqQR2Bdd3AVUAwfYiYP/QB3X3+9y9xt1rSktL4wgvorEtMnJH3TvHOnvBTAAN3RRJIRNO+u7+ZXevdPeFwA3A8+7+CeAF4GNBtZuAJ4Lra4LbBNufd/cT3q/Q0NoFoO6dYSyYlcvs/Cz164ukkBMxnOW/A18ws+1E+uzvD8rvB2YF5V8A7jgB+z5GQ1uQ9NW9cwwzY8X8mUr6IikkY/Qqo3P3XwG/Cq6/C5w7TJ0e4PrJ2N94NLR2kZWRRmm+5t0ZTs3CmTyzpYmWzl5KC/QaiUx3037gekNrN5UzZ5CWlrqLpxxPtF9frX2R1DD9k35bF/PVtTOi5RVFZGWk8aPX6ukbGBz9DiIypU3/pK8x+seVnZHOHVct5YVtLdz+8BtK/CLT3LRO+u3dfXT09Gu45ij++KJF3HnNMn6+aS+3PbSOw/1K/CLT1bRO+hquOXa3XLSIr/3OMp7e3MRtD61Ti19kmprWSb9RwzXH5eYLF/H131nGM1ua+EltY9jhiMgJMK2Tfr1a+uN20wULWTwnn8fXKemLTEfTOuk3tHZTkJNBUW5m2KFMGWbG766ooHZnGzv3Hwo7HBGZZNM76bdp5M5EXHdmBWbw0zd2jV5ZRKaU6Z30WzVGfyLmFc/g/JNm8dM3dpGA6ZFEJIGmbdJ3dxq1eMqE/d6KSnbu72Jdvc7UFZlOpm3Sb+nspbd/UCN3Juiq5XPJyUzjsXXq4hGZTqZt0j8yu6b69CckPzuDq06by5Nv7qa3fyDscERkkkzfpN+qxVPi9bsrKuno6ef5uuawQxGRSTKNk36kpV+plv6EXXjyLOYUZPO4RvGITBvTNunXt3ZRWpBNTmZ62KFMWRnpaVx3VgUvbG3m5e37wg5HRCbBtE36kTH66tqJ16qLT+Lk0nxu/v5r/GLTnrDDEZE4TTjpm1mVmb1gZlvMbLOZfS4oLzGzZ83s7eDvzKDczOweM9tuZhvMbMVkPYnhNLR2a+TOJJidn82P/ut5LK8o5M8eXMcjr9aHHZKIxCGeln4/8EV3XwacB9xqZsuIrH37nLsvBp7j6Fq4VwOLg8sq4N449n1cfQOD7Gnv1olZk6Q4N4t//ZMP8qHFpdzx+Ea+9x/vhh2SiEzQhJO+u+9x93XB9U6gDqgArgUeCKo9AFwXXL8W+KFHvAIUm1n5RPd/PK2HDlOcm6XhmpMoNyuD7366ho98YC7feKpOffwiU9Sk9Omb2ULgLGAtUObu0c7fvUBZcL0CaIi5W2NQNvSxVplZrZnVtrS0TCiessIc1t25kutrKid0fxleVkYa//f6Mzm5NJ/P/2g9+w72hh2SiIxT3EnfzPKBx4DPu3tH7DaPTNwyrslb3P0+d69x95rS0tJ4Y4vr/nKsGVnp/OPHz6K9u48//8mbDA5qbh6RqSSupG9mmUQS/oPu/nhQ3BTttgn+Rs/s2QVUxdy9MiiTKWbp3ELu/O1qfrWthdUv7wg7HBEZh3hG7xhwP1Dn7n8Xs2kNcFNw/SbgiZjyTwejeM4D2mO6gWSK+eR5C7jytDK++YutbGg8EHY4IjJG8bT0LwQ+BVxqZuuDy0eAu4CVZvY2cHlwG+Ap4F1gO/Bd4M/i2LeEzMz45u+fzuz8bD73yHq6DveHHZKIjIEl83zpNTU1XltbG3YYchz/+c4+Pv7dtXzqvAX89XXLww5HRAAze93da4bbNm3PyJXEuODk2fzJRYv4l1d28sI2TcwmkuyU9CVuf37lEk4ty+dLj26g7dDhsMMRkeNQ0pe45WSm860/PJMDXYf5Hz/dqCUWRZKYkr5MitPmFfGFlUv4+aa9/MWjG2hVi18kKWWEHYBMH6suPomOnj6++9K7PFfXxJc/Us3HVlSSlqaT5ESShUbvyKTbtreTr/x0I7U72zizqpiPnjGPi0+dzcml+TpLWiQBjjd6R0lfTojBQecnrzfwzy++y7v7DgFQXpTDR8+cxxdWnkp2hha3ETlRlPQlVA2tXfx6+z5e2NrMM1uaOKOqmO98cgXlRVrkRuRE0Dh9CVVVSS43njuf+z5dw3c+uYLtTZ1cc8+v+c93ND2zSKIp6UtCXbW8nCduu4ji3Ew+df+rPLRWK3GJJJKSviTcKXPyeeK2i/jQ4tl85WcbtfauSAIp6Uso8rMzuPcTZ3NmVTGfe2Q9te+1hh2SSEpQ0pfQzMhK5/6bzmFe8Qz+5Ie1vNNyMOyQRKY9jd6R0NXv7+L37n2ZnMx0/qDm6Do7+dkZfKymksKczBCjE5l6NGRTkt7Gxnb+6Puvsn/I9A2z87P4iyuXcP3ZVTqzV2SMlPRlShgc9PctqLx5dzt/+W9beH1nGx+oKOK/XHwSMzKPntRVXV5A5czcxAcqkuSU9GXKcnfWvLmbv3lqK3s7et63Lc3gquVzueWikzh7wcyQIhRJPsdL+gmfcM3MrgK+DaQD33P3u0a5i6QwM+PaMyu48rS5bG8+eqC3f9B5evNeHnxlJ09t3MsZVcWcXlFEcW4mRTMyKc7NYk5BNmWFOcwtzKFwRobm/REhwS19M0sH3gJWAo3Aa8CN7r5luPpq6ctoDvX289i6Rh5+tYE97d20d/cx3Ec6PzuDxWX5LCkrYHFZAXlZ6Rzo7qM9uHQfHqCnL3IZcKgozmF+SR4LZuVSVpj9vi+MjDQjOyOdnMw0cjLTSYvZZgZZGWnkZKSTmW76opFQJE33jpmdD3zd3a8Mbn8ZwN3/Zrj6SvoyXoODTmdvPwe6DtPU0UtTRw9NHT3Ut3bxVlMnbzUdfN9c/xlpRtGMTHKz048kcsPYdaA77jUB0oz3fTnkZKaTnmboa0DGYml5If9w41kTum8yde9UAA0xtxuBD8ZWMLNVwCqA+fPnJy4ymRbSgiReNCOTBbPyhq2z72Avvf2DFM/IJDcrfcTWeGdPHzv3d7HvYO/7yvsHnN7+wcgvg/4BBmPaTe7O4f7Bo9v7Bujpi9YdZGBwcNKeq0xvVTNPzISESbeIirvfB9wHkZZ+yOHINDQ7P3tM9QpyMlleUXSCoxFJrESfkbsLqIq5XRmUiYhIAiQ66b8GLDazRWaWBdwArElwDCIiKSuh3Tvu3m9mtwFPExmyudrdNycyBhGRVJbwPn13fwp4KtH7FRERzbIpIpJSlPRFRFKIkr6ISApR0hcRSSFJPcummbUAO0/Qw88G9p2gx45HMsaVjDFBcsaVjDGB4hqPZIwJxhfXAncvHW5DUif9E8nMakeamyJMyRhXMsYEyRlXMsYEims8kjEmmLy41L0jIpJClPRFRFJIKif9+8IOYATJGFcyxgTJGVcyxgSKazySMSaYpLhStk9fRCQVpXJLX0Qk5Sjpi4ikkJRI+mZWZWYvmNkWM9tsZp8LykvM7Fkzezv4OzOBMeWY2atm9mYQ018G5YvMbK2ZbTezHwVTUCecmaWb2Rtm9mQyxGVm75nZRjNbb2a1QVlo719MXMVm9qiZbTWzOjM7P+y4zGxJ8DpFLx1m9vkkiOu/BZ/1TWb2cPA/EPrn3cw+F8S02cw+H5Ql9LUys9Vm1mxmm2LKho3BIu4JXrMNZrZiPPtKiaQP9ANfdPdlwHnArWa2DLgDeM7dFwPPBbcTpRe41N3PAM4ErjKz84BvAt9y91OANuCWBMYU63NAXcztZIjrw+5+ZsxY5TDfv6hvA79w96XAGURes1Djcvdtwet0JnA20AX8NMy4zKwCuB2ocfflRKZWv4GQP1dmthz4L8C5RN6/a8zsFBL/Wv0AuGpI2UgxXA0sDi6rgHvHtSd3T7kL8ASwEtgGlAdl5cC2kOLJBdYRWS94H5ARlJ8PPB1CPJXBh+xS4EnAwo4LeA+YPaQs1PcPKAJ2EAyISJa4hsRyBfBy2HFxdH3sEiJTuj8JXJkEn6vrgftjbt8JfCmM1wpYCGwa7XME/DNw43D1xnJJlZb+EWa2EDgLWAuUufueYNNeoCzBsaSb2XqgGXgWeAc44O79QZVGIv8sifb3RD740VW8ZyVBXA48Y2avm9mqoCzU9w9YBLQA3w+6wr5nZnlJEFesG4CHg+uhxeXuu4C7gXpgD9AOvE74n6tNwIfMbJaZ5QIfIbKkazK8hyPFEP0CjRrX65ZSSd/M8oHHgM+7e0fsNo98ZSZ0/Kq7D3jkJ3glkZ+XSxO5/+GY2TVAs7u/HnYsQ1zk7iuI/LS91cwujt0YxvtHpMW6ArjX3c8CDjGkGyCkuAAI+sc/Cvxk6LZExxX0R19L5ItyHpDHsd0ZCefudUS6mJ4BfgGsBwaG1AntPTwRMaRM0jezTCIJ/0F3fzwobjKz8mB7OZEWd8K5+wHgBSI/b4vNLLqiWRgLx18IfNTM3gMeIdLF8+2w4wpairh7M5H+6XMJ//1rBBrdfW1w+1EiXwJhxxV1NbDO3ZuC22HGdTmww91b3L0PeJzIZy3szzvufr+7n+3uFxM5rvAWyfEejhTDLiK/RqLG9bqlRNI3MwPuB+rc/e9iNq0Bbgqu30Skrz9RMZWaWXFwfQaRYwx1RJL/x8KICcDdv+zule6+kEjXwPPu/okw4zKzPDMriF4n0k+9iRDfPwB33ws0mNmSoOgyYEvYccW4kaNdOxBuXPXAeWaWG/w/Rl+rUD/vAGY2J/g7H/g94CGS4z0cKYY1wKeDUTznAe0x3UCjS+RBk7AuwEVEfhptIPLzbT2RvrtZRA5Yvg38EihJYEynA28EMW0CvhqUnwS8Cmwn8rM8O8TX7RLgybDjCvb9ZnDZDHwlKA/t/YuJ7UygNngffwbMTJK48oD9QFFMWahxAX8JbA0+7/8CZCfD5x34DyJfQG8Cl4XxWhH5ct4D9BH5BXnLSDEQGVjxT0SOAW4kMiJqzPvSNAwiIikkJbp3REQkQklfRCSFKOmLiKQQJX0RkRSipC8ikkKU9EVEUoiSvohIClHSFxmBmf0smOBtc3SSNzO7xczesshaCN81s38MykvN7DEzey24XBhu9CLD08lZIiMwsxJ3bw2myXiNyFTALxOZX6cTeB54091vM7OHgP/n7r8OTud/2t2rQwteZAQZo1cRSVm3m9nvBtergE8BL7p7K4CZ/QQ4Ndh+ObAsMq0MAIVmlu/uBxMZsMholPRFhmFmlxBJ5Oe7e5eZ/YrIvDEjtd7TgPPcvSchAYpMkPr0RYZXBLQFCX8pkWU284DfMrOZwXTAvx9T/xngs9EbZnZmIoMVGSslfZHh/QLIMLM64C7gFSJzlv9vIrNCvkxkCcf2oP7tQE2wUPUW4E8THrHIGOhArsg4RPvpg5b+T4HV7v7TsOMSGSu19EXG5+vBusabiCyK/rNQoxEZJ7X0RURSiFr6IiIpRElfRCSFKOmLiKQQJX0RkRSipC8ikkL+P7pkREAY9ejIAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "df[[\"age\",\"user_id\"]].groupby(\"age\").count().plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Parsing JSON files containing users answers" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 21628/21628 [00:53<00:00, 407.71it/s]\n" + ] + } + ], + "source": [ + "from tqdm import tqdm\n", + "expected_answers = []\n", + "personal_answers = []\n", + "\n", + "question2id = {}\n", + "\n", + "for user in tqdm(users):\n", + " user_id = user[6:-5]\n", + "\n", + " with open(f\"answers/{user_id}.json\",'r') as f:\n", + " data = f.read()\n", + "\n", + " try:\n", + " questions = json.loads(data)\n", + " except:\n", + " continue\n", + "\n", + " for question in questions:\n", + " importance = question[\"target\"][\"importance\"]\n", + " accepts = question[\"target\"][\"accepts\"]\n", + " answer = question[\"target\"][\"answer\"]\n", + "\n", + " question_id = question[\"question\"][\"id\"]\n", + "\n", + " personal_answer = {\n", + " \"user_id\": user_id,\n", + " \"question_id\": question_id,\n", + " \"answer\": answer,\n", + " \"importance\": importance\n", + " }\n", + " \n", + " personal_answers.append(personal_answer)\n", + "\n", + " question2id[question[\"question\"][\"text\"]] = question_id\n", + " for accept in accepts:\n", + " next_answer = {\n", + " \"user_id\": user_id,\n", + " \"question_id\": question_id,\n", + " \"accepts\": accept,\n", + " \"importance\": importance\n", + " }\n", + " \n", + " expected_answers.append(next_answer)\n", + "\n", + "expected_answers = pd.DataFrame(expected_answers)\n", + "personal_answers = pd.DataFrame(personal_answers)" + ] + }, + { + "cell_type": "code", + "execution_count": 486, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('Could you be in a committed relationship with someone who regularly smokes pot (> 2 times a week)?',\n", + " 462356),\n", + " ('Have you smoked a cigarette in the last 6 months?', 501),\n", + " ('Regardless of whether or not you smoke marijuana, do you think it should be legalized for adults?',\n", + " 341),\n", + " ('Would you go out with a smoker?', 13006),\n", + " ('You witness your next door neighbors discreetly smoking marijuana on their own property. How do you respond?',\n", + " 47589),\n", + " ('What do you think of laws that make smoking illegal in bars and restaurants?',\n", + " 13054),\n", + " ('How often do you smoke cigars?', 80621),\n", + " ('Do you smoke Weed?', 119507),\n", + " ('If you had a potentially harmful addiction such as smoking, drinking, or drugs, how do you think you would you feel if a significant other tried to get you to stop?',\n", + " 36331),\n", + " ('Do you think parents who smoke in cars with very young children should be punished?',\n", + " 51053),\n", + " ('If you caught your child smoking pot what would you do?', 21487),\n", + " ('Do you think it is acceptable to smoke tobacco in front of children?',\n", + " 43545),\n", + " ('Do you smoke cigarettes?', 103168),\n", + " ('All things being equal, would you prefer your ideal partner to be a smoker?',\n", + " 102016),\n", + " ('Do you think smoking in Malaysia should be banned in eateries?',\n", + " 1174168646),\n", + " ('Do you smoke?', 133887)]" + ] + }, + "execution_count": 486, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[(text, question_id) for text, question_id in question2id.items() if \"smok\" in text]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "personal_answers[personal_answers[\"question_id\"] == 462356][[\"answer\",\"user_id\"]]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Testing stuff\n", + "\n", + "## Search users by keyword" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from users_by_question import keyword_search\n", + "keyword_search(\"420\")" + ] + } + ], + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}