diff --git a/rwill166.ipynb b/rwill166.ipynb new file mode 100644 index 0000000..b36f0fc --- /dev/null +++ b/rwill166.ipynb @@ -0,0 +1,582 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Written text as operational data\n", + "\n", + "Written text is one type of data\n", + "\n", + "### Why people write?\n", + "\n", + " - To communicate: their thoughts, feelings, urgency, needs, information\n", + "\n", + "### Why people communicate?\n", + "\n", + "1. To express emotions\n", + "1. To share information\n", + "1. To enable or elicit an action\n", + "1. ...\n", + "\n", + "### We will use written text for the purpose other than \n", + "1. To experience emotion\n", + "1. To learn something the author intended us to learn\n", + "1. To do what the author intended us to do\n", + "\n", + "### Instead, we will use written text to recognize who wrote it\n", + " - By calculating and comparing word frequencies in written documents\n", + " \n", + "See, for example, likely fictional story https://medium.com/@amuse/how-the-nsa-caught-satoshi-nakamoto-868affcef595" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example 1. Dictionaries in python (associative arrays)\n", + "\n", + "Plot the frequency distribution of words on a web page." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\t1\n", + "\t1\n", + "403\t1\n", + "Forbidden\t1\n", + "\t1\n", + "

Forbidden

\t1\n", + "

You\t1\n", + "don't\t1\n", + "have\t1\n", + "permission\t1\n", + "to\t1\n" + ] + } + ], + "source": [ + "import requests, re\n", + "# re is a module for regular expressions: to detect various combinations of characters\n", + "import operator\n", + "\n", + "# Start from a simple document\n", + "r = requests .get('http://eecs.utk.edu')\n", + "\n", + "# What comes back includes headers and other HTTP stuff, get just the body of the response\n", + "t = r.text\n", + "\n", + "# obtain words by splitting a string using as separator one or more (+) space/like characters (\\s) \n", + "wds = re.split('\\s+',t)\n", + "\n", + "# now populate a dictionary (wf)\n", + "wf = {}\n", + "for w in wds:\n", + " if w in wf: wf [w] = wf [w] + 1\n", + " else: wf[w] = 1\n", + "\n", + "# dictionaries can not be sorted, so lets get a sorted *list* \n", + "wfs = sorted (wf .items(), key = operator .itemgetter (1), reverse=True) \n", + "\n", + "# lets just have no more than 15 words \n", + "ml = min(len(wfs),15)\n", + "for i in range(1,ml,1):\n", + " print (wfs[i][0]+\"\\t\"+str(wfs[i][1])) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example 2\n", + "\n", + "Lots of markup in the output, lets remove it --- \n", + "\n", + "use BeautifulSoup and nltk modules and practice some regular expressions." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "import requests, re, nltk\n", + "from bs4 import BeautifulSoup\n", + "from nltk import clean_html\n", + "from collections import Counter\n", + "import operator\n", + "\n", + "# we may not care about the usage of stop words\n", + "stop_words = nltk.corpus.stopwords.words('english') + [\n", + " 'ut', '\\'re','.', ',', '--', '\\'s', '?', ')', '(', ':', '\\'',\n", + " '\\\"', '-', '}', '{', '&', '|', u'\\u2014' ]\n", + "\n", + "# We most likely would like to remove html markup\n", + "def cleanHtml (html):\n", + " from bs4 import BeautifulSoup\n", + " soup = BeautifulSoup(html, 'html.parser')\n", + " return soup .get_text()\n", + "\n", + "# We also want to remove special characters, quotes, etc. from each word\n", + "def cleanWord (w):\n", + " # r in r'[.,\"\\']' tells to treat \\ as a regular character \n", + " # but we need to escape ' with \\'\n", + " # any character between the brackets [] is to be removed \n", + " wn = re.sub('[,\"\\.\\'&\\|:@>*;/=]', \"\", w)\n", + " # get rid of numbers\n", + " return re.sub('^[0-9\\.]*$', \"\", wn)\n", + " \n", + "# define a function to get text/clean/calculate frequency\n", + "def get_wf (URL):\n", + " # first get the web page\n", + " r = requests .get(URL)\n", + " \n", + " # Now clean\n", + " # remove html markup\n", + " t = cleanHtml (r .text) .lower()\n", + " \n", + " # split string into an array of words using any sequence of spaces \"\\s+\" \n", + " wds = re .split('\\s+',t)\n", + " \n", + " # remove periods, commas, etc stuck to the edges of words\n", + " for i in range(len(wds)):\n", + " wds [i] = cleanWord (wds [i])\n", + " \n", + " # If satisfied with results, lets go to the next step: calculate frequencies\n", + " # We can write a loop to create a dictionary, but \n", + " # there is a special function for everything in python\n", + " # in particular for counting frequencies (like function table() in R)\n", + " wf = Counter (wds)\n", + " \n", + " # Remove stop words from the dictionary wf\n", + " for k in stop_words:\n", + " wf. pop(k, None)\n", + " \n", + " #how many regular words in the document?\n", + " tw = 0\n", + " for w in wf:\n", + " tw += wf[w] \n", + " \n", + " \n", + " # Get ordered list\n", + " wfs = sorted (wf .items(), key = operator.itemgetter(1), reverse=True)\n", + " ml = min(len(wfs),15)\n", + "\n", + " #Reverse the list because barh plots items from the bottom\n", + " return (wfs [ 0:ml ] [::-1], tw)\n", + " \n", + "# Now populate two lists \n", + "(wf_ee, tw_ee) = get_wf('http://www.gutenberg.org/ebooks/1342.txt.utf-8')\n", + "(wf_bu, tw_bu) = get_wf('http://www.gutenberg.org/ebooks/76.txt.utf-8')" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAApMAAAGZCAYAAADVZboGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAB9k0lEQVR4nO3deXgV1f3H8fc3gQRCYgRkCbigbLKDRhZFDGAFBcG1VqkSUIMLdakoUP1V1LpAUaF1qbECbrW1Vqt1Q0UCIptBRDZFkOAWxYU9siXn98dM4uVyQ/bce5PP63nmuTczZ86cM3PvyffOnDljzjlERERERMojJtwFEBEREZHopWBSRERERMpNwaSIiIiIlJuCSREREREpNwWTIiIiIlJuCiZFREREpNwUTIaBmWWZ2UFjMplZXTO7w8w+M7M9ZubM7JyA5deZ2Roz+9lfdkN1lrsmMLMcM8sJdzmk/Mxslv/5b1WGdWr0cTezNH+fTAp3WUrDzCb55U2r4u04M8sKx7ajRU35bphZK/+4zqqJ24t0CibLyf8QBU57zOx7M/vQzP5uZmeaWWwZs70J+CPwDTAVuAP4xN/eb4DpwG5gmr9scWXVRypPcT8WaquAf96B089mts7MHjazI8NdxtomIPgMnPaa2Vdm9m8z6xPuMkpk8oPPQ/6YK2wDozVgD/HdCJ7Sw13GSFMn3AWoAe7wX2OBw4FOwKXA5UC2mY1wzq0LWucyICFEXkOBncCvnHN7QywDGOqc+6YyCi5SzeYBWf77I4AzgGuAX5tZb+fchlLmMxG4D/i60ktY+2wCZvnvGwC9gQuA88zsAufcS1W03YeAfwJfVFH+kbptiS53FDP/I7z2pwOwrdpKE8EUTFaQc25S8Dwzawb8FbgQeMfMUp1zmwPWKa4RawH8GCKQLFyGAkmJYlmB3xczqwu8AQwEbgNGlSYT51wukFsVBayFcoLbMDO7A+8Kyf1AlQSTzrkfgB+qIu9I3rZEl1D/34N8Uh3liAa6zF0FnHPfAb/BOwtzFPCHwOXBl0EL+4ABxwLHBJxKzym8RAj099MWnWoPyvN4P58v/ctV35nZP8ysfXD5AvqcHWdmvzOzj/3LjlkBaRqZ2b1mttZfts3M5pjZGSHySy889W9m/f367TCz7Wb2mpl1CLWfzCzBzMabWbaffqe/vb/4AXlw2olm9pGZ7fLTLjKzi0s4HCGZWbKZPWRmX5vZbvP6ol5nZlZM+l5m9oKZfevv3y/N7DEzaxGQppV/XE7z/w68LJLlz1vkr98gKP95fronguZ38Oc/FTS/jpldY2aL/f2cZ2bLzWysmYX8XpemDgFpCy9T1TGzP9gv/Xi/NLPJZhZXuj1dPOfcPiDT/7NnwLadv/3m5nUZ+drM8gsvLVkxfSbNM9bMVvvH9Gv/GCcfqhxmdrGZzTWzrf56a83sNjOLL21dzKydmd3nf5a/9/fVJjPLtBCX8S2gj6OZdfe/J1v94zjPzE4uZjvNzOwJ877fP/vfh5GlLWcpPey/HmtmTfztFn4e4szsj2b2qV/HWQFlO9Lf35/7y340s1fM7KQQ9Tio36KV0AfNiu9rHmdm/2dmG/ztbjSzPxV3/EJtO2DZ8WY2w7y2d4+ZbTaz98zs6mLSlqrNLY5f9rFm9rr/edljZj+Z2TtmdmYx6+T4UwMz+7OZfeGvt9689vSgNqy8343KZiH6sAYsK7YvtJn1NLN/+eXeY2a5ZvaWmf26FNuMMbPpft4vmln9itek+M9rYD3MbIyZrfT3+Xd+e3DQPi/PMY00OjNZRZxzBWb2JyANuNjMbnTFPwj9v0AOcIP/9zT/dSve6XSAdOAYQpx2N7PBwItAXeB/wHrgSOA8YIiZ9XfOfRhiu9OBU4HXgNeBfD+/Y/AC4VbAe8CbeJfAhgJvmtkY59zjIfIbCgzHO9v0N6AjcBZwkpl19M8IFJa5ITAX6AZ8CswA9gKt8c5QvQh856c9HHgX6AF86KeNAQYB/zCzTs6520KUpzhxwDt43RL+6f99vr8/2gPXBiY2s9F4Qc8e4BXgS6AtcAVwtnmXaL/AO153EPpY5fivc/AuJZ6Kt18xswR/Hnhn6QINDFivsDyFx3kQ3r77B15f2v54Z8R74XW1KE8dgv3DL+sbwHa843kL0JRSnkksQWEjGfzdaITXJ3gn3mehAP/zcAjTgOvwzlpmAvvwPo+98I7xQWf8zWwGXj2+Av6Ddwx7A3cBA83sV865/aWox3nAVXif6YX+tjrxy/5Ndc6Fuiyfirc/FwF/B47G+yzOMbPuzrlPA8p6hJ/3ccACf0rB+669VYoyllbgP67g4/If4CS8z8N/gc1+2U7wy9AImI13zI4AzgEWmNm5zrnXK7GM+Ns14Hm847wB7xJ2HDAa6FLGvIYA/wbi8b6bz+G1Ed3wjtGjAWnL2+YGa4TX7iwE3ga+xzumZwOvm9mVzrm/h1ivLt5+boF3LPbj7ev7gHoc/H9iGmX8bkQKM7sSb9/n47Vdn+G1P6l43WSeP8S69YBn8Y7Lw8B1zrmCqi6zbwpeG/0/vO9Gf+BKoA0wIET6sh7TyOKc01SOCa+RdSWkicf70jrg2ID5WaHWxQs4corJq7h1GgJb8C7bdAxa1hnvn/GHQfNn+WX6OrBcQdsqAH4TNP9wvOD2Z6BZwPx0P7/9wMCgde71l90SNP8f/vxHgZigZYlAcojyBudRD6/RLwC6l/K45fh5LQDiA+Y3wvtn5IB+AfPb4TW064GWQXkNxGvgXirNsfKXDfC38eeAeYP8eW/5r60Dlr3kzzsqYN4kf95fgdiA+bHAE/6y4ZVRB2AZ0ChgfgM/n3ygeSn3eWF5JwXNr4MXJDvgieDvFvAUUCdEfoWfh1YB8072560PKm89vEDNEfTdCvjcvgjUL6bM15eyji0DP08B88/w99WjQfPTAuqZHrRsjD//kaD5mf78B4Pmp/JLOzOplOUt3H5WiGV3+ss2hPg8fAwcEeI4rsf7QXNa0LIWeO1MLgd+3wr3b1rAvFb+vFnFlDmLoO8VcIm/ziKgXjHf56ygdUJt+wi8vm97g+vgLz8y4H2Z29xDHIf4wLwD5icDq4CfQnw2c/zyvx64DC/A2upPdSvy3SihzIXbn+bvy1BTYZq0oHVDfuZc8d/rjnif7Z+ATiUclwM+P/5nYAHe/4fxpa1fQDldMXVLP9TnNaAeXwBHB31P5vvLelbkmEbiFPYCROtU+GErRbpvgz88VG4web2f/7XFrPegv7xjwLzCD/v1IdJ385f9u5j8hvvLrwmYl+7PeyZE+mP9ZS8EzGuK9w/2G6BBCfuvMV6Q+kExywvLO6WUx63wS3tqiGWF9ZgZYv8NKSa/l/zyJZV0rPxl9fCC8Q8D5k3BazD7+NvK8OfH4P3TWheQNgb4Ee+fc6hA63C8xvP5yqgDcHqI9Hf4y4aWcp9P8tNn8UuD/FdgnT//e+C4oO/WHqBpMfkVfn5bBcx73J83KkT6NEIHk8v9/X54iHVi8YKFpaWpYwn1/xj4vJgyLQiRvq5fruygebvwzg4nH2KfTCplmYr2ScAx+TO//LPLB84N8XkYHiKvwjbhz8Vsq7CNOivEZyItYF4ryh5Mvu2v0z9E+vTCz10xn8fAbd/kz5tein1X5ja3nJ+b3xP049afn+PPbxNinSf9ZZ0r8t0ooVyF2y/NlBa07kHHI8RnOPB7/Vd/3o2lKFfR5wfvytBavB8HI8qx7w9Vp6xDfV4D6nFFiHxH+cvGVuSYRuKky9xVr7jLeJWlcAiPbhZ6jLl2/msHYE3QsqWHyC+5mPyaBOQXLDvEvC/914YB807CC4rmO+d2hViHoLSxQHFj6NU9RHmKsx/vslKwLP+1R8C8wv1xmoXo+4UXGMfi7edlJW3YObfbzBYC/c2ssXPuR7yzlR845xaZ2Xd4ZwszgRPwgsN/BWTRDu8X92fAbcV0pfmZA/dHRepQ2mNaGqf5E3iN/Jd4l2jvcc59GZQ2xwXctFYKJ/iv80IsW4DfhaOQ37WgG17AeEMx+3EPpfxc+ZdbR+AFMN3w9k3g0GDFXUY8aP865/b5n4PA/Xs83ggQ7znnQt09mgWMLE1ZgxwD3O6/348X2L8I3O+cC/UdOVSbcUwx39G2/msHvDMvlekEvB9PC0IsyypDPoXdTN4oRdqKtLkHMbNOwM1AP7xL3PWCkrQMsdo259z6EPNDfTfL9N0og2OdczmhFvj9Ik8LtayMynJcCrXHO+PaADjTOTenhPTFcs5VpK9iWdvOshzTiKNgsgr5/TUa+X9+X0Wbaey/XllCusQQ8749RH6/8qey5Lc1eIZzbr//jzrwH+vh/mtphnYpLM9J/lSW8hTnB+dcqAa0cH8kh9j+zSXkWZbtz8ELIPub2Ry84PUef9m7wOl+cHJQf8mA8rTllyCgpPKUuw7Oua0h0hX2ISzrOKp3uJLvjiwU6rN5KIXH7KB+lf5nMPju3YZ4P/SacOj9WFoP4PV5zsXr9/Q1XlAPv/ShDWVrMfP3c+D+LbZ+vrLur0LznHNpZUh/qDbjwhLWLct3pLSSgZ+cdzNXsLLsk8P917K0SeVpcw9gZr3xvvOFXT5ewTv7XAB0xzvrG+pGoq3FZBnqu1nW70YkOdx/LcswYIU/uD/C62MfLltDzDtU2xkqfUnrRAwFk1WrL94+/q64X3CVoPAsRTfn3MdlXDfU2dLC/K53zv2l/MU6pK3+a6hf3MEKy/Ogc+73lbT9I8wsNkRA2Txom4Hvk51z2ytp++/6r6fj/dOI4ZeA8V3gYryzWwPxjtHcEOV5yTl3Xim3VxV1qGplPZNfWMdmwOeBC8ysDl6fuK9CpF/unDuBCjCzpng3N6wCTnbO7QhaXq4RB4IE1i+U5sXMr1TOv+4WpLBsw51zr1Qg+8IbI4r7v3R4MdtuZGZ1QwSUZdknW/3XlsDKEtJWpM0NdhtQH+8yfVbgAjObiBdMVlRZvxtVyVG247vVf21J6Yfh+R/ejYn34N3I9iv/CpBUIQ0NVEXMG57lVv/Pf1ThpgqfgnNqhOYXylK8fxz9LGiInEOkrczy1MHrlB4szX9dHjCvPPuj8K744n5JfoB39mEg3hnKn/Euy8AvQeVZwCnAxy7gLni8BnUr0Nu/q7s0quOYhlvhGYhQl9b6EvSr3jm3E1gNdDKzRiHWKYvj8NrSt0IEkkf6yyvqEyAP6F7McC5plbCN8qqsz9cW//Wo4AVmdhi/XD4O9CHevu8bYllaGbZdWIeQw/EUk7Yyvk9t8M6sZoVYVhmXiaGM340qtoXQxzcW70xssLIclyLOuXuBG/Gu+mRZ0FBzUvkUTFYB/0zFP/Easy/45RJmVZiJF1zcbmY9gxf6Y2yllTYz51w23nBA5/nDyRzEzLr4dSwX59z3ePsnBZhqQeMimlli4T9Mv9/cs0CqeWPJHdTwmVlrMzu2jMW41wLGofMDisLhhWYGpHsI72aIB83soH9m5o0TF/xPpfBX8NGhNuyfEZ2P94/kQrybMPb4yzbidca+Hq+P3LtB6+7H65SeAvwl1JhpZpZiZh0rWIdoM8t/vTUwOPS7mtxbzDoP4A2LMsMffuoAZtbQH/KmJDn+a9/Az6eZJeLd/FDhK0D+WbdngSS8G0gCy5mK118zXF7Gu3P6WjM7K1QCM+vj91Mtlh+IfwKcEvj59ffpA3hn8IIVflfv9o914TqB3+fSeBLvB97VZtYvRPkDxwqtzDY3B+/MategPC7HG+WhMszyX8vy3agqS4Gj7eDxim8jdFeQR/Eu8/5fUJsGHHRcDuCcmwZcjTdE1zwLMZ6uVB5d5q6ggA7YMfzyOMW+eP+kluLdSVZlfVKccz+a2QV4d+Qu9vvgrca7nHAUXmfxxhzcqftQLsELYp4ws+uAJXiN55FAV7zhL/rgjzFXTmP9fK4C0sxsNt5NCsfiNaLD+KUD/Vi8PoJ3Apea2QK8/j8t8Dq5n4R3aXhjKbedi9cPaZWZvYJ3E88FeAHaI865+YUJnXOf+EH1DGC1mb2JdxdyXbxg8VS8/rDHB+Q/By9IfNHMXsc787jJOfd0UJqheDe/BHcQn4P3OE5CLANvDMRuePvubDN7F69PUVO8/XQK3lnxNRWoQ1Rxzr1vZn8Ffod3XF/gl7H0thDiiTnOuRlmdiLeWHUb/M/gF3j9rY7FuyFiJt5+PtS2vzWzf+I9qOAjM3sLr5/ar/CGy/mI0GddyuoPeGezb/ADyMJxJi/Cu7FlWCVso8z8G4bOw+sr+pp/g9lHeGdSj8L7fh7nlzWvhOz+jDe81ftm9m9+GT+1LrAC73Mf6Dm8+g/DO+4v88v3+QO8cWtLU4cfzOwS4AVgrpm9gXcX/mF4bd5ReJ+Jym5zp+G1dwvM7Hm8S9KpeP9DXvDrUSHl+W5Uoal49X3ZzP6FN+TPyXj7Nougs8nOuTVmdg3ejXrL/eP7Gd7+PQnvB0D/4jbmnPubme3G+0zNN7MBrvgn0ElFhPt28midOHi4gD14d4YuwzsbMZig8RMD1s2ikoYGCljeCu8M1Gd4DfB2vF/5TwPnBKWdRdAQDCHyS8L757UMb9y0n/GCtdeADAKG9OGXITjSD7GvskLMb4AX9HyM909mB14ANI2gYWHwgvOxeHdhb/P39xd4wdYNQONSHrccf0rGG8T2az+vtXj93qyY9br4+22Tn/4nvD5yjwEDgtLG4p2N/pxfxv/LCpFf4WfnpKBlF/vz9xEwXE9QGsMbmHyOX5a9fl0W+MftqArWodjPW0nHO0T6SZRt2Jpihw851OfX3ydj/WO5B2/oqYf9Y51D8d+tocCreD+O9uLduLEU+BNwfCnLnADczS/jLX7pb7txqH3JL0OyhNwnxZUXrx/gDLzg/2e8oC29pPxC5FOYvtj9XNrPQ0CapngDLK/C+z7vxGuPXgB+S8BQVoQYnidg2eV4wdke/1g8Vtx+dL+0DX/E+77t8ffd3Xg/GEN99w617U5445t+7X8WvsO7CzojRNpWlLLNLWG/DcW7nLsD70f7W3g/ZNIJ8T0r4bMcsm6U87txiM9mSf8/sg6xj4fh3em8G+8qzj/xzkrOKi5fvAD9P/zyHf0Gb4zhC4KOhyPE0FJ4beo+v+zHlaKOLtRnLcTxP2h7JdQjjRDf0/Ic00ibzC+siIhItTCz+4DxeDcsLSopvYhENvWZFBGR6lbYd7e67iIWkSqkPpMiIlItzOwyvH6fw/GeLhQ8WL2IRCFd5hYRkWphZnPxnrf8Ht5YtmUZjFpEIpSCSREREREpN/WZFBEREZFyUzApIiIiIuWmYFJEREREyk3BpIiIiIiUm4JJERERESk3BZMiIiIiUm4KJkVERESk3BRMioiIiEi5KZgUERERkXJTMCkiIiIi5aZgUkRERETKTcGkiIiIiJSbgkkRERERKTcFkyIiIiJSbgomRURERKTcFEyKiIiISLkpmBQRERGRcoumYPIC4K/Ae8B2wAHPlDOvI4EZwDfAHiAHmAY0rGghRURERGqTOuEuQBncBnQDdgJfAceXM5/WwEKgKfAy8AnQE7geGAycAvxY0cKKiIiI1AbRdGbyRqAdcBhwdQXyeQQvkLwOOAeYAAwAHgTaA3dXqJQiIiIitUg0BZNzgc/wLm+XV2vgDLzL2g8HLbsd2AVcCjQoTWZmllGBskgY6dhFNx2/6KbjF7107KJbVR2/aAomK0N///UtoCBo2Q7gfSAB6F3K/PSlil46dtFNxy+66fhFLx276KZgshK091/XFbP8M/+1XTWURURERCTqRdMNOJUh2X/dVszywvmHF5eBf4o4A6Bx48YnpqamVuSyu4TJiSeeiI5d9GrQoAFUrMuLhMkRRxyh718U07GLenvMLDvg70znXGZFM61twWSF+Ts9EyA1NdVlZ2eXsIaIVLbU1NRwF0HKqVWrVqjdFAkPM1vlnKv0BrS2XeYuPPOYXMzywvlbq74oIiIiItGvtgWTn/qvxfWJbOu/FtenUkREREQC1LZgcq7/egYH1z0Jb8DyPGBxdRZKREREJFrV1GCyLt4TcloHzd+ANyxQK+DaoGV34I0v+TTeeJMiIiIiUoJougHnHH8CaO6/9gFm+e9/AMb571sCa4FNeIFjoGvwHqf4F2Cgn64X3hiU64BbK7ncIiIiIjVWNAWT3YGRQfOO8yfwAsdxlGwDkArcifcs7rOAXGA63tnJLZVQVhEREZFaIZqCyUn+VBo5gB1i+ZfAqIoVR0RERERqap9JEREREakGCiZFREREpNwUTIqIiIhIuSmYFBEREZFyUzApIiIiIuUWTXdzR5yVX2+j1YTXwl0MkRoh574h4S6CVAO1myKVKxLaTp2ZFBEREZFyUzApIiIiIuWmYFJEREREyk3BpIiIiIiUm4JJERERESk3BZOHYGZ1w10GERERkUhWY4NJM8sys0fN7H4z+8nMvjez680s3sweNrOtZvaFmV3qp29lZs7MLjazd83sZ2BMmKshIlIh8+fPp3fv3iQmJpKcnEzPnj1ZtWoVP/74IxdffDFHHnkk9evXp1OnTsycObNovaeeeorGjRuzZ8+eA/IbMWIEw4YNA+DLL79k+PDhNGrUiISEBI4//nj++c9/Vmv9RCT8amww6RsB7AB6AfcB04D/AuuAVOBJ4O9mlhKwzr3AI0BHP+0BzCzDzLLNLDs/b1tVll1EpEL279/P8OHD6du3LytWrGDJkiXccMMNxMbGsnv3bk444QReffVVVq9ezfXXX8+YMWOYM2cOABdeeCEFBQW8/PLLRflt27aNl156icsvvxyAa665hry8PObOncvq1auZNm0ahx9++EHlyMzMJDU1ldTUVNRuitQ85pwLdxmqhJllAfHOuT7+3wZsBhY554b58+oCu4BLgGxgIzDOOXd/abYRn9LWpYycVvmFF6mFyjLwbmpqKtnZ2VVYmprhp59+onHjxmRlZXHaaaeVmP43v/kNiYmJ/P3vfwdg7NixrF+/njfffBOARx99lDvuuIOvvvqKOnXq0LVrV84//3xuv/32UpcpPqUtajdFKk9Z2k4zW+acS63sMtT0M5MfF75xXtS8GVgZMG8fsAVoGrCO/kOJSI3QqFEj0tPTGTRoEEOGDOGBBx7giy++ACA/P5+7776brl270rhxYxITE3nxxReLlgNceeWVvP3223z11VcAzJgxg5EjR1KnjvfwtOuvv54//elP9OnTh9tuu41ly5ZVfyVFJOxqejC5L+hvV8y8wP2wq0pLJCJSjWbOnMmSJUvo168fr7zyCu3bt2f27NlMnTqV+++/n5tvvpk5c+bw0Ucfcc4557B3796idbt168YJJ5zArFmzWLVqFdnZ2YwePbpo+eWXX87GjRsZNWoU69at4+STT2bSpElhqKWIhJOezS0iUsN169aNbt26MX78eM4880yefPJJduzYwdlnn82ll14KgHOOdevWHdTn8corr2TKlCn88MMPnHLKKbRv3/6A5UceeSQZGRlkZGQwefJkpk+froBSpJap6WcmRURqrY0bNzJhwgQWLlzIpk2bmDt3Lh9//DEdO3akXbt2zJkzhwULFvDJJ58wduxY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VlbnBQsWvH7sscce/Ze//GXRyy+//Pjzzz+/HODee+99HGgckHxXCdmNBT4AzgDmnHXWWTOysrLqrlu3LuHVV18dCSxyzq2tkoqIiFRQWloa77//PmvXrmX79u2ceOKJpKWlMXfuXLKysujTpw9xcXGHzMPMAIiJicE5d8CyffsOuigjIlKsSHqc4gZgH9Ab+BzAzBoAnYENBQUFj//444925ZVXThowYMAd/vLzgP/Ur1//KOBu4J8h8l0L7MHrg/kZXgD5F+Bt4AJgx6BBg3DOdW7fvv0cIAOv76aISETq27cve/bsYcqUKfTt25fY2FjS0tK48soradasGYMHDwagQ4cOPP/88xQUFBSdnVywYAFxcXG0bt0agCZNmpCbm3tA/itWrKBVq1Yht926dWvq1q3L4sWLOe644wDYtWsXq1atKspTRGqXiDkz6V/SfgKYbGa/MrNOwAwgtnHjxkldunTpHRcX504//fTDzOw4MxsC3AWQn5+/G7j0qKOOqhci3x3AdOBeMxu1Zs2a6YsXL96TkpLyNrAjIOnjwC1AA+BfVVpZEZEKKOw3+cwzz9C/f38AevfuzVdffcXixYtJS0sD4JprruGbb77hmmuuYe3atbz22mtMmDCBsWPHkpCQAMCAAQN44403eOWVV/j000/5/e9/z5dfflncpklMTOTyyy9n/PjxvP3226xevZrRo0eTn59f5fUWkcgUMcGkbxwwF3jJf10FzD/qqKOaN2nShDvvvPNd59w5wBq8u7p/D7B9+/aVQML555/fsZh8JwKT4+Li7uzevfvxZ599tvv2228bAv39bd60fv3674C9wPN+ACoiErHS0tLYv39/UeBYr149evXqRXx8PD179gSgZcuWvPHGGyxfvpzu3bszevRoLr744gOG8hk9enTRdMopp5CUlMS5554bapNFpk6dSv/+/Tn33HPp378/nTt3pl+/fodcR0RqLgvuKxOh/owX9I0D7g+x/CHgWuAa4NFD5DMK72xnJt6wQUWt3zfffMPRRx/NsGHDLnrxxRefL02h4lPaupSR00pVAalcOfcNCXcRJIxSU1OLhsaR6BKf0ha1mxJMbXr1MLNlzrnUys43kvpMHkrh7X/FjSlROP/wEvJp6r9eDnwNDHn77bcXr1u3rv0rr7zyTI8ePY578cUX7wL+i3eW8iBmloHXr5K4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\n", + "text/plain": [ + "

" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#Plot the results: are there striking differences in language?\n", + "import numpy as np\n", + "import pylab\n", + "import matplotlib.pyplot as plt\n", + "\n", + "%matplotlib inline\n", + "def plotTwoLists (wf_ee, wf_bu, title):\n", + " f = plt.figure (figsize=(10, 6))\n", + " # this is painfully tedious....\n", + " f .suptitle (title, fontsize=20)\n", + " ax = f.add_subplot(111)\n", + " ax .spines ['top'] .set_color ('none')\n", + " ax .spines ['bottom'] .set_color ('none')\n", + " ax .spines ['left'] .set_color ('none')\n", + " ax .spines ['right'] .set_color ('none')\n", + " ax .tick_params (labelcolor='w', top='off', bottom='off', left='off', right='off', labelsize=20)\n", + "\n", + " # Create two subplots, this is the first one\n", + " ax1 = f .add_subplot (121)\n", + " plt .subplots_adjust (wspace=.5)\n", + "\n", + " pos = np .arange (len(wf_ee)) \n", + " ax1 .tick_params (axis='both', which='major', labelsize=14)\n", + " pylab .yticks (pos, [ x [0] for x in wf_ee ])\n", + " ax1 .barh (range(len(wf_ee)), [ x [1] for x in wf_ee ], align='center')\n", + "\n", + " ax2 = f .add_subplot (122)\n", + " ax2 .tick_params (axis='both', which='major', labelsize=14)\n", + " pos = np .arange (len(wf_bu)) \n", + " pylab .yticks (pos, [ x [0] for x in wf_bu ])\n", + " ax2 .barh (range (len(wf_bu)), [ x [1] for x in wf_bu ], align='center')\n", + "\n", + "plotTwoLists (wf_ee, wf_bu, 'Difference between Pride and Prejudice and Huck Finn')" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "and\t2836\n", + "of\t2676\n", + "to\t2646\n", + "a\t2217\n", + "in\t1422\n", + "his\t1205\n", + "he\t928\n", + "that\t920\n", + "was\t823\n", + "for\t798\n", + "with\t797\n", + "as\t672\n", + "I\t505\n", + "you\t497\n" + ] + } + ], + "source": [ + "#In case Project gutenberg is blocked you can download text to your laptop and copy to the docker container via scp\n", + "#Assuming the file name you copy is pg4680.txt here is how you change the script\n", + "# Please note the option errors='replace'\n", + "# without it python invariably runs into unicode errors\n", + "f = open ('pg4680.txt', 'r', encoding=\"ascii\", errors='replace')\n", + " \n", + "# What comes back includes headers and other HTTP stuff, get just the body of the response\n", + "t = f.read()\n", + "\n", + "# obtain words by splitting a string using as separator one or more (+) space/like characters (\\s) \n", + "wds = re.split('\\s+',t)\n", + "\n", + "# now populate a dictionary (wf)\n", + "wf = {}\n", + "for w in wds:\n", + " if w in wf: wf [w] = wf [w] + 1\n", + " else: wf [w] = 1\n", + "\n", + "# dictionaries can not be sorted, so lets get a sorted *list* \n", + "wfs = sorted (wf .items(), key = operator .itemgetter (1), reverse=True) \n", + "\n", + "# lets just have no more than 15 words \n", + "ml = min(len(wfs),15)\n", + "for i in range(1,ml,1):\n", + " print (wfs[i][0]+\"\\t\"+str(wfs[i][1])) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Assignment 1\n", + "\n", + "1. Compare word frequencies between two works of a single author.\n", + "1. Compare word frequencies between works of two authors.\n", + "1. Are there some words preferred by one author but used less frequently by another author?\n", + "\n", + "Extra credit\n", + "\n", + "1. The frequency of a specific word, e.g., \"would\" should follow a binomial distribution (each regular word in a document is a trial and with probability p that word is \"would\". The estimate for p is N(\"would\")/N(regular word)). Do these binomial distributions for your chosen word differ significantly between books of the same author or between authors? \n", + "\n", + "Project Gutenberg is a good source of for fiction and non-fiction.\n", + "\n", + "E.g below are two most popular books from Project Gutenberg:\n", + "- Pride and Prejudice at http://www.gutenberg.org/ebooks/1342.txt.utf-8\n", + "- Adventures of Huckleberry Finn at http://www.gutenberg.org/ebooks/76.txt.utf-8" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "import requests, re, nltk\n", + "\n", + "yellow_wallpaper = \"\"\n", + "yellow_wallpaper_in = requests .get('https://www.gutenberg.org/files/1952/1952-h/1952-h.htm')\n", + "ywt = cleanHtml(yellow_wallpaper_in.text).lower()\n", + "yellow_wallpaper = yellow_wallpaper + ywt\n", + " \n", + "herland = \"\"\n", + "herland_in = requests.get('https://www.gutenberg.org/files/32/32-h/32-h.htm')\n", + "ht = cleanHtml(herland_in.text).lower()\n", + "herland = herland + ht\n", + "\n", + "sherlock = \"\"\n", + "sherlock_in = requests.get('https://www.gutenberg.org/files/1661/1661-h/1661-h.htm')\n", + "st = cleanHtml(sherlock_in.text).lower()\n", + "sherlock = sherlock + st" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The Yellow Wallpaper: \n", + "\n", + "and\t349\n", + "i\t293\n", + "of\t231\n", + "to\t222\n", + "a\t197\n", + "it\t177\n", + "is\t154\n", + "in\t152\n", + "that\t123\n", + "you\t110\n", + "or\t89\n", + "project\t84\n", + "for\t78\n", + "this\t76\n", + "\n", + "\n", + "Herland: \n", + "\n", + "of\t1822\n", + "and\t1780\n", + "to\t1512\n", + "a\t1190\n", + "we\t941\n", + "in\t803\n", + "that\t714\n", + "was\t708\n", + "i\t680\n", + "it\t640\n", + "they\t598\n", + "as\t597\n", + "had\t526\n", + "with\t459\n" + ] + } + ], + "source": [ + "yellow_wallpaper = cleanWord(yellow_wallpaper)\n", + "herland = cleanWord(herland)\n", + "sherlock = cleanWord(sherlock)\n", + "\n", + "yellow_wallpaper_wds = re.split('\\s+',yellow_wallpaper)\n", + "herland_wds = re.split('\\s+', herland)\n", + "sherlock_wds = re.split('\\s+', sherlock)\n", + "\n", + "# now populate a dictionary (wf)\n", + "yellow_wallpaper_wf = {}\n", + "for w in yellow_wallpaper_wds:\n", + " if w in yellow_wallpaper_wf: yellow_wallpaper_wf [w] = yellow_wallpaper_wf [w] + 1\n", + " else: yellow_wallpaper_wf [w] = 1\n", + "herland_wf = {}\n", + "for w in herland_wds:\n", + " if w in herland_wf: herland_wf [w] = herland_wf [w] + 1\n", + " else: herland_wf [w] = 1\n", + "sherlock_wf = {}\n", + "for w in sherlock_wds:\n", + " if w in sherlock_wf: sherlock_wf [w] = sherlock_wf [w] + 1\n", + " else: sherlock_wf [w] = 1 \n", + " \n", + "# dictionaries can not be sorted, so lets get a sorted *list* \n", + "yellow_wallpaper_wfs = sorted (yellow_wallpaper_wf .items(), key = operator .itemgetter (1), reverse=True) \n", + "herland_wfs = sorted (herland_wf .items(), key = operator .itemgetter (1), reverse=True) \n", + "sherlock_wfs = sorted (sherlock_wf .items(), key = operator .itemgetter (1), reverse=True) \n", + "\n", + "# lets just have no more than 15 words \n", + "yellow_wallpaper_ml = min(len(yellow_wallpaper_wfs),15)\n", + "herland_ml = min(len(herland_wfs),15)\n", + "sherlock_ml = min(len(sherlock_wfs),15)\n", + "\n", + "# Print\n", + "print('The Yellow Wallpaper: \\n')\n", + "for i in range(1,yellow_wallpaper_ml,1):\n", + " print (yellow_wallpaper_wfs[i][0]+\"\\t\"+str(yellow_wallpaper_wfs[i][1])) \n", + "\n", + "print('\\n')\n", + " \n", + "print('Herland: \\n')\n", + "for i in range(1,herland_ml,1):\n", + " print (herland_wfs[i][0]+\"\\t\"+str(herland_wfs[i][1])) \n", + " \n", + "#print('\\n')\n", + "\n", + "#print('The Adventures of Sherlock Holmes: \\n')\n", + "#for i in range(1,sherlock_ml,1):\n", + "# print (sherlock_wfs[i][0]+\"\\t\"+str(sherlock_wfs[i][1])) " + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Charlotte Perkins Gilman's texts: \n", + "\n", + "and\t2129\n", + "of\t2053\n", + "to\t1734\n", + "a\t1387\n", + "i\t973\n", + "we\t968\n", + "in\t955\n", + "that\t837\n", + "it\t817\n", + "was\t747\n", + "as\t656\n", + "they\t613\n", + "had\t548\n", + "with\t534\n", + "\n", + "\n", + "The Adventures of Sherlock Holmes: \n", + "\n", + "and\t2935\n", + "of\t2767\n", + "to\t2735\n", + "a\t2649\n", + "i\t2598\n", + "in\t1789\n", + "that\t1653\n", + "it\t1470\n", + "he\t1416\n", + "was\t1396\n", + "you\t1312\n", + "his\t1150\n", + "is\t1116\n", + "my\t955\n" + ] + } + ], + "source": [ + "cpgt_wds = yellow_wallpaper_wds + herland_wds\n", + "\n", + "cpgt_wf = {}\n", + "for w in cpgt_wds:\n", + " if w in cpgt_wf: cpgt_wf [w] = cpgt_wf [w] + 1\n", + " else: cpgt_wf [w] = 1\n", + "\n", + "cpgt_wfs = sorted(cpgt_wf.items(), key = operator .itemgetter (1), reverse=True) \n", + "\n", + "cpgt_ml = min(len(cpgt),15)\n", + "\n", + "print('Charlotte Perkins Gilman\\'s texts: \\n')\n", + "\n", + "for i in range(1, cpgt_ml, 1):\n", + " print(cpgt_wfs[i][0]+\"\\t\"+str(cpgt_wfs[i][1]))\n", + "\n", + "print(\"\\n\")\n", + "\n", + "print('The Adventures of Sherlock Holmes: \\n')\n", + "for i in range(1,sherlock_ml,1):\n", + " print (sherlock_wfs[i][0]+\"\\t\"+str(sherlock_wfs[i][1])) " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "All three texts use the basic words such as and, to, of, I, and a at pretty similar rates. The two texts of The Yellow Wallpaper and Herland by Charlotte Perkins Gilman both use pretty much the same top 15 words, except that Herland uses more plural words, while The Yellow Wallpaper uses more singular ones. The Adventures of Sherlock Holmes by Arthur Conan Doyle uses male pronouns very frequently compared to the two books by Charlotte Perkins Gilman. A even further analysis could show more differences between the the two works of the same author as well as the works of the two different authors.\n" + ] + } + ], + "source": [ + "print('All three texts use the basic words such as and, to, of, I, and a at pretty similar rates. The two texts of The Yellow Wallpaper and Herland by Charlotte Perkins Gilman both use pretty much the same top 15 words, except that Herland uses more plural words, while The Yellow Wallpaper uses more singular ones. The Adventures of Sherlock Holmes by Arthur Conan Doyle uses male pronouns very frequently compared to the two books by Charlotte Perkins Gilman. An even further analysis could show more differences between the the two works of the same author as well as the works of the two different authors.')" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Further Analysis Update: \n", + "\n", + "Charlotte Perkins Gilman and Arthur Conan Doyle have the same top 5 words in the texts that I have analyzed, \n", + "and among the top 15 words, 9 words match between them. Doyle also uses more male pronouns, while Gilman \n", + "uses plural pronouns more often. Within Gilman's writing, the top 5 words do not match, likely due to there \n", + "being a much smaller amount of words in The Yellow Wallpaper. Of the top 15, though, only 8 words match \n", + "between the two texts. This is very interesting as more words matched between the different authors than for \n", + "the same author. I again believe this is due to the analysis between authors having a larger sample size in \n", + "terms of word count compared to the analysis of Gilman's two texts.\n" + ] + } + ], + "source": [ + "print(\"Improved Analysis Update: \\n\") #Removed bad characters and did a combined analysis between the authors\n", + "print(\"Charlotte Perkins Gilman and Arthur Conan Doyle have the same top 5 words in the texts that I have analyzed, \")\n", + "print(\"and among the top 15 words, 9 words match between them. Doyle also uses more male pronouns, while Gilman \")\n", + "print(\"uses plural pronouns more often. Within Gilman's writing, the top 5 words do not match, likely due to there \")\n", + "print(\"being a much smaller amount of words in The Yellow Wallpaper. Of the top 15, though, only 8 words match \")\n", + "print(\"between the two texts. This is very interesting as more words matched between the different authors than for \")\n", + "print(\"the same author. I again believe this is due to the analysis between authors having a larger sample size in \")\n", + "print(\"terms of word count compared to the analysis of Gilman's two texts.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Add automatic comparison of top 30 word vectors to enhance quality of analysis" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +}