diff --git a/zwilli13.ipynb b/zwilli13.ipynb new file mode 100644 index 0000000..aae6cff --- /dev/null +++ b/zwilli13.ipynb @@ -0,0 +1,380 @@ +{ + "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": 1, + "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": 2, + "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": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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iIiUm4JJERERESk3BZOHYGZ1w10GERERkUhWY4NJM8sys0fN7H4z+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": 4, + "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": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import requests, re, nltk\n", + "#In case your text is not on Project Gutenberg but at some other URL\n", + "#http://www.fullbooks.com/Our-World-or-The-Slaveholders-Daughter2.html\n", + "# that contains 12 parts\n", + "t = \"\"\n", + "for i in range(2,13):\n", + " r = requests .get('http://www.fullbooks.com/Our-World-or-The-Slaveholders-Daughter' + str(i) + '.html')\n", + " t = t + r.text" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1323653" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(t)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "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 +}