{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Natural Language Visualization With Scattertext\n", "## Jason S. Kessler @jasonkessler\n", "### Global AI Conference 2018, Seattle, WA. April 27, 2018.\n", "\n", "The Github repository for talk is at [https://github.com/JasonKessler/GlobalAI2018](https://github.com/JasonKessler/GlobalAI2018). \n", "\n", "Visualizations were made using [Scattertext](https://github.com/JasonKessler/scattertext).\n", "\n", "Please cite as: \n", "Jason S. Kessler. Scattertext: a Browser-Based Tool for Visualizing how Corpora Differ. ACL System Demonstrations. 2017." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "import scattertext as st\n", "import spacy\n", "from IPython.display import IFrame\n", "from IPython.core.display import display, HTML\n", "display(HTML(\"\"))\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "assert st.__version__ >= '0.0.2.25'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The data\n", " \n", "Dataset consists of reviews of movies and plot descriptions. Plot descriptions are guaranteed to be from a movie which was reviewed. \n", "\n", "Data set is from http://www.cs.cornell.edu/people/pabo/movie-review-data/\n", "\n", "References:\n", "* Bo Pang, Lillian Lee, and Shivakumar Vaithyanathan, Thumbs up? Sentiment Classification using Machine Learning Techniques, Proceedings of EMNLP 2002.\n", "\n", "* Bo Pang and Lillian Lee, A Sentimental Education: Sentiment Analysis Using Subjectivity Summarization Based on Minimum Cuts, Proceedings of ACL 2004." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Positive 2455\n", "Negative 2411\n", "Plot 156\n", "Name: category_name, dtype: int64\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
textmovie_namecategory_name
0A senior at an elite college (Katie Holmes), a...abandonPlot
1Will Lightman is a hip Londoner who one day re...about_a_boyPlot
2Warren Schmidt (Nicholson) is forced to deal w...about_schmidtPlot
3An account of screenwriter Charlie Kaufman's (...adaptationPlot
4Ali G unwittingly becomes a pawn in the evil C...ali_g_indahousePlot
\n", "
" ], "text/plain": [ " text movie_name \\\n", "0 A senior at an elite college (Katie Holmes), a... abandon \n", "1 Will Lightman is a hip Londoner who one day re... about_a_boy \n", "2 Warren Schmidt (Nicholson) is forced to deal w... about_schmidt \n", "3 An account of screenwriter Charlie Kaufman's (... adaptation \n", "4 Ali G unwittingly becomes a pawn in the evil C... ali_g_indahouse \n", "\n", " category_name \n", "0 Plot \n", "1 Plot \n", "2 Plot \n", "3 Plot \n", "4 Plot " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rdf = st.SampleCorpora.RottenTomatoes.get_data()\n", "rdf['category_name'] = rdf['category'].apply(lambda x: {'plot': 'Plot', 'rotten': 'Negative', 'fresh': 'Positive'}[x])\n", "print(rdf.category_name.value_counts())\n", "rdf[['text', 'movie_name', 'category_name']].head()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "corpus = (st.CorpusFromPandas(rdf, \n", " category_col='category_name', \n", " text_col='text',\n", " nlp = st.whitespace_nlp_with_sentences)\n", " .build())\n", "corpus.get_term_freq_df().to_csv('term_freqs.csv')\n", "unigram_corpus = corpus.get_unigram_corpus()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Let's visualize the corpus using Scattertext\n", "\n", "The x-axis indicates the rank of a word or bigram in the set of positive reviews, and the y-axis negative reviews.\n", "\n", "Ranks are determined using \"dense\" ranking, meaning the most frequent terms, regardless of ties, are given rank 1, the next most frequent terms, regardless of ties, are given rank 2, etc.\n", "\n", "It appears that terms more associated with a class are a further distance from the diagonal line between the lower-left and upper-right corners. Terms are colored according to this distance. We'll return to this in a bit.\n", "\n", "Scattertext selectively labels points in such a way as to prevent labels from overlapping other elements of the graph. Mouse-over points and term labels for a preview, and click for a key-word in context view.\n", "\n", "References:\n", "* Jason S. Kessler. Scattertext: a Browser-Based Tool for Visualizing how Corpora Differ. ACL System Demonstrations. 2017." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "html = st.produce_scattertext_explorer(\n", " corpus,\n", " category='Positive',\n", " not_categories=['Negative'],\n", " sort_by_dist=False,\n", " metadata=rdf['movie_name'],\n", " term_scorer=st.RankDifference(),\n", " transform=st.Scalers.percentile_dense\n", ")\n", "file_name = 'rotten_fresh_stdense.html'\n", "open(file_name, 'wb').write(html.encode('utf-8'))\n", "IFrame(src=file_name, width = 1300, height=700)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### We view can see more terms through breaking ties in ranking alphabetically.\n", "Lower frequency terms are more prominent in this view, and more terms can be labeled." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "html = st.produce_scattertext_explorer(\n", " corpus,\n", " category='Positive',\n", " not_categories=['Negative'],\n", " sort_by_dist=False,\n", " metadata=rdf['movie_name'],\n", " term_scorer=st.RankDifference(),\n", ")\n", "file_name = 'rotten_fresh_st.html'\n", "open(file_name, 'wb').write(html.encode('utf-8'))\n", "IFrame(src=file_name, width = 1300, height=700)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Naive approach 1\n", "### tf.idf difference (not recommended)\n", "$$ \\mbox{Term Frquency}(\\mbox{term}, \\mbox{category}) = \\#(\\mbox{term}\\in\\mbox{category}) $$\n", "\n", "$$ \\mbox{Inverse Document Frquency}(\\mbox{term}) = \\log \\frac{\\mbox{# of categories}}{\\mbox{# of categories containing term}} $$\n", "\n", "$$ \\mbox{tfidf}(\\mbox{term}, \\mbox{category}) = \\mbox{Term Frquency}(\\mbox{term}, \\mbox{category}) \\times \\mbox{Inverse Document Frquency}(\\mbox{term}) $$\n", "\n", "$$ \\mbox{tfidf-difference}(\\mbox{term}, \\mbox{category}) = \\mbox{tf.idf}(\\mbox{term}, \\mbox{category}_a) - \\mbox{tf.idf}(\\mbox{term}, \\mbox{category}_b) $$\n", "\n", "Tf.idf ignores terms used in each category. Since we only consider three categories (positive, negative and plot descriptions), a large number of terms have zero (log 1) scores. The problem is Tf.idf doesn't weight how often a term is used in another category. This causes eccentric, brittle, low-frequency terms to be favored.\n", "\n", "This formulation does take into account data from a background corpus.\n", "\n", "$$ \\#(\\mbox{term}, \\mbox{category}) \\times \\log \\frac{\\mbox{# of categories}}{\\mbox{# of categories containing term}} $$\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Scaled F-Score\n", "### Associatied terms have a *relatively* high category-specific precision and category-specific term frequency (i.e., % of terms in category are term)\n", "### Take the harmonic mean of precision and frequency (both have to be high)\n", "### We will make two adjustments to this method in order to come up with the final formulation of Scaled F-Score\n", "\n", "Given a word $w_i \\in W$ and a category $c_j \\in C$, define the precision of the word $w_i$ wrt to a category as:\n", "$$ \\mbox{prec}(i,j) = \\frac{\\#(w_i, c_j)}{\\sum_{c \\in C} \\#(w_i, c)}. $$\n", "\n", "The function $\\#(w_i, c_j)$ represents either the number of times $w_i$ occurs in a document labeled with the category $c_j$ or the number of documents labeled $c_j$ which contain $w_i$.\n", "\n", "Similarly, define the frequency a word occurs in the category as:\n", "\n", "$$ \\mbox{freq}(i, j) = \\frac{\\#(w_i, c_j)}{\\sum_{w \\in W} \\#(w, c_j)}. $$\n", "\n", "The harmonic mean of these two values of these two values is defined as:\n", "\n", "$$ \\mathcal{H}_\\beta(i,j) = (1 + \\beta^2) \\frac{\\mbox{prec}(i,j) \\cdot \\mbox{freq}(i,j)}{\\beta^2 \\cdot \\mbox{prec}(i,j) + \\mbox{freq}(i,j)}. $$\n", "\n", "$\\beta \\in \\mathcal{R}^+$ is a scaling factor where frequency is favored if $\\beta < 1$, precision if $\\beta > 1$, and both are equally weighted if $\\beta = 1$. F-Score is equivalent to the harmonic mean where $\\beta = 1$." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Positive freqNegative freqpos_precisionpos_freq_pctpos_hmean
term
the234622880.5062580.0480370.087748
a177516130.5239080.0363450.067975
and163711790.5813210.0335200.063385
of148012350.5451200.0303050.057418
to94210100.4825820.0192890.037095
it8268010.5076830.0169130.032736
is8187260.5297930.0167500.032473
s8087490.5189470.0165450.032067
in6766220.5208010.0138420.026967
that6176020.5061530.0126340.024652
\n", "
" ], "text/plain": [ " Positive freq Negative freq pos_precision pos_freq_pct pos_hmean\n", "term \n", "the 2346 2288 0.506258 0.048037 0.087748\n", "a 1775 1613 0.523908 0.036345 0.067975\n", "and 1637 1179 0.581321 0.033520 0.063385\n", "of 1480 1235 0.545120 0.030305 0.057418\n", "to 942 1010 0.482582 0.019289 0.037095\n", "it 826 801 0.507683 0.016913 0.032736\n", "is 818 726 0.529793 0.016750 0.032473\n", "s 808 749 0.518947 0.016545 0.032067\n", "in 676 622 0.520801 0.013842 0.026967\n", "that 617 602 0.506153 0.012634 0.024652" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy.stats import hmean\n", "\n", "term_freq_df = corpus.get_unigram_corpus().get_term_freq_df()[['Positive freq', 'Negative freq']]\n", "term_freq_df = term_freq_df[term_freq_df.sum(axis=1) > 0]\n", "\n", "term_freq_df['pos_precision'] = (term_freq_df['Positive freq'] * 1./\n", " (term_freq_df['Positive freq'] + term_freq_df['Negative freq']))\n", "\n", "term_freq_df['pos_freq_pct'] = (term_freq_df['Positive freq'] * 1.\n", " /term_freq_df['Positive freq'].sum())\n", "\n", "term_freq_df['pos_hmean'] = (term_freq_df\n", " .apply(lambda x: (hmean([x['pos_precision'], x['pos_freq_pct']])\n", " if x['pos_precision'] > 0 and x['pos_freq_pct'] > 0 \n", " else 0), axis=1))\n", "term_freq_df.sort_values(by='pos_hmean', ascending=False).iloc[:10]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "count 12032.000000\n", "mean 0.000083\n", "std 0.000826\n", "min 0.000000\n", "25% 0.000000\n", "50% 0.000020\n", "75% 0.000041\n", "max 0.048037\n", "Name: pos_freq_pct, dtype: float64" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "term_freq_df.pos_freq_pct.describe()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "count 12032.000000\n", "mean 0.506651\n", "std 0.418623\n", "min 0.000000\n", "25% 0.000000\n", "50% 0.500000\n", "75% 1.000000\n", "max 1.000000\n", "Name: pos_precision, dtype: float64" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "term_freq_df.pos_precision.describe()" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# The plot looks a bit better if you Anscombe transform the data, but it doesn't make a difference in SFS\n", "#freq = 2*(np.sqrt(term_freq_df.pos_freq_pct.values)+3/8)\n", "\n", "freq = term_freq_df.pos_freq_pct.values\n", "prec = term_freq_df.pos_precision.values\n", "html = st.produce_scattertext_explorer(\n", " corpus.remove_terms(set(corpus.get_terms()) - set(term_freq_df.index)),\n", " category='Positive',\n", " not_category_name='Negative',\n", " not_categories=['Negative'],\n", " \n", " x_label = 'Portion of words used in positive reviews',\n", " original_x = freq,\n", " x_coords = (freq - freq.min())/freq.max(),\n", " x_axis_values = [int(freq.min()*1000)/1000., \n", " int(freq.max() * 1000)/1000.],\n", " \n", " y_label = 'Portion of documents containing word that are positive', \n", " original_y = prec,\n", " y_coords = (prec - prec.min())/prec.max(),\n", " y_axis_values = [int(prec.min() * 1000)/1000., \n", " int((prec.max()/2.)*1000)/1000., \n", " int(prec.max() * 1000)/1000.],\n", " scores = term_freq_df.pos_hmean.values,\n", " \n", " sort_by_dist=False,\n", " show_characteristic=False\n", ")\n", "file_name = 'not_normed_freq_prec.html'\n", "open(file_name, 'wb').write(html.encode('utf-8'))\n", "IFrame(src=file_name, width = 1300, height=700)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA5gAAAJfCAYAAAAaUnkFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd8TfcbwPHPzR6ChFix17EjJGbEqL2bELNVI3ZVtVWKX6tqtKU2tfdoqd0giJXaIrZjr9gjJEFEcn9/3NxLZEe4F8/79fK6nPM95zznfG/kPve7NFqtFiGEEEIIIYQQ4k2ZGTsAIYQQQgghhBAfBkkwhRBCCCGEEEJkCEkwhRBCCCGEEEJkCEkwhRBCCCGEEEJkCEkwhRBCCCGEEEJkCEkwhRBCCCGEEEJkCAtjB/C+uXs3PEPWdXF0tOPhwycZcSrxBqQeTIMp14NTxTIAPDh8wsiRvH2mXA8fE6kH0yF1YRqkHkyD1INpMJV6cHZ20CS1T1owjcTCwtzYIQikHkyF1INpkHowDVIPpkPqwjRIPZgGqQfT8D7UgySYQgghhBBCCCEyhCSYQgghhBBCCCEyhCSYQgghhBBCCCEyhCSYQgghhBBCCCEyhCSYQgghhBBCCCEyhCSYQgghhBBCCCEyhCSYQgghhBBCCCEyhCSYQgghhBBCCCEyhCSYQgghhBBCCCEyhCSYQgghhBBCCCEyhCSYQgghhBBCCCEyhCSYQgghhBBCCCEyhCSYQgghhBBCCCEyhCSYQgghhBBCCCEyhCSYQgghhBBCCCEyhCSYQgghhBBCCCEyhCSYQgghxEduzpwZeHq64++/3tihJGrx4vl4ezehdu2qtGzZiGfPnhk7JPGKa9eu8tVXvahXrwb169dk4cK5iZYbOfInw/vM3389np7ujBz5EwA3b97A09OdwYO/eYeRv7mrV68QGLg1zcfpf+bmzJlBcPAhPD3d6du3+1uIUIh3TxJMIYQQQpis/fv38uefU4iNjaV167Y0bdoCGxsbY4clXvHLLz9y+PBBPDyq4OPji6urm7FDeifOnTtLp05tOX78qLFDEcKkWBg7ACGEEEKIpJw9ewaArl170KxZSyNHIxJz9uwZcuTIyahRvydbzsbGFgBraxs0Gk28be+j8PDHREdHp+tYW1vdfdvY2Bj+rn8V4n0nCaYQQgghTNbz588ByJIlq5EjEUmJjo4mc+YsKZYrVKgwAAUKFMTc3Dzeto/Nq8+iYMHCaDSaj/ZZiA+PJJhCCCGESJOIiAgWLpzDjh2B3LlzGweHzLi7V6JzZz/y5y8Qr+yTJ0+YP382gYFbePDgAQULFqJLl+4EBe1kw4a1BAUdSvI6np7uhr//8MO3ca8/kitXbvr168k33wwiJCSY3bt34uCQiREjfqVcufJER0ezfPliNm/258aNUOzs7PHwqEy3bj1xcckb7xpRUVEsWDCHLVs2cf/+fYoUKUrv3v3w91/Pxo0bDPH5+69n1Kjh9Os3AF/f9vHO0bdvd0JCgtm4cTsODg6G7YcPH2TRonmcPn2SmJgYihQpRtu2Hahdu26C+2zUqCnNm3/KjBlTUdXTmJtbUKlSFXr1+pLcufPEK3/+/DkWLZrLkSPBPH36hHz58uPt7UuTJs3RaDR89VUvDh8+yPLlq8mbN1+8Yzdu3MDIkT8xcOAQmjf/NMln//z5c5YvX0xAwEZCQ69ja2tHuXKufPFFN0qUKAXoxhHOmzcrLqazeHq6kytXblauTHwsb9GixTA3Nyd//gKYm5tjZWVN4cJFEpTbuTOQOXNmcP36NXLkyIWvbyuaN/fFwiL+x9br168xd+5MDh7cT0REOHnyuNCwYRPatfssQdljx0JYvnwJJ08e49GjR9jY2FKiREk+/7wLFSq8fJ8lVZc3b96gdevm1KhRk9Gjx8W79xUrlrFixTImTfqTX3/9hXv37rJ+fQB2dvbxYpg3bxZz5sxg/PgpFC1aHICCBQtja2uLi0teChVK+CyEeB/JGEwhhBBCpNqjR2F0796JpUsX4ejohI+PL2XKlGXbtgD8/D7n5MkThrLR0dH079+bpUsX4uzsjI+PL5kyZWLw4G84fPhgitfq3NmP8uUrAPDJJ/Xo3NmPYsWKG/bPmzeLM2dO0aqVL8WLl0BRSvDixQu+/bYfM2ZMxdbWDm9vXypXrsrOnYH4+XXi4sXzhuNjYmIYMKAvCxfOJUuWrHh7t8bGxoZvvvmSc+fOvtFzWr9+Df379+bChfPUqVOfFi28efjwAcOGDUp0EhxVPU2/fj0xNzfn009bUbRoMQIDt/DVV70MrbigS1p79PiCnTu34+rqRosWPkRFRTFmzAjmzp0JQMOGTQDYsmVTgusEBGzEysqaOnXqJRl7VFQU/fv3ZubMaZiZmdGyZSs8PCpx4MA+evbswu7dOwBwc6tI585+ADg5ZaNzZz98fdsled5y5cqzc+d+rKysMDc3JzDwP0P96p04cZxhwwbh4pKXli19MDPT8McffzBixLDXntcZunX7jO3bt1Khgju+vu3JnDkzM2ZM5fvvBxATE2Mou3v3Dr78sgcnTx6nRo3a+Pq2p2zZchw+fJCvv+7DuXNqkjEnxc2tIo0aNQWgVKkydO7sR+7ceWjQoDFRUVHs3Lk9wTEBARtxds5BxYqVcHbOQVDQIcMXAMuXrzacT4j3nUm0YCqKYgF8CfgBhYCbwDxgjKqqaercriiKOfAfUFlVVU0i++2AwUA7wAW4BEwFpqmqqn2T+xDvjlarJTj4EBcvXuDu3bvcu3eXu3fvcPfuHe7du8fdu3d4+vQpNWrUpEmTZtStWz9V3XeEEEIkb9q0SVy9eoVOnbri59fLsH3v3iAGDvyaESP+x5IlKzA3N2flyr84deoEPj6+9O//nWHc3dSpE1m2bFGK1+ratQdz5swgJCSYTz5pgJdXLQCCg3Wtik+eRDJv3hKyZctuOGbp0oUcPnyQ9u0/p3fvfobtrVu3pWfPLowe/TOzZi0EdEng0aNHaNSoKYMH/w8zM9337hMnjmPFimXpfkZ37txm/PjfKFCgIFOnzjJ07+3evTf9+/dm9uw/8fT0onDhooZjLl68QO/e/Wjf/nNA93vum2++5MCBfQQHH6JKlWrExMQwZswItFqYMmUmZcqUA8DPrxfdu3/BwoVz8fZuTc2adfjjj1/ZunWzIQEEuH//HsHBh/Dyqk2mTJmSjH/ZskUcOxZC48bNGDhwiKE1UFXP0Lt3V0aOHM4//7hToYLuz7x5s3ByykbXrj3S/cz0Hj58wFdffUvr1m0B6NGjD0OGfMu2bVto2rQFHh5V0Gq1jBz5I8+fRzN9+lxKlChpOH7y5D/466+lrF27Cm/v1gBMnz4Ze/tMzJu3BCenbIayS5YsYPr0yQQGbqVYMSVNcepbPTdu3EDp0mUN996gQWPmzZvF1q0B8RLG06dPcu3aVdq3/8zwPhPiQ2USCSa6BK87EASsA6oDPwOuQKs0nqs/UDmxHXHJ5wqgMeAPrAQaAVPQJbbfpiN28Q5ptVoCA7cwduyvSX77bWlph51dDrRaC9avX8P69WuwtLTEy6sWjRs3o2HDJjg7O7/jyIUQ7yP7n4ZivX7Nu72omQan2NR/3xnVrCWRP/3yFgN6KTo6mq1bN5MrV+4EyUTVqp7UrFmHHTu2cfToESpUcGfTpg3Y2trh59fbkFyCrmVyw4a1hIc/fqN4ypZ1jZdcAmzYsJZMmRzo3r13vO0lSpSiTp16BARs5OLFCxQuXIRt2wLQaDT07Nk33of+nj37sHHjeiIiItIV1+bNG3n+/Dldu/aIN3bU2tqGLl168PXXfdi48V/69PnqlX3WtG79svVPo9FQpUo1DhzYx61bNwA4efI4N2/eoFmzTw3Jpf7Yvn37c+rUCaKinuPo6ISXV202b/bn7NkzFC9eAoCtWzcTExNDgwaNk43f3389NjY29O//bbyupopSAm9vX5YtW8TOndtp3LhZup5Pclxc8hoSQ9292fD111/Tpk0bAgI24eFRhZMnT3Dx4gW8vVvHSy4BunXrxapVK/D3X4+3d2tiY2Pp0aMvVlaW8ZJL0LVCgi6pzcj4y5Urz6FD+3n48CGOjo6A7j0B0KBBkwy7lhCmyugJpqIo1dAllysBX1VVtYqiaID5wOeKojRVVXVDKs9VFBiRTJE26JLLsaqqfhd3zDBgEzBAUZQFqqoeT//diLdFq9Wydetmxo79lSNHDgNQtGhzChWqh51dTuztc2Bn54ydXU6srDIZjrl37xTnzq3h/Pl1bNu2hW3btvDdd/2pVKkKbdq0p1+/XsldVgghxCuuXr1CVFQU5cqVT7QVply58uzYsY3z589RunRZLlw4j6KUTNBaZmdnR9GixQz/n6fX62MTnzx5wtWrV8iWLRsLFsxJUP7+/fuAbrxg4cJFuHjxPDly5EyQpFpb21CqVBkOHNiXrrhU9TSg68568eKFePuePn0KkKBbZq5cubG0tIy3zd5e99yeP4+Oi/scAGXKlE1wTQ+Pynh4vPx+vWHDJmze7M+WLZsNCWZAwCayZs1KlSrVkoz9yZNIbtwIpWxZ1wRjCAHKlXNl2bJFnD//Zl2Ik1K6dFnDBEAvt5XGzMzMcE398w0NDWXOnBkJzmFnZ8f582fRarWYmZlRs2ZtAG7dusnFixcIDb3O5csXDS3hsbGxGXoPDRs24ejRIwQGbsHHx5eYmBgCA7dQtGhxihQpmvIJhHjPGT3BBPrEvQ7Xd1GNSzIHA58B3YAUE8y4pHQ2cAOIAYonUqwP8AIYpd+gqmq0oihDgT1AV3QtoMJEaLVaNm/eyLhxv3L06BEAihX7lKpVB5MjR7lkj9VoNDg7l8bZuTTVqg0hLOwS58+v49y5Nezfv5d9+/awefMGxo6dQo4cOd7F7Qgh3jORP/3yzloH9ZydHXhwN/ydXjO1IiN1LXr6xOd12bPreodERT3j8eNHAGTLli3Zsm/C2jr+epj6+O7fv2+YgCUx+tgiIiJwdEw8vjeZtTYiQld/a9b8k0wM8VtvLS2tEpR52eqra9HWt/ja2ydM/F5XsaIHOXLkZNu2AHr37sfVq1dQ1dP4+CScLOdVkZGRAEl2odXX27Nnz1KMIT0cHZ0SbLO0tMTKysqQnOuf7/79e9i/f0+S53r69Al2dvZcuHCeCRN+N3yhYWFhQcGChSlRohTXrl1Fq83YEVK1a9dl/Pjf2bp1Mz4+vhw8uJ8HD+7Trt1nGXodIUyVKSSYXsA9VVVPvLpRVdUbiqKcBWqm8jw94srWAca/vlNRFGugEhCiqurD13YfAJ6k4VriHdi5czvDhw/jxIljaDQaFKUVVaoMxtm5dLrOlzVrIdzdv8Ld/SvCw6+zeXMvNm3axKFDVZky5c9kJzwQQgiBoUXr3r07ie7XJ0CZM2fBzs4OeJmwvC6p7W/C1lZ3TVdXN6ZOTTrB1HNwyMz9+/cS3RcWFv+jgj7ZS6y1KyoqfrKlj+Ovv9YkmLX2TejP++TJkwT7Xrx4gVarNbSCmpmZUb9+IxYvns+JE8c4dOgA8HICoKTo6+3u3buJ7g8P1yV3b2vZGH3y+Po1nz17hoNDZuDlcxg0aBhNm7ZI9nxPnkTy9dd9iIiIoE+f/nh4VKZAgYJYWlpy8uSJBBMh6etZq41fz2lJqDNlykSNGjUJDNzC3bt3CAzcgrm5OfXrN0z1OYR4nxl1lHFc0pcXuJBEkctAVkVRkv2aU1GUfMBvwBxVVRNO26VTAF1CneBaqqrGANdIvNVTGMH8+XNo0+ZTTp48TokSvnTqFEyzZovTnVy+zsEhLz4+a2nQYDwPHz6ibVsfhg0bRFRUVIacXwghPkT58xfAysqa06dPxZvZVE/f06RQocLY22cib978nD9/NkHZmJgYVPVUhseXKVMmcubMxaVLFxMkfaCbkGXOnBncvKkb01iiREnCwx9z9erleOWio6PjzTYLGFr9Xk80tFotN26ExttWtGgxAM6cOZ0ghmvXrjJlygSCgnal7ebA0L3y1KmTCfYFBm7hk0+qs2nTv4Zt+mTyv/92s2fPbvLnL0DJksn/HrW3z0Tu3C5cu3aFhw9f/z4eQkKCgbe3fuWZMwnfF0eO6N5XiqIbb5nc833x4gWTJ49n5crlgK6b8oMH9/Hx8aVdu44ULVrMkIRfuXIJIF4Lpn6fvrVULzT0eoJrvTqu+HUNGzZBq9USFLSLffv2ULFipQRdsYX4UBl7Git9P4iwJPY/intNafrPGUAEyU/So+8Dk9y17OJmtBVGotVqGT36ZwYO/Bobm2y0b7+Tpk0Xkj17yZQPTiONxowqVfrTvv0unJyKM2PGNBo2rMPZs2mfrlwIIT4GVlZW1K1bn3v37iYY+7Zv3x62bQsgb958lC3rCkCTJs2IjIw0LJ+ht2jRPMN4yIzWuHEzHj9+xPTpU+K1Nl66dJHx43/nr7+WkjmzriWsWTPdOpBTpkwgOvrlpPVLlixIEF+BAgUB3X2+ugTG6tUrefToUbyy9es3wtzcnFmzpsVrIX3x4gXjx//O8uWLDd1008LV1Y0cOXKyefO/8cZw6tasXIKZmRkVK3oYthcsWIgSJUoRELCRM2dOpzi5j17jxk2Jiopi8uQ/ePHihWG7qp7hn3/+IlMmB6pXr5Hm+FPjwoXzBAZuNfw7MjKCCRMmoNFoaNxYNyurq6sbuXO78O+/azlx4li84xcvns9ffy1BVc8AYGVlDcCDB/Hr89atW4Zu1K/eY/78BQHYsyfIsC0qKirRWY/1Xzq8+t7Rq1SpCtmyZWPJkgU8eHCfhg1T9+yF+BAYO5nSj2ZPqtlIv90mif0oivI5uplgW6mqmlTymNZrJTltnKOjHRYW5kntThNnZ4eUC31EoqOj8fPzY8GCBTg5FaFDh804Ob39RYcLF65Mjx7BbN48gODgmdSr58WECRPw8/NL9ttJkbFM9ufBTPceMNn4MtjHcp+m7l3Xg7297kP4smUL2bp1Y6JlOnToQMOGDRk27AdOnTrOkiULOHnyKG5ubly7do3AwEDs7e35449x5MihS+D69OnB7t3bWbx4PqdPH6dcuXKcOnWKQ4cOkTlzZiIiIlK8V31sWbLYGspmzarrImlra5ng+P79+xIcfICVK5dz6tQxKlWqxOPHj9m0aRNPnz5l7NixFCyYG4BWrZpz8OB/rFmzhu7dP6datWpcuHCBvXv3Ym9vT2RkpOH8zs4elC5dmhMnjvHVVz3w8PBAVVX27duHq6srR48eJXv2TGTO7ICzc2m+++47xowZQ6dObalTpw5ZsmRh165dXLhwgdq1a9OhQ/yxkBYWZgnuxcHBxvAM9Pt+/XUMPXr0oFevrtSrV49s2bKxY8cOLl++zODBgylVKv7vzdatfRgxYgQajYZ27Vqn6r311Vd9CA4+QEDARi5fvkCVKlW4f/8+W7duRavVMn78eMMzTC7+tIiK0nW/zp8/Pz//PJQDB4JwdHRk+/btXL9+ne7du1OzZlVD+bFjf8PPz4++fbvzySefkC9fPk6cOMG+ffvImzcvP/zwPc7ODtSp44mLiwubN/vz9GkEJUqU4ObNm2zbtg1ra2s0Gg3Pnr2s588+a8fq1SuYNGkcFy6cwdHRkW3btuHg4ICdnR1WVhaGsopSCIAdO7aSLVsWPv30U4oVK2aIsUWLFsydOxc7Ozu8vZtha2ub7udjKuR3hGkw9XowdoKp73+QcGS7jnXca6IDNRRFyYluvOVqVVWTHkmf+mtp0Y3FTNLDh8nuTjVnZwfumugkDsYQERFB166fsX37NnLlcufTT1dhbZ2DyMi322XV3t467hoW1Kkzibx5axMQ0JsePXoQFLSXsWMnSpL5Dpjyz4N+uQhTnXQlI5lyPXxMjFEP+v9rL126xKVLlxItU6WKZ1xclkybNpeFC+eyc2cgixcvJmtWRxo2bEKnTl3JkydvvPjHjp3CrFnT2bUrkGPHjlG4cFF+/30is2ZN5/LlSyneqz62R4+eGsqGhel+Fz99Gp3o8X/8MZWlSxexbVsAS5cuxd4+E2XKuPLZZ1/g5lYx3jEDBvxAvnyFWL36H5YtW0aBAgUZM2YcM2ZM4/z5s/HKjho1jj//nMKePbs5c+YMJUqUYuLE6QQGbuXo0aPcuxdBVJTud0bTpq3Ili0Xy5cvYfPmzcTGxpInT1769u2Pt7cvDx/G74L54kVsgnsJD39meAb6fcWKlWXatDnMmzeT7dt3EBX1jIIFCzFkyE80atQ0wTkqVdK1NLq6umFllTnV762xYyezbNliAgI2smzZMjJlcqBatRp89tkXFC9eIsF5Eos/LR480H3Uq1y5OsWLKyxYMJfbt2+SN28+fvnlF2rVahjv/AUKKMyYMZ8FC+Zw4MBBtm/fjrNzDlq1asvnn3dGo7E1lB83bgrTp0/i2LGjHDx4kJw5c1G/fiO++MKP777rx8GDB7ly5TZ2dnZky+bC779PZO7cmfj7b8Te3h4vr1r07PklrVs34/nzF4bzWlllxs+vFytWLGPx4sXkyOFC1qy5DDFWqeLF3Llz8fKqTUTEi0THl75P5HeEaTCVekguydVk9MxZaaEoihW6xG+/qqoJ5sxWFGUT0ADIpqpqgkWKFEVZCdQFSqqqevOV7SGAq6qqmle2FQXOActUVW2fyLnOAHlUVc2cXMx374ZnyAMzlTeHKbhz5w4dOrTm6NEjFCrUkGbNlmBllfIMeRnhZYL50uPH11izpjV37oTQv/+3/PDD/95JLB8zU/55cKpYBoAHh0+kUPL9Z8r18DH5kOrh5s0bZM3qmGjLjY9PU2xtbVm8eIURIkvZF1+05/z5swQFHTJ2KG/kwIF9DBjQl0GDhtK0aUtjh5Mu7+vPxNq1q/j991FMmDANd/dKxg7njb2v9fChMZV6cHZ2SLIFxqhjMFVVfQ5cAQolUaQQcDex5DKOD7rxmTcURdHq/wCuAHH/vhxX9jLwPLFrKYpiDuQDZPDdO3bx4nkaN67L0aNHKFv2Cz79dOU7Sy6TkjlzPnx81uHoWIQJE8Yye/afRo1HCCHeV+PH/0aDBjUTTJCybdsWbt++hZubu5Ei+zhER0ezaNE87O3tqVOnvrHD+ahERESwYsUyXFzyxhsXK8THwNhdZAGCgM8URSmuqqph1V5FUfKgm9V1fTLHDk9ie08gZ9z+MABVVV8oirIfqKQoioOqqq+m/pUAO2Bv+m9DpNXx40dp3bolDx7cp2rVIVSrNtRkuqPa2+fAx2c9y5bVZsiQ73F2zkGLFt7GDksIId4rzZt7s3fvf3Tv3gkvL904xCtXLrFnTxA5cuSkSxc/Y4f4QQoNvc6QIQN5/PgRd+7cplu3noblR8TbdeTIYSZP/oM7d+4QFvaQoUOHm8xnGyHeFVNIMBcCnwGjFEXxVVU1VlEUDTA6bv/MpA5UVfWnxLYritISyJnI/oVADXSJ54C4spbAiLj9KS+aJTLEvXv3+Oyzdjx8+IB69abg6trN2CElkDVrYby91/LXX/Xo3bs7Tk7ZqFFDlkoVQojU8vT0YuLE6Sxbtog9e3YRHh5OtmzZadnShy++6Iajo1PKJxFp5ujoRHj4YyIiIvDx8aVjxy+MHdJHI3t2Z+7fv0dsbCzduvVMcd1RIT5ERh2DqacoynKgDXAA2A5UQ5cIrgR8VVXVxpX7CZJOLF85X4IxmHHbzYFdceffChwGGqLrUjtWVdXvUopVxmC+uRcvXuDr+ylBQTvx9PyJKlUGGS2WxMZgvu7q1e38808LbG2tWbvW3zD9vsg4pvzzIGMwxbsm9WA6pC5Mg9SDaZB6MA2mUg8mOwbzFZ8B/wOyA/2BXHH/7qhPLuP8GPcnXVRVjUGXUI4HSgJfoWvF7Qt8n97zirQZNepngoJ2UrRoMypXHmjscFKUP39tGjWaS2RkBG3b+nD5cuIzLAohhBBCCPGxM4UusqiqGo2um+qIFMqlqhO7qqrlk9kXjq577IC0xCgyxvr1a5gyZQKOjsVo1Gg2Go2pfMeRvBIlWvHkyR0CAwfQps2nbNiwBWdnZ2OHJYQQQgghhEl5Pz7diw+Cqp6hX7/eWFra06LFX1hbZzF2SGlSoUJvKlf+jkuXLtKhQysiIiKMHZIQQgghhBAmRRJM8U6Ehz/miy/aExkZQcOGM8mevZSxQ0oXT8+fKVPmc0JCjvDjj0OMHY4QQgghhBAmRRJM8dbFxsbSt29PLlw4j7v71yiKj7FDSjeNRkPdupNxdi7LokXzCAzcYuyQhBBCCCGEMBmSYIq3bvLk8WzcuIF8+Wri5ZXsMNv3goWFNY0azcbMzIL+/b8kLOyhsUMSQgghhBDCJEiCKd6q7du3MXr0CBwcXGjadBFmZiYxr9Qby5HDlapVh3Dr1g2GDJEJiIUQQgghhABJMMVbdOvWTXr06IJGY0Hz5suxt89h7JAyVOXK35EzZ0VWrFiOv/8GY4cjhBBCCCGE0UmCKd6aYcMGExb2kFq1fiN3bg9jh5PhzMwsaNRoNhYW1nz77Vfcu3fP2CEJIYQQQghhVJJgirciMHAra9euIk+eKpQv393Y4bw12bOXpHr14dy7d5fvvx+AVqs1dkhCCCGEEEIYjSSYIsM9ffqUQYO+wczMnLp1J6HRfNhvs4oVv8TFpSrr169hzZp/jB2OEEIIIYQQRvNhzLgiTMrEieO4fPkSFSt+RY4c5YwdzltnZmZOw4azWbjQg4EDB1Ctmic5c+YydlhCCJEmc+bMYN68Wfzww480btzM2OF8dPr27U5ISDAbN27HwcEhVceo6hnWrv2HkJBgbt++hbm5BYULF6FevYa0aOGNhUX8j3n6On6VRqPB2tqa7NmdcXNzp23bDhQoUDBeGX//9YwaNTzFeEaNGouXV61UxZ4a/v7rWbhwLrdv3yJTJgemTZtNvnz5E5RLz7MzBadPnyQ8PJxKlaoYOxSRCsHBh+jXr6fh3/nzF2DpUtNsWAgLC6Np07rxtgUFHXpn15cEU2SoCxfOMXnyBBwcXKhefaixw3lnHB2L4OU1im3b+jNgwJcsXvw3Go3G2GEJITLAb79ZvdPr2du1Q/DxAAAgAElEQVRDZGTqrzlw4PO3GI0wRbGxscydO5MFC+ZgaWlJ5crVqF7di4iIcPbv38v48b+xfftWxo2bhLW1TYLja9SoSdGixQHQarVERkZy/vxZ1q9fTUCAPyNG/Eq1ap4JjitfvgJubhWTjOv1xPRNXL58iTFjRmBnZ0/79u159uwFuXLlzrDzG9uePUEMGjSAvn37v5ME886d28ye/Sf79+/l8eNHZMuWnRo1atG5sx+ZM2dO9Xm0Wi3r169h/fo1XL58Ea1WS4EChWjWrAXNm3tjZpaw19q0aZNQ1dNcu3aVsLAwrK2tyZUrFzVq1MLHx5csWbImeq09e4JYsWIZly9f4tEjXcyKUoK2bTtQpkzqGzBu3brJunWr2bs3iBs3QomMjEy0XPnyFZgyZWaK59P/HGTNmnjcGfWsX7d9+1ZCQoK5fPkCp0+f4cmTSOrXb8T//pdwCUAbGxs6d/YDYOPGDdy6dTPd100PSTBFhtFqtQwc+A3R0c9p1GgcVlbvz7eIGaF8+e6cO7eWLVs2s3z5Etq162jskIQQQnyAFi6cy/z5sylduiy//PIrzs4vZ2l//vw5Y8aMICBgIyNHDufnn0cnOL5GjVqJtlLv3RvEDz98x48/DmbevKXkzZsv3n43t4p07doj428oEefOqcTGxuLt3Zoffvieu3fD38l135WwsIfExsa+k2uFhl6nZ88uPHz4gBo1apI/f0FOnz7JihXL2L9/D9Onz0kyyXvdzz8PY8uWTTg6OlG3bgOsrW04dGg/Y8eO4fjxYwwb9nOCY/7+eynFi5fA3b0Sjo5OPHv2lJMnTzB37kzWrVvNjBnzEvT8mjZtEkuXLiRLlizUqFGLLFmyEhp6jaCgnezcGcjQocNp0KBxivH+/fdSpk+fTHR0NCVLlqZmzTrY22dKtGzevHlT9QyS+znIyGf9ugUL5nL+/Fns7Oxwds7BlSuJJ8qgSzD1MR45clgSTPH+WrVqBbt376BQoYYUK9bC2OG8cxqNGQ0bzmD+/IoMHTqIunUb4OzsbOywhBBCfECuXr3C/PmzyZrVkbFjJyXoEmplZcUPP/zIsWMhbN++lcuXu1OwYKFUnbtqVU+6devJ9OmTmT9/NkOHptwt9m2Jjo4GSLKVSKTeuHFjePjwAf37f0urVm0N2ydP/oO//lrKzJnT+O67H1I8z5YtW9iyZRO5c7swa9YCQ91ER0czZMhANm/2x8urFjVr1ol33ObNO7G2tk5wvhkzprJo0TwWLZrPt98OMmy/f/8ey5cvxskpGwsWLMPR0cmwT99NdfbsGSkmmDNnTmPhwrmUKVOO778fSqFChVO8xzeVUc86Mf36DcDZOQdubqUICNgRr7uuqfmwZ18R78yjR2H8738/YGFhwyef/PHRdg/NnDk/np4/Ex7+mLFjE35rLIQQH4p79+7x+++j8PZuQq1aVfD2bsLvv49KdMmm0NDr/PjjDzRrVp969Wrw7bf9uHz5Em3atKRv39TNND5y5E94errz+LHu/9fmzRtQp041unTpyI4d29IdX9++3WnVqhl79wbRqlUzPvmkOsOGDWLkyJ8oVaoUjx6F8euvv9C0aV3q1fNiwIC+hIZe5/nz50ybNokWLRpSv35NvvyyB+fOnU0Qx8WL5xkxYpghjvr1a9KrV5dEY06NTZv+5cWLF/j4+CY53tDCwoKvvx7I4MH/S3NriY9PG6ysrNm5M5AXL16kK8bkpKZeWrVqZhjzOWnSHyiKwpw5M1I89+3btxg8+Fvq1atB48af8NNPQwgNvZ6gXGRkBNOnT8bXtwW1a1elZctGjB07mocPHyQom9r669u3O56e7oSHx29pvXnzBp6e7gwe/I1h28iRP8W7P09Pd+bPn42npzvr169JEMOtWzepUcOD4cN1Q4+Cgw/h6emeqp+d0NDrHDiwj9y58+Dt7RtvX9euPbC1tWXzZn+ePn2a4rm2bNkCQNu2HeIl/paWlvj56ZKdf/75O8FxiSWXAHXq1APg+vWr8bbfunWL2NhYSpUqHS+5BKhQwR07O3vCwh4mG2tw8CEWLZqHh0dlpkyZ+U6Sy4x81ompUMGdfPnyvxefsSXBFBli9OgR3L17hypVBpM169v/ITZlrq7dcHQsysKF8xL9sCGEEO+70NDrdOnSgbVrV5E/fwF8fNqQP38B1q5dRdeuHeN9qL9+/Ro9enRm+/atlCvnSsuWrbhxI5Tevbvx6NGjNF/766/7sG/fHurUqUu9eg25fPkiw4YN4sCBfemKD+DRo0f8738/UK5ceRo1aoara3lAN/SjX7+eHD9+jEaNmlG2bDkOHNjHwIH9GTr0ewIDt1C7dl0qV67KkSOHGTiwP8+ePTOc99SpE/j5deK//4KoVKkKbdt2pFKlKpw6dZKhQ7/nv/92p/n+9+3bA0ClSlWTLVe9eg0aN26Go6Njms5vY2ODoig8ffqU8+cz9ndYauvF17cdNWrUBHT32bdv32THfup9801frly5RMuWrShbthxbt26mZ88u3Lp1y1AmIiKCXr26smTJAnLndqF167aUKVOWdetW4+fXKV6i+zbqD3RdlF+9v86d/ahevQYajYYtWzYlKB8QsBGtVkvDhk0AyJ07D507+6VqMq7gYN3ELh4elROMj7Szs6dsWVeePXvGyZPHUzyX/tnkyeOSYJ9+29GjRwytzyn5779dABQpUize9nz58mFpacnp0ycJCwuLty8kJJgnTyJxd6+U7LmXLl2IjY0Nw4b9nGCyq7clI5/1+066yIo3duTIYebNm42Tk4KHx9fGDsfozM0tqVHjF9ata8uIET+ycOEyY4ckhBAZ6rffRvLgwX2+/34ozZq1NGxfvXol48aN4bffRjJx4nRA10ITFvaQESPGULu2blZDP79e9O/fm2PHQtJ8bTMzMxYt+htbW1sAKlasxM8/D+Xff9caJktJS3wAT58+oU2bDnz55cvfYSNH/kRsbCzW1jZMmTITKyvdxEu9enXh+PFjPH8ezcKFy7Gzswdg1Kjh+Puv58iRw1StWh2A2bNn8OLFC+bMWRyvm+q2bVv48cfBbNmyierVa6Tp/u/evQOQ6GyqGSV7dt2Yztdbe48cOZxkS2Ljxs3InTtPsudNbb34+rYnUyYHdu/eSZUqVenTp0eqxmDmzu3CxInTDS1ma9b8w9ixo5kxYwo//vgLoOuWefHiBQYM+B5v79aGY4OCdjJo0DdMnDiWESPGAG+n/gC8vGoRERFuuD9f3/YAuLq6ERISzL1798iePbuhfEDAJrJly2ZIqnLnzpPqsbBXr14BIF++Aonuz5s3HwcO7OPataspJm36Lytu3ryRYN+NG6EAxMTEcONGaKITPi1duoinT58QGRnBmTOnOXYshCJFitGx4xfxymXOnIVevb5k8uTxdOzYOm4MZhZCQ6/z33+78PCozMCBSXczffIkkgMH9tGkSQucnLIle08ZKSOf9ftOEkzxRmJiYhg4cABarZa6dSdhbv5uZ1s0VcWKtcDFpSqbNv3Lvn17qFKlmrFDEkKIDHH79i0OHz6Iq6tbvCQB4NNPW+Hvv47Dhw9y8+YNbG3t2LfvP1xd3QzJJejGCfbq9SW9enVN8/V9fHwNySVgSOZu3ryZ5vheTYhq1Yo/buzVY/TJJUCZMq4cP36M5s0/NSSXAKVKlcbff328yTTatGlPkybNE4yBrFBB1xr38GHy3fwSExGhS7Ts7OzSfGxqWVlZAroP6q8KCQkmJCQ40WPc3Comm2Cmt17SokePPvG6Y7Zs6cPffy9l585Anj9/jpmZGZs2/UuhQoXjJZcAnp41KVvWlV27thMZGYG9faa3Un/JadiwCSEhwWzbtpk2bToAcPbsGS5fvkibNh0wNzdP8zkjIiIAyJQp8Ylt9BPe6N9XyalZsyYbNmzgr7+WULdufTJnzgIQl4S//OIhPPxxoscvX76YBw/uG/5duXI1hgz5MdFWdl/f9uTKlYfRo39m/frVhu158+ajUaNmCbrOvio0NJTY2Fhu3LjOxInjUryvl+fOi49Pm1SXf11GPuv3nSSY4o3Mnz+bo0ePUKpUe/Lnr2nscEyGRqOhZs0xLF1akx9/HMKmTYHvRZ95IYRIib7rv6urW6L7y5Z15fTpU5w/fxYrK2tiY2MpWbJ0gnKlSpVJ1wfm11sH9B/moqOfpzm+VxOZ3LkTdvsDcHGJP7OkjY1u2Y88eeInQVZW1vHiAKhcWdeN9f79e5w/f47Q0OtcvXrZ0HIbGxuT1G0mKXPmLNy/f4/w8PA0d39NrSdPngDES+QBOnf2S/cssumtl9TSaDSJLl1RsmRprl69wpUrlzE3N+fp0yfExsYm2hL7/PlzYmJiuHDhPOXKlX8r9ZecOnXqMn78b2zZ8jLBDAjQdZlt2DDlGVPftiZNmrBixSoOHNhLx46+eHp6YWVlzaFDB7h//x45c+bi9u1baDSJj8Bbt24zAA8e3Of48WP8+edkOnfuwG+/TUBRSsQru2TJAmbOnEarVm3w9vYlW7bsXLlymRkzpvDzz0M5f16ld++vko338OGDHD58MNX3V758hTdKMMVLkmCKdHv0KIzRo0diY5OVmjXHGDsck5MnT2WKF/fhyJF/WLt2FS1b+hg7JCGEeGP6Vq2kvqXPnl03e/azZ88Mk1kk1k3N3Nw8XivEuXMqu3btSFDu9YRG37qmp//yTqtNe3yvSmoikteTLD1Ly5R77Ny6dYuJE38nKGgXWq0WMzMz8uXLT7ly5Tl7VkWrDzoN8uRx4f79e4SGXks2wYyIiODZs2fxulqmlr41OE+e1C3bkBrprZfUcnDIjKWlZYLt+lbmp0+fGLZduXKZefNmJXmux491LXBvo/6SY2dnT40atdi6dTPXr18jTx4Xtm7dTOHCRShWTEnXOfXPW9+69rrISH2rW8pLy5mbm/Pbb+NZvnwxAQEb2bTpX6ysrHBzq8jIkb8xdOhAgBS/+HByykbNmrVRlBK0a+fNL7/8j0WLXk4OFBx8iOnTJ+PlVZsvvxxg2K4oJRg1aizt2nmzfPkSWrTwSfAFEICLiwsajYaOHb+gR48+Kd5XRsnIZ/2+kwRTpNv06VN4/DgML6+R2NvnSPmAj5CX189cuLCOX34ZTqNGTZP8ACOEEO8LfdfMu3fvJrpfP4tmlixZef5c15r3eldLPX1LGehauBL70J/WFrO0xPc26daG/orLly/x2Wed8fKqRaFChbG2tuHBg/uJzhaaGpUrV+X48aMcOLAv2cXm161bxbRpk+jUqSt+fr1Sff7Hjx9x6dIFMmVySPXyJqnxtuslMjICrVaboLfQvXu662XOnMUw+UyDBo0TXa/xVWmtv5dfdMRf2zKtCXOjRk3ZunUzgYFbKFeuPPfu3cXXt12azvGq/Pl1Lf7Xrl1JdP/169eA1I/ptbCwoGPHLxKMm4yKiuL69WtkzZo10UmAEpMrV24KFizEuXNnCQsLM8xMu2dPEPCyK/KrbGxsKFmyNLt2befcOTXRBNPOzh4Pjyr8++86Pv+8S5JfEmW0jH7W7zOZRVaky4MH95k5czp2djkoX9501+ExtqxZi+Dq2oOrV5P/tlQIId4XRYvqWlKOHz+a6P6QkGA0Gg0FCxZCUUqg0Wg4depkgnKXLl2Ml3g2btyMoKBDCf68zfjepvPnz3Hx4gW8vGrTvXtvSpQohbW1rnvt5cuX0n3eevUaYmlpyapVfyfZUvLs2TPWrdMlQB4eldN0/rVrVxMTE0OdOnXT1YU5KW+7XmJiYjh7Vo237cWLF6jqaWxt7ciXLz/58xfAysoKVT2TaOvj338vZf782Tx6FJbm+tO3nr6+BEViy6QASQ6bcXevRLZs2fnvv93s2bMbMzMz6tVrmPIDSEKFCu4AHDy4n9jY+MnvkyeRHD9+FBsbG0qXLpvuawBs2xZAdHQ0des2SNNx+omkXp11Vd/N/PUZZPX0S5RYWCRssdbr0OFzHj58wK+//pLhLc1JeVfP+n0gCaZIl6lTJxEREU7lyt9hZWWf8gEfsapVB2NtnYVx435Lcd0mIYQwdbly5aJCBXfOnDnF6tUr4+1bv34Nx48fpUIFd3LkyImzcw48PCpz6NB+9u4NMpR7/vw506dPMnp8b5O1ta4L7ev/7z9+/Ihp03T3np51Jl1c8uLr256wsDC++ebLBDO9RkREMHz4UK5fv0r16jUoX75Cqs99+PBB5s+fha2tHZ9/3iXNsSXnXdTLvHkziYl5OS5yyZIF3Llzm0aNmmBubo61tTV16tTj8uWLLF++JN6xwcGHmDp1Iv/+ux4Hh8xprr/8+QsCL1vfQNeqt2zZokRjNTfXdSJ8fUkPc3Nz6tdvxOnTJ9m6NYAKFdxxdk5/LzEXl7xUqlSFmzdvsGpV/DUq58yZwdOnT2nQoHGCVr7Q0OtcuXI5wXtU383zVefOqUybNhEHh8wJWjavXr2S6BchsbGxzJgxlYcPH1C2bDkyZ85s2FeunG6c7rp1qw2zJuvt3fsfx48fxcrKmrJlk27Br1jRg44dv2Dr1s18800/Q+vh25SeZ61f39fff/1bj+9dki6yIs3u3LnD7NkzyJQpD66ufsYOx+TZ2majcuXv2bXrByZMGMdPP/1i7JCEECJJixfPT/LDjo+PL7Vr1+W7736gTx8/xo0bw86dgRQpUoyLF89z8OB+smd3ZuDAIYZj+vf/lu7dOzNo0DfUqFETZ+ecHDy4z/DBPSNbyfTSEt/bkjdvfkqWLE1ISDC9e3ejbFlXHj0KY/fuHTx//hwbGxsePUq8hSYl3bv35uHDB/j7r8fXtzlVq1bHxSUf9+7d5cAB3bMtW9aVoUMT7wa6e/cOw1ITWq2WyMhIzp49w9GjR7C2tmb48FHkypU73feelLdZL1ZW1qjqGfz8OuHu7sG5c2c5eHA/BQoUxM+vt6Fcnz79OXHiGFOnTiAoaCelSpXhzp3b7Nq1HXNzCwYPHoaZmVma669Jk+asXr2CiRPHcvLkcbJkyUpQ0E7s7TMl2kXT2Vk35nTNmn94/PgxrVu3NYxDbdSoCcuWLeLOnduJdm++efMG/v7ryZ07T6rWwvzmm0H07NmFCRPGcvjwQQoUKMSpUycIDj5Evnz56d69d4JjvvqqF7du3WTFinXxJl3q3183U2/hwkWws7PnypVL7NkThLW1Db/++ofhHvT27fuPP/+cSrlyruTO7UKWLFl48OA+ISHB3LgRSrZs2Rg4cGi8Y2rX/oT16ytx6NABOnRojZdXLZycshmupdVq6dmzb4rdqbt3742DQ2ZmzpxKu3belCxZmoIFCxlmc33dm84iC2l/1vqWztT8P7hr1w52796BjY0loaG6tV1PnDjGyJE/Abru5X379n+j+DOKJJgizSZPHs/Tp0/45JPRWFjYGDuc90KFCr0JCfmTWbP+pEsXP0M/fSGEMDVXr14xrOf2Oi+vWoBuDNHs2QuZN282e/cGcfToEbJnd6ZVq7Z06tQl3uQ9+fMXZPr0OcyYMYVDhw7w4sULKlTwYPjw0XTq1NbQ7TAjpSW+t8XMzIwxY8YxY8ZUDh7cj6qextk5J1WqVKNTp65Mnz6F3bt3EBp6PdFxZMkxNzfnhx9+pG7dBqxZ8w/nz59j7949WFhYUKRIUbp160mzZi2T/NC6e/dOdu/eafi3jY0NuXLlwcfHF1/f9mmOJ7XeZr1YWVkyceJ0xo//jX/++RtbWztatPCOSzJeTqri6OjIzJnzWbhwHrt2bWflyuVkzepI9eo16NSpG8WKFQfSXn/FihXn998nMnfuTAIDt2Jvb4+XVy169vyS1q0TJoHly1fA27s1mzf7s2rV37i7VzIkZ4ULF6VgwULcunWTmjUTLp9z8+YN5s2bRfnyFVKVYLq45GX27IXMmTOD/fv3sHfvf2TLlp3WrdvRubNfvNbDlNSu/QlbtwYQELCRqKgosmfPQfPm3nz22ReJtj67u1eiadNrHDt2lHPnVCIiIrCxsSFfvgI0aNCY1q3bGpY70TMzM2Ps2EmsWvU3W7cGsGvXDqKinuHgkJmqVavTqlVbw5q3ydFoNLRv/xk1a9Zm3brV7Nu3h507A4mMTHxMeEbMIpvWZ33x4nns7OypWtUzxXOfO6eyceOGeNtu3Ag1rEGaK1duk0kwNe+qX/KH4u7d8Ax5YM7ODqlaNNjU3Lp1Ew8PV6ytnenS5QQWFu/3pDX29tZERka9k2udOrUMf//OeHu35s8/57yTa74vTPnnwaliGQAeHD5h5EjePlOuh4/Jh1QPurXoQsmVKzcWFvG/075xIxRf3xa0bNmKb78dZKQIk/ch1cX77GOrh4iICJo3b0Dt2nUYNmyEscMx+Njq4XXBwYfo16/nGy3X86rw8HCaNPmEtm07pLjkyqvSWg99+3YnJCQ4XWPaU4gjyfX3ZAymSJMJE8YSFfWMKlUGv/fJ5btWsmQbcuZ0Y9WqFUkuVC2EEB8SjUZD584d+PzzNgnGmi1dqhubpp8YQwihs2TJAp4/j6JZs0+NHYpIxLx5s/D0dKd9+zdbfu7o0SNYWFgY1jzNSGFhYXh6uuPp6W6Uz5zSRVak2rVrV1m0aD5ZsxamdOnPjB3Oe0ejMaNmzdH8/XdDRo4czooVa40dkhBCvFUajYaWLX1YtmwRnTq1pUqVapiZmXP8+FFOnjxOpUpVqV37E2OHKYRJ6NPHj0ePHnH58kUqVvRI0wRN4u3LnTsPnTu/nHtEv6xKenl6ehEYuOdNw0qUjY1NvFjfNUkwRaqNH/870dHRVK06BHPzpKeGFknLn78W+fPXZufO7YSEBMsvDyHEB69Xry8pUKAA69atwd9/AzExL8iTx4WePfvStm3HJJdrEOJjkzlzZs6cOYWHR+UU1+kU717u3HkypGvsu2BjY2PUWCXBFKly6dJFli1bjJOTQsmSbY0dznutcuXvuHp1O5MmjWfu3MSnLxdCiA+FmZkZTZu2pGnTlsYORQiTNnr0OGOHIESGkDGYIlXGjfuVmJgYqlUbiplZxk8p/zHJn782OXNW5N9/13Hu3FljhyOEEEIIIUSGkQRTpOjcubOsXPkX2bOXQVHebECz0I1Jqlz5O7RaLVOmTDB2OEIIIYQQQmQYSTBFisaOHU1sbCzVqw9Do5G3TEYoVqw5Tk7FWbnyL0JDrxs7HCGEEEIIITKEZAsiWadPn2LNmlXkzOlG0aLNjR3OB0OjMcPD4xuio6P5888pxg5HCCGEEEKIDCEJpkjWxIlj0Wq1VKv2P5npL4OVKtUOBwcXFi6cz/37940djhBCCCGEEG9MEkyRpOvXr7F27WqcnctSuHBDY4fzwTE3t8LdvT9Pnz5hzpwZxg5HCCGEEEKINyYJpkjS7NkziImJoWLFftJ6+ZaULdsFW9tszJr1JxEREcYORwghhBBCiDciCaZIVEREOIsWzcfePhclSvgaO5wPlpWVPW5uvXn0KIxFi+YbOxwhhBBCCCHeiCSYIlFLly4iPPwxbm49sbCwNnY4HzQ3t15YWtozffpkoqKijB2OEEIIIYQQ6SYJpkggJiaGGTOmY2FhS7ly3YwdzgfP1taJcuW6cevWTVau/MvY4QghhBBCCJFukmCKBPz9N3Dt2hVKl+6InV12Y4fzUXB374e5uSWTJ48nJibG2OEIIYQQQgiRLpJgigT06zJWrPilkSP5eDg4uFCqVAcuXryAv/96Y4cjhBBCCCFEukiCKeI5dOgABw/up3Dhxjg5FTd2OB8VD49v0Gg0TJz4B1qt1tjhCCGEEEIIkWaSYIp4ZsyYBui6bIp3y8mpGMWKfcqxYyHs3Lnd2OEIIYQQQgiRZpJgCoOrV6+wfv0acuRwJV++msYO56Pk4TEAgNmz/zRyJEIIIYQQQqSdJJjCYNasP4mNjcXd/Ss0Go2xw/ko5c7tTq5cHmzZspkrVy4bOxwhhBBCCCHSxMLYAQAoimIBfAn4AYWAm8A8YIyqqtGpOL40MAKoCjgAIcAfqqquSqTsIqBjEqf6VVXVQem6iffc48ePWLJkIZky5UFRWhk7nI+am1sPNm48yIIFc/nf/342djhCCCGEEEKkmqm0YE4F/gDuAxOBUOBnYFlKByqK4gocABoCG4FZgAvwj6Io3yVyiCtwGxieyJ+tb3oj76slSxYRERGOm1svzM2tjB3OR01RWmFrm50lSxby7NkzY4cjhBBCCCFEqhm9BVNRlGpAd2Al4KuqqlZRFA0wH/hcUZSmqqpuSOYU0wFLoKqqqofjzjkMOAL8rCjKXFVV78dttwRKABtUVf3pbd3T++bFixfMnDkdS0s7ypXrauxwPnoWFjaULfsFBw6MZc2af2jbtoOxQxJCCCGEECJVTKEFs0/c63BVVbUAca+DAS3QLakDFUXJDNijSxgP67erqhoBrAdsALdXDimJLhk9lpE38L779991hIZeo3Tpz7G1dTJ2OAJwde2GRqNh7txZxg5FCCGEEEKIVDN6CybgBdxTVfXEqxtVVb2hKMpZIMnpTFVVfYyuy2tiSsS93n5lW7m4V0kw42i1WqZNm4xGo6Fixb7GDkfEyZKlIIULNyYk5F+OHDmMm1tFY4ckhBBCCCFEiozagqkoijWQF7iQRJHLQFZFUZxTeT5zRVGKKooyCWiErmXz+CtFyr0sqvynKEq4oih3FEWZpyhKnnTexnvt0KEDHDlymCJFmuLoWNTY4YhXlC/fE0BaMYUQQgghxHvD2F1k9f0xw5LY/yjuNUsqz7cDOIduRtr/gLav7dcnmMOAS8BM4CzwBXBAUZS8qbzOB2PhwnkAuLn1MnIk4nUFC35C1qxFWL36H+7fv2/scIQQQgghhEiRsbvIWsa9RiWxX7/dJpXn2wHsA6rH/QlUFKWRqqoP4vY/RZeAfqqq6kn9QYqiDAF+ASYB3sldwNHRDnAfeTkAACAASURBVAsL81SGkzxnZ4cMOU96PXz4kLVrV+HkVJSSJRug0Rj7+wbjsLe3NnYISapUqQ8BAQNYt+5vBg4caOxw3ipj/zwkyUy3JqzJxpfBPpb7NHVSD6ZD6sI0SD2YBqkH02Dq9WDsBPNp3GtS62LoP/lHpuZkqqoO0/9dUZTfgO/QrY/ZJ27/p0kcOhroCjRTFCVT3CRBiXr48ElqQkmRs7MDd++GZ8i50mv27Nk8e/aMSpW68ORJisuNfpDs7a2JjEzq+w3jK168HYGBQ5gyZRqff94dc/OM+XLD1JjCz0NSnGK1ADww0fgykinXw8dE6sF0SF2YBqkH0yD1YBpMpR6SS3KN3WT1CIgl6S6wWV4pl1ZDgSdAi5QKqqoaCxxFl3B/FN1ktVotCxbMw9zcktKlOxo7HJEEGxtHSpZsy7VrV9i2LcDY4QghhBBCCJEsoyaYqqo+B64AhZIoUgi4+0oX13gURXFSFKWZoijlXt8Xd+6bQPa4snaKolRRFCWpWWdt414/ipXtDxzYj6qepmjRltjb5zB2OCIZbm66yX7mzJlp5EiEEEIIIYRInrFbMAGCgFyKohR/dWPcrK7F0Y2pTEpJYB3w4+s7FEXJAhTg5Qy1uYC9wKJEytoBFYC76BLeD96iRbrJfVxduxg5EpGSHDlcyZOnCtu3b+PixfPGDkcIIYQQQogkmUKCuTDudZSiKGYAiqJo0I2LBN1Mr0nZB1wFWiiK4qnfqCiKBTAVXZfXuQCqql4EgoGyiqJ0eKWsBhgDOAPTVVXVZsRNmbKwsIesXbuarFmLkC9fLWOHI1JB34o5b94cI0cihBBCCCFE0oyeYKqquhX4C/AB9iqKMgbYCXwOrAT+1ZdVFOUnRVF+euXYGHST88QA/2fvzqOsqs78/78v84woIDIoiFUPoEJGYzTRaGLiEBWcE4doTOxO2+m2zdzpJCb210STXxLTnXSi6cR5BGUoUMABFEGNGpzS2Y44zxODoAj1++PciiWpKu6FW5xbt96vte46de7Z55xPrbNg8bD32fvGiLg4In4BLAWOLZ57brPbnQKsBC6OiGsi4ufAnWTLmtwCnNVev2c1ufrqK3jrrTVMnHgyhUIh7zgqQV3dFPr0Gcrll1/Km29WZqIpSZIkqdJyLzCLjge+T/a+5Glkw1m/Dxy3QY/iD9hgOGyxQN0DmAccDHwFaAROBw5NKb3TrO3dwIfJCte9yGaXHVC816dTStU7nWiFNJ/cZ5ddjs87jkrUrVtPJk48ieXLX+eaa67OO44kSZLUoryXKQEgpbSWbDmRMzfSrsXutmLheHCJ9/orcFS5GWvFHXfczkMP/ZWII+nTZ0jecVSGiRO/xB13/JQ//OF8jj32BHufJUmSVHWqpQdTW8i7k/ucnHMSlWvAgFHstNPBPPDAffz5z3fnHUeSJEn6OxaYnchrr73KjBnXMmjQTowatXfecbQJdt31JAAuv/zSnJNIkiRJf88CsxO5+uorePvtt5zcpwMbPfpT9Os3nGuvncrq1avzjiNJkiS9hwVmJ/Hu5D492Hnn4/KOo03UpUs3dt75WJYvf4M5c2blHUeSJEl6DwvMTuKOO5bw8MOJurpDndyng9tlly8AcNlll+ScRJIkSXovC8xO4qKLssl9Jk50cp+ObtCgnRgxYg9uvXUBTz75RN5xJEmSpL+xwOwEXn31FWbOnO7kPjWkqRfzyisvyzmJJEmS9C4LzE7AyX1qT8ThdO/el8svv5T169fnHUeSJEkCLDBrXmNjIxdddEFxcp/j846jCunRox8Rh/P000+yaNEteceRJEmSAAvMmnfPPXfx8MOJnXY6hD59BucdRxXUNEz28sud7EeSJEnVwQKzxl111eUALk1Sg0aM2INBg3aioWEmb7zxet5xJEmSJAvMWvbWW29xzTVT6dt3W0aP/lTecVRhhUKBXXb5Am+9tYZrr52WdxxJkiTJArOWzZ8/lzfeeJ1x446hS5duecdRO9h552MpFLpw2WUX5x1FkiRJssCsZVddlS1hscsuDo+tVf36DWf06E+zdOk9/N///SXvOJIkSerkLDBr1Msvv8wNN8xj6NBJDBmya95x1I523dXJfiRJklQdLDBr1LXXXs0777zDhAnH5h1F7Wzs2IPo3XswV199BWvXrs07jiRJkjoxC8wadeWVl9OlS1fGjz867yhqZ1279mD8+GN45ZWXmT9/bt5xJEmS1IlZYNag//u/v3DffUsZPfrT9O27bd5xtAXssssJAFx+uZP9SJIkKT8WmDXItS87n6FDJ7Ltth/ghhvm8cILL+QdR5IkSZ2UBWaNWbduHVOnXkmvXlsxduxBecfRFrTLLiewbt06rr76iryjSJIkqZOywKwxCxfezAsvPE/EEXTr1ivvONqCxo8/mq5de3L55ZfQ2NiYdxxJkiR1QhaYNcbhsZ1Xr16D2HHHA3n44cQDD9yXdxxJkiR1QhaYNWTFiuXMmdPAoEE7sd12H8k7jnIwYcIxAEydelXOSSRJktQZWWDWkJkzp7NmzWomTDiWQqGQdxzlYMyY/enVayuuvXYq69atyzuOJEmSOhkLzBrSNDx2woTP55xEeenWrSf19Yfx/PPPsXjxorzjSJIkqZOxwKwRTzyxjCVLbmPUqL0YOHCHvOMoR+PHNw2TvTLnJJIkSepsLDBrRNPSFE7uo5EjP0b//iNpaJjJmjVr8o4jSZKkTsQCswY0NjZy1VWX0717H+rrp+QdRzkrFLowfvwxrFixnPnzr887jiRJkjoRC8wacOedd7Bs2ePU1R1Kjx79846jKvDuMFlnk5UkSdKWY4FZA+bOnQM4PFbvGjJkFwYP3oUbbpjLa6+9mnccSZIkdRIWmDXg0EOncMgh/8n22++TdxRVkQkTPsfatWuZNWtG3lEkSZLUSVhg1oBJk97PJz95OoWCj1PvGjfuKAqFAtOmOUxWkiRJW4YViVSjBgwYxYgRH2PJktt4+umn8o4jSZKkTsACU6phEyZkk/1cc83VOSeRJElSZ2CBKdWw+vrD6Nq1h7PJSpIkaYuwwJRqWK9eg9hxxwP461//woMPPpB3HEmSJNU4C0ypxjWtielkP5IkSWpvFphSjdtxxwPo2XMg06Zdzfr16/OOI0mSpBpmgSnVuG7delFfP4XnnnuGJUtuyzuOJEmSapgFptQJOExWkiRJW4IFptQJjBq1F/36jWDmzOmsWbMm7ziSJEmqURaYUidQKHRh3LijWL78DW64YV7ecSRJklSjLDClTmLChGyY7PTp03JOIkmSpFplgSl1EkOGTGTQoDrmzbuelStX5h1HkiRJNcgCU+okCoUCEUewZs1q5s+/Pu84kiRJqkHd8g4AEBHdgK8CXwbGAM8BfwR+klJaW8L5OwNnAh8F+gNLgZ+nlK5poW0f4DvA54ARwOPAr4HfpJQaK/ILSVVq3Lgjuf32HzN9+jVMmXJE3nEkSZJUY6qlB/PXwM+BV4BzgWeAHwGXb+zEiJgE3AnsD1wHnE9WOE6LiG9s0LYrcDXwH0Aq3mst8N/ATyv0u0hVa/DgCQwePIEbb5zPihXL844jSZKkGpN7gRkRewCnAFOBvVJK3wb2Ai4CDo+Iz27kEv8DdAc+nlL6Ykrp34BdgUeAH0XENs3aHg0cCPwspXRQ8V4fAm4CTo+IXSv5u0nVqL7+cN5++y2uv35O3lEkSZJUY3IvMIFTi9sfNg1RLW6/AzQCX2rtxIgYAPQFGlJKdzd9n1JaCcwCegHv3+Be7wBnNWu7lqxHswCcXIHfR6pq48YdCcCMGX83glySJEnaLNXwDuZewMsppQeaf5lSejYiHgL2bu3ElNJyYFIrh8cVty8ARERPYDdgaUrptQ3a3gm82da9pFqx9db1DBkykZtvvpHXX3+NrbYalHckSZIk1YiSezAjYmylb14s+kYCj7bSZBmwVUQMKfF6XSNip4j4FXAAWc/m/cXDO5AV1H93r5TSOuApoL6830DqmMaNO4K1a9dy3XWz844iSZKkGlLOENmHI2JRRPxDRFSqy2Pr4vb1Vo6/UdwOLPF6C4CHyWakvQ04ptmxpncx27pXn+KMtlJNi8hmkJ0+fVrOSSRJklRLyimmLgAOI5tU59yImA1cDMwuZSmRVnQvbt9q5XjT971KvN4C4HZgz+Lnpog4IKX0apn3anUV+kGD+tCtW9cS47RtyJD+FbkOQP/+0LdvxS7XqfTt2zPvCFtc377jGT78Q9xyywIKhbcYPHhw3pEq+uehoroUgCrOV2Gd5fesdj6H6uGzqA4+h+rgc6gO1f4cSi4wU0pfjIivAIcAxwGfBSYDr0XElcAlKaUlZd5/dXHbo5XjTf/yX1Vixu81/RwR5wDfIFsf89QS79VI9i5mq157rc3DJRsypD8vvbSiItcCWLGiG6tWVcOcTR1L3749WbWqtf9zqG11dYfz7LN3ceGFl3HCCSflmqXSfx4qaev12fK4r1Zpvkqq5ufQmfgcqofPojr4HKqDz6E6VMtzaKvILasiSSm9lVK6OqV0KDCMrHC7D/gysCgiHo6I70fEjiVe8g1gPa0PgR3YrF25/oOsWDy0uN80sU9b91qZUlq/CfeSOpyIwwFnk5UkSVLlbHKXV0rptZTSb4HPAMcCTwJjgTPI3tecHxF7buQabwNPAGNaaTIGeKk4xPXvRMTWEXFwRExs5drPAU1j/5YBb7d0r4joCowCUlt5pVoyYMD2DB++O7fddisvvvhi3nEkSZJUAzapwIyILhFxQERcBLwMXAFsB0wDjgbOBnYFFkbEFzdyuUXAsIh4zwyuETGcbFbX29s4dzwwE/hBCxkHks0c+yhASukd4A7g/RGxYZ/ubkAfoNwhvlKHFnEE69evZ9as6XlHkSRJUg0oq8CMiI9FxK/JegYbyN7FfJBsqOywlNKRxSG0/w58CFgB/HAjl72ouD0rIroU71MAflz8/rw2zr2drOf00Ij4WLOc3YBfk71j+ocN7tWzeaaI6E72nibA+RvJKtWU+vopFAoFh8lKkiSpIkqe5CcilpENIy2QDWs9C7gopfRwS+1TSk9HxKNkvYitSindUJwk6GhgSUTcDOwBfByYCvxtob6IOKN4TtN2XUScXGxzY0RcRdajuh+wc/H7c5vd7o/AScC/RcSuwN3A/sAk4GfN1syUOoX+/UcwYsQe3HHHYp577lm222543pEkSZLUgZXTg7k1cCGwb0ppTErpe60Vl838HDi8hGsfD3yf7H3J08gmEPo+cFxKqbFZux+wwXDYlNINZAXpPOBg4Ctks8GeDhxaHBrb1HYdWUH5C7Lhtf9KVmT/M/CtEnJKNSfiSBobGx0mK0mSpM1WzjqYHwGeSSktb61BRAwDJqSUbgJIKV1WyoWL62ieybtDVVtrV2jl+7vJistS7rWCrPg8vZT2Uq2rr5/CTTedzvTp13DKKf+UdxxJkiR1YOX0YD5A1uPXln8F7AaROpC+fbdl1Ki9uOuuO3n66afyjiNJkqQOrNUezIjYj2wYaZMC8NGI+JdWTulB9h7lusrFk7QlRBzBk08uYMaMazn11Nb+iEuSJElta2uI7Gtk71AWip9GsjUv99/INf+7MtEkbSl1dZO58cZ/ZcaMaRaYkiRJ2mStFpgppbsi4hBgCFmB+Qey4a8zWmjeCKwle0fzlvYIKqn99OkzmO2335elS+ezbNnjjB49Ju9IkiRJ6oDanOQnpTSn6eeI2Bu4NqU0s91TSdriIg5n2bL5zJo1g69+9bS840iSJKkDKnmSn5TSSRaXUu3aaaeD6dKlq8uVSJIkaZO1NcnPNcAVKaWrmu2XojGlVMral5KqSO/e2zBq1CdYuvRGnnrqSUaN2j7vSJIkSepg2hoiOxlYusF+KRo3PY6kPNXXT+GJJ26koWEmX/nKP+cdR5IkSR1MW0NkxwDnbrBfymfHdkkqqd3ttNMhFApdHCYrSZKkTdLWLLJPtLUvqfb07TuUUaP24q67FvDss88wfPiIvCNJkiSpA2nrHcwBm3rRlNLyTT1XUr7q6w/jyScX0NAwg1NO+ae840iSJKkDaWuI7OvAa5vwebUd80pqZ3V1h1AoFJg1q6UlbyVJkqTWtTXJzy04YY/U6fTtO4wRI/bkzjtv4/nnn2PYsO3yjiRJkqQOoq13MD+xBXNIqiL19Yfx9NOLmD17FieffErecSRJktRBtDVEVlInVVd3KAANDQ6TlSRJUunamuTnGuCKlNJVzfZL0ZhSOrwS4STlo3//EQwfvjtLltzGiy++yNChQ/OOJEmSpA6grXcwJwNLN9gvhe9tSjUg4nCeffZ2rruugS984Yt5x5EkSVIH0NYQ2THAuRvsl/LZsV2SStqimobJzpw5PeckkiRJ6ijamuTnibb2JdW2AQO2Z7vtdmPx4lt5+eWXGTx4cN6RJEmSVOXaGiLboogYQDZcdhLQj2zdy7uBWSmltyobT1Ke6uun8Nxzd3L99bM57rgv5B1HkiRJVa6sWWQj4hTgaeCPwL8BXwa+BVwJPBERB1Q8oaTc1NVlr17PmuUwWUmSJG1cyQVmRBwO/BZYCfw78ElgN7LezJ8CvYHpEfHRdsgpKQdbbTWGbbf9ALfeupDXXns17ziSJEmqcuUMkf0m8DKwe0rpyQ2OzYyIC4Dbgf8kKz4l1YD6+sO49dZ7mDv3Oo455ti840iSJKmKlTNEdldgagvFJQAppb8C04CPVCKYpOpQXz8FcJisJEmSNq6cAvNloOtG2rwJrNj0OJKqzaBBYxk6dBILFtzEG2+8nnccSZIkVbFyCszzgGMj4n0tHYyIscDnySYAklRD6uunsHbtWubOvS7vKJIkSapirb6DGRH/ssFXK4HlwB0RcTGwGHgB2Ar4MHAC8BJwT/tElZSX+vrDWLToDGbNms5RR30u7ziSJEmqUm1N8vNLoBEoFPeb//zF4qexuN/0/VZkS5ZsbCitpA5k663rGTx4Z26++SZWrlxBv379844kSZKkKtRWgXnSFkshqerV1R3KkiVnccMN85g8+fC840iSJKkKtVpgppQu3JJBJFW3+vopLFlyFg0NMy0wJUmS1KJy1sFsU0R0A7YBDkwpOdGPVGMGD96FrbYayw03zGP16tX07t0770iSJEmqMiUXmBHRFfgx2UyxQ2n7PUsLTKnGFAoF6uuncOedP2PBgps44ICD8o4kSZKkKlPOMiXfBL5O1kv5MLAOeB5IwBqyiX5eAv6twhklVYm6ukMBaGiYkXMSSZIkVaNyCsxjgVeBnVJKOwMLgZtTShPIis7fA0OAv1Q8paSqMGzYh+jffyRz517H22+/nXccSZIkVZlyCswxwDUppWeK+38C9gJIKa0B/hF4CHswpZpVKBSoq5vM8uVvsGjRwrzjSJIkqcqUU2BCNgS2yUPAiIjYCiCltB6YC+xcoWySqlDTMNnZs2flnESSJEnVppwC8wmgvtn+I8Xtrs2+e4dsmKykGjVixB706TOUOXMaWLduXd5xJEmSVEXKKTBnA4dExEnFGWX/DKwGTgUo9mROBp6ueEpJVaNLl67U1R3CK6+8zO23L847jiRJkqpIOQXmT8iKx98DX0wprQLOA46KiOeAx8ne07y44iklVZW6usmAs8lKkiTpvUouMFNKrwDvB/6dbIIfgO8A/wP0JOvN/P/IClFJNWzUqL3p1WsQc+Y0sH79+rzjSJIkqUp0K6dxSmk5cHaz/bfIhsieWuFckqpY167dGTv2IB588BLuuecuPvSh3fKOJEmSpCpQVoHZJCK2ByYB/cjWxvxzSunFSgaTVN3q66fw4IOX0NAw0wJTkiRJQJnLlETE+yPiVrL3LacDlwBzgGcjYkax8JTUCeywwyfp0aMfDQ0zaWxszDuOJEmSqkDJBWZETAJuBfYA5gH/CXwLOBe4CzgYWBwRI9shp6Qq061bL8aMOYAnn1zGAw/cn3ccSZIkVYFyhsieCXQHDkwpzd3wYEQcC1wE/Bg4vjLxJFWz+vrJpHQ1s2fPYNddJ+YdR5IkSTkrp8DcG5jWUnEJkFK6NCIOBw4sN0REdAO+CnyZbKmT54A/Aj9JKa0t4fwPAt8DPg70B54CrgbOLC6n0rztxcBxrVzq7JTSt8vNL3VWY8Z8hm7dejFr1ky+/e3v5R1HkiRJOSunwFwPPLuRNo8An9yEHL8GTgEWATOBPYEfkU0kdERbJ0bEPsD1xd1pxYx7kQ3f3Tci9koprWl2yiTgBeC3LVxu0SZklzqtHj36MXr0fjz88CweeihRXx95R5IkSVKOyikwpwNHRcSZKaU3NjwYEb2AQ3i32CtJROxBVlxOBY5KKTVGRAG4ADghIj6bUmpo4xK/IXuXdM+U0p3FaxaA35H1iP4T8PPi992BcUBDSumMcnJKalld3WQeeWQWs2fPpL7+G3nHkSRJUo5aneQnIiY2/5C9X9kNuDMijouIHSOib0SMiIjJwEKgQDZUtRxNa2j+MKXUCFDcfgdoBL7URsYJZAXjjKbistn5PyruHtDslPFk75HeV2ZGSa0YO/YgunTpRkPDzLyjSJIkKWdt9WAuJSvwmisAw4ALW2hfKG7/spHrbmgv4OWU0gPNv0wpPRsRD5G9+9ma5WRDYR9o4dhbxW2/Zt81zUJigSlVSK9eW7H99vtw//3zWbbscUaPHpN3JEmSJOWkrULwIv6+wKyoiOgJjATuaKXJsqxZDEkpvbThwZTS08A5rZw7pbh9sNl3TQVmRMRtxf3VwGzguymljb1jKqkF9fWTWbZsPrNnz+LUU/8l7ziSJEnKSasFZkrpxC1w/62L29dbOd70rudA4O8KzNZExLa8O0T2vGaHmgrM7wHXALcDHwFOBPaLiN2LRaukMuy00yHMn/9VZs+eaYEpSZLUiZUzlPVvImJ7stlY+wCvAH/ZxN6/7sXtW60cb/q+VxnZBpL1SG4L/Kr5u5lkvZUPA1NSSg82O+e7wH8CvwIOa+v6gwb1oVu3rqXGadOQIf0rch2A/v2hb9+KXa5T6du3Z94ROry+fUey/fYf5667FrJ27QqGDx9e9jUq+eehorpko/+rNl+FdZbfs9r5HKqHz6I6+Byqg8+hOlT7cyirwIyI0cD5wL4bHGqMiJuAf0gpPV7GJVcXtz1aOd70L/9VrRzfMN8QsllsPwA0AF9rfjylNKWl84AfAycDB0dEv5TSytbu8dprb5YSZaOGDOnPSy+tqMi1AFas6MaqVa3O2aRW9O3bk1WrWvv/DZVj7NhDeeKJhVx00eWcfPIpZZ1b6T8PlbT1+uxNgVerNF8lVfNz6Ex8DtXDZ1EdfA7VwedQHarlObRV5JZckUTEMOA2snUu7wLOJZtg5ydkQ00/BSyMiMFlZHuDbH3Nga0cH9is3cbyjQWWkBWXM4EjUkrvlBIipbQeuJes4B5ZyjmS3quu7hAA5syZlXMSSZIk5aWcHswfANsBX0kp/W7DgxHxJbL3Hf8dOL2UC6aU3o6IJ4DWpp0cA7yUUnq1retExPuAucBQshluv7RhcRkRfShO6pNSureFy/QubteUkl3Se/XvP5LtttuNxYsX8corr7DNNtvkHUmSJElbWDljKg8C5rdUXAKklH4PzAcOLTPDImBYRNQ3/zIihgP1ZL2jrYqInYB5ZMXlz4GTWum5HEbWw3lxC9foQ9bz+RLwRJn5JRXV1R3KunXrmDt3Tt5RJEmSlINyCsxt2fj6kfcD5c7ucVFxe1ZEdAGIiALZe5Hw3llg36PY/nJgCHBuSulrKaUWl1ZJKT0G3APsGhHHNrtGgWyY7xDgf1o7X9LG1dVNBmD27Jk5J5EkSVIeyhki+wLvLvPRmonAy+UESCndEBFXAkcDSyLiZmAP4OPAVLIZYQGIiDOK55xR/Goy8CGy2WZXNh3fwPMppd8Wfz4FWABcHBGHk62z+fHiNW4Bzionu6T3GjRoLEOG7MqCBTezYsVy+vcfkHckSZIkbUHl9GDOAT4VESe1dDAi/pFsAqDZLR3fiOOB7wODgdPIhrN+Hzhugx7FHxQ/TfYqbnsC3212vPnnH5sap5TuBj5MVrjuBZwKDCje69MpJacTlTZTXd1k1q59m/nz5+YdRZIkSVtYOT2YZ5D1GP4+Ik4AbiWb3XUEsCdZL+ALwI/KDZFSWgucWfy01a6wwf5pZAVpOff6K3BUuRkllaaubjKLF5/J7NmzOOywI/OOI0mSpC2o5AIzpfR8ROxJ9k7kPsDeGzS5mWwdzGcrmE9SBzN48AQGDdqJG26Yx5tvvkmfPn3yjiRJkqQtpJx1MEenlB5NKX0S2B44BDiObNbYHVJKn0wpPdJOOSV1EIVCgbq6yaxe/SYLFtyUdxxJkiRtQeUMkb05Iv6UUjoqpfQ08HR7hZLUsdXVTebOO39GQ8MMDjzws3nHkSRJ0hZSziQ/w4DH2iuIpNoxbNgH6d9/JPPmXc/bb7+ddxxJkiRtIeUUmLeQzSLbs73CSKoNTcNkly9/g0WLFuYdR5IkSVtIOUNkzwf+C3goIq4DHgdWt9QwpfSrCmST1IHV10/mnnv+m9mzZ7HvvvvlHUeSJElbQDkF5lXNfj6ljXaNgAWm1MkNH/5R+vQZypw5DZxzzi/o2rVr3pEkSZLUzsopME9qtxSSak6XLl2pqzuEe+/9PXfcsYQ99vhY3pEkSZLUzspZB/PC9gwiqfbU1R3Kvff+ntmzZ1pgSpIkdQLl9GACEBEDgIOAScBA4GXgdmB+SsnpIiX9zahRn6BXr61oaJjFmWf+hC5dyplXTJIkSR1NWf/ai4gvAMuAS4BvAv8AfBeYCTwcEZ+udEBJHVfXrt3ZcceDeO65Z1i69J6840iSJKmdlVxgRsRBwB+Ku/8POATYDfg08EOgDzAjIj5c6ZCSOq76+skAzJ49K+ckkiRJam/lDJH9bN4e/QAAIABJREFULvAqsFtK6fENjt0QEVcAdwBnkA2hlSR22OFTdO/el4aGGfzHf5xBoVDIO5IkSZLaSTlDZCcCU1soLgFIKT0ETAP2qEQwSbWhe/fejBmzP48//hh/+cuDeceRJElSOyqnwHwd2NhCdo3Amk2PI6kWNQ2TbWiYkXMSSZIktadyCszzgGNbe8cyIgI4ErigArkk1ZAdd9yfrl170tAwM+8okiRJakflvIN5O/B/wG0RcTlwC/AM0Bv4MHAKsB54JSL+pfmJKaVfVSaupI6oR4/+jB69Hyk18MgjD7PTTnV5R5IkSVI7KKfAvL7Zz8cXP43F/eazdpy9wX4jYIEpdXL19VN49NEGGhpmcNppX887jiRJktpBOQXmSe2WQlLNGzv2ILp27c6sWRaYkiRJtarkAjOldGF7BpFU23r12opRo/bh/vvnsWzZ44wePSbvSJIkSaqwcib5kaTN0jSb7OzZs3JOIkmSpPZggSlpi9lpp4MpFLq4XIkkSVKNssCUtMX06TOEkSM/zt13/4lnn30m7ziSJEmqMAtMSVtUff1hAMye7ZqYkiRJtcYCU9IWVVd3CIVCgYYGC0xJkqRaY4EpaYvq1287hg/fndtvX8yLL76YdxxJkiRVUDnrYBIRvYC9gdFAz9bapZR+tXmxJNWyuropPPPMEq67roEvfOGLeceRJElShZRcYEbERKABGFH8qtBK00bAAlNSq+rqDmXBgm/S0DDDAlOSJKmGlNOD+UtgJHABcAewpj0CSap9AwfuwLBhH2LRolt49dVXGDKkf96RJEmSVAHlFJgfBK5KKdndIGmz1dVN5vnn72Lu3OuI+ErecSRJklQB5UzysxJ4rr2CSOpc6uunANDQMCPnJJIkSaqUcgrMS4BDI6JPe4WR1HkMGjSWIUN2ZcGCm1m+fHnecSRJklQB5QyR/R4wHrgvIn4HLAPeaqlhSskF7iRtVF3dZBYvPpOGhgb22+/gvONIkiRpM5VTYI4EdgJ2BH7SSpsC2SyyXTczl6ROoL5+CosXn8nUqVMtMCVJkmpAOQXmb4BxwOLiZ1W7JJLUaWyzzXi23jq4/vrrWbVqFX379s07kiRJkjZDOQXmHsDclNIB7RVGUudSKBSor5/M7befzU03zefggyfnHUmSJEmboZxJftYA97VXEEmdU12ds8lKkiTVinIKzBnAgRHRvb3CSOp8hg6dxKBBOzJv3lxWr16ddxxJkiRthnKGyH4LuBlYEBG/BR6hlfcwU0r2dEoqSaFQYPz4I1i8+BxuvvlGDjzws3lHkiRJ0iYqp8B8objtCuy+kbbOIiupZDvvfCSLF5/DzJnXWmBKkiR1YOUUmJeSLUEiSRW13XYfZODAHZg373rWrFlDr1698o4kSZKkTVBOgXlGSmlZewWR1HkVCgXq6g7jrrt+wc0338gBBxyUdyRJkiRtgnIm+bk5Iq5stySSOrWIwwCYOfPanJNIkiRpU5VTYA4DHm+vIJI6t2HDPsSAAdszd+51rFmzJu84kiRJ2gTlFJi3AJ+KiJ7tFUZS51UoFKivP4yVK1ewcOHNeceRJEnSJijnHczzgf8CHoqI68h6M1tctC6l9KtyQkREN+CrwJeBMcBzwB+Bn6SU1pZw/geB7wEfB/oDTwFXA2emlFZt0LYP8B3gc8CI4u/xa+A3KSUnMZJyFHEYd931S2bOvJbPfOaAvONIkiSpTOUUmFc1+/mUNto1AmUVmGQF3inAImAmsCfwI2AScERbJ0bEPsD1xd1pwLPAXmTrdu4bEXullNYU23YlKzwPBOYAU4EDgP8mK2y/XmZuSRU0bNiHGTBgFNdfP4e33nqLnj0dMCFJktSRlFNgntQeASJiD7LicipwVEqpMSIKwAXACRHx2ZRSQxuX+A3ZUN89U0p3Fq9ZAH5H1iP6T8DPi22PJisuf5ZS+kax7ffICtTTI+LClNL9lf4dJZWmaTbZu+8+l4ULb+LTn7YXU5IkqSMpucBMKV3YThlOLW5/2DREtVhkfgc4HvgS0GKBGRETgHHAtKbistn5PyIrMA/g3QLzVOAd4KxmbddGxH8Ai4GTgdMq+LtJKlNEVmDOnDndAlOSJKmDKacHE/jb+5L7Ae8DBqWUvhkRuwIrNnGdzL2Al1NKDzT/MqX0bEQ8BOzdxrnLyYbCPtDCsbeK237F3D2B3YClKaXXNmh7J/DmRu4laQvYbrvd6N9/pMNkJUmSOqByZpElIj4BPEbWo/j/gK8VDx0FPBwRZb3DWCz6RgKPttJkGbBVRAxp6WBK6emU0jkppTktHJ5S3D5Y3O5AVlD/3b1SSuvIJgaqLz29pPbQNJvs8uVvcMstziYrSZLUkZRcYEbE+8gmxulDNsR0WrPDtwPPA2dHxMFl3H/r4vb1Vo6/UdwOLOOaRMS2ZJMEAZxX3G5Twr36FHtoJeWovj77/6GZM6fnnESSJEnlKKeY+iGwBvhgSumJiPgBcBhASml2ROwG3AecDswq8Zrdi9u3Wjne9H2vUkNGxEBgNrAt8Ktm72aWc6+VrV1/0KA+dOvWtdQ4bRoypH9FrgPQvz/07Vuxy3Uqffs6BLMaNH8OdXV7MWDACObOncPAgT3p0aNHfsG6FIDK/nmtZp3l96x2Pofq4bOoDj6H6uBzqA7V/hzKKTA/DlyVUnqipYMppeci4iqy4bKlalpHs7V/PTb9i3NVK8ffoziU9nrgA2TDeL/W7HAp92okexezVa+91ubhkg0Z0p+XXlpRkWsBrFjRjVWryhrxLLKiZtWq1v7PQVtKS89hp52mcM89/820aTP51Kc+k1My2Hp9tjzuqxX881qtKv33kjaNz6F6+Cyqg8+hOvgcqkO1PIe2itxyKpJebLzQewfoXcY13wDW0/oQ2IHN2rUpIsYCS8iKy5nAESmld5o1aZrYp617rUwprd/YvSS1v4jDAJg1a0bOSSRJklSqcgrM/wP2i4gWz4mI7sBngFTqBVNKbwNPAGNaaTIGeCml9Gpb1ym+H7oYGAtcCByeUtqwW2oZ8HZL94qIrsCocrJLal/Dh+9Ov34jmDOngbVr1+YdR5IkSSUop8A8H9gFuCAitml+ICKGApcCdcAfy8ywCBgWEe+ZwTUihpPN6np7WydHxE7APGAo2XqXJ23QcwlA8bs7gPdHxIZ9uruRTV60pMzsktpJodCF+vrJvPHG69x664K840iSJKkEJReYKaXfApcAxwEvAt8EiIhlwLPAEcAM4NdlZriouD2rqXc0IgrAj4vfn9fiWVm7LsDlwBDg3JTS11JKjRu5V0+yCYuartEdOLO4e36Z2SW1o/r6bJiss8lKkiR1DGUtyZFSOiEiZgEnk73r2B0YQNYLeUFK6YJyA6SUboiIK4GjgSURcTOwB9mkQlPJZoQFICLOKJ5zRvGrycCHyGaAXdl0fAPPF4tjyHpXTwL+LSJ2Be4G9gcmAT9LKd1fbn5J7WfEiI/Sr99w5sxp4Kc//SXdu3ff+EmSJEnKTdlrPqaUrgaubu14RPRJKZU71erxwIPAicBpwJPA94FzNuiR/EFxe0Zxu1dx2xP4bivXvhf4bTH7uojYn6wH8yjgY8CjwD8D/1NmZkntrFDoQl3dZP78599w660L2XffT+UdSZIkSW0oucCMiMeAX6aUftVGm++TFWtDywmRUlpLNkz1zI20K2ywfxpZQVrOvVaQrdV5ejnnScpHxGH8+c+/YebMay0wJUmSqlyrBWZEjCYb/tpkNDAuIia2ckoP4FNA30qFk6QRI/agX7/hNDTM4pxzfkGPHq0tZStJkqS8tTXJz+7AUuDPxU8j8A/N9jf83EE25PTWdswrqZMpFLoQcTjLl7/OwoU35R1HkiRJbWi1BzOldEVEvJ9suGsBOIHsfcalLTRvBNYCz1D+LLKS1KZx447k7rv/i2uvncZ+++2fdxxJkiS1os13MFNK32r6OSL2Bv7Y1juYktQehg37MAMH7sB1181m9erV9O7dO+9IkiRJakE562COsbiUlIdCoUDEkaxatZIbb5yfdxxJkiS1ouQCU5LyFHEEANOnT8s5iSRJklpjgSmpQxg6dBKDBtUxb971rFy5Mu84kiRJaoEFpqQOoVAoMG7ckaxZs5p5867LO44kSZJaYIEpqcOIOBKA6dOvyTmJJEmSWmKBKanDGDx4PIMH78KNN87njTdezzuOJEmSNrBJBWZEjI+Iz0XEqcX97SOiX2WjSdLfGzfuCNaufZvrrpuddxRJkiRtoKwCMyImRMTtwAPAJcC5xUMnAU9HxFEVzidJ7/HuMFlnk5UkSao2JReYETEGuAV4P3AZcBNQKB5+vHityyLiY5UOKUlNBg0ay7bbfpCFC2/mlVdeyTuOJEmSmimnB/NMoA/w0ZTS8cCipgMppYuA3YE3ge9UNKEkbWDcuCNYt24ds2fPzDuKJEmSmimnwNwPuCqldE9LB1NKfwGuBj5QiWCS1JqIwwGHyUqSJFWbcgrMAcCLG2nzOjBw0+NI0sYNGLA9I0Z8lNtuu5UXXng+7ziSJEkqKqfAfAz4eGsHI6IAfKLYTpLaVcSRNDY2MmvW9LyjSJIkqaicAvMS4CMRcVZEvOe8iOgJ/Bx4H3BFBfNJUosiDqNQ6MK11zpMVpIkqVqUU2D+DLgZ+DbwEnAKQEQsAJ4G/hW4E/hpZSNK0t/r23cYI0d+nD/96Q6efvqpvONIkiSJMgrMlNJa4DPAt8gKzO3IlinZC1gF/AjYJ6X0VjvklKS/M25ctibmjBnX5pxEkiRJUF4PJimld1JKP00pjQP6AyOBrVJKo1NKZ6SU1rRLSklqQV3dZLp06eZsspIkSVWiW6kNI6IBuBiYmVJanVJaRdZzKUm56NNnMNtvvy/33juPxx57lB13HJt3JEmSpE6tnB7MA4DLgBci4sKI2G/DyX4kaUtrGiZ7zTVX55xEkiRJ5RSII4GvAX8BjgeuB56JiF9ExIfbI5wkbUxd3aF069abadOuorGxMe84kiRJnVo5k/w8l1L6ZUppd2AM8O/A82Szx94eESkivhcRjlGTtMX07DmAsWM/y6OPPsLSpffkHUeSJKlT26QhrimlJ1JKZ6eU3g8E8D1gLXAGkCoXT5I2bsKEzwEwbdpVOSeRJEnq3DbrHcqI2A7YH9gHqCNbtuSRCuSSpJKNHr0fvXtvw7XXTuOdd97JO44kSVKnVXaBGRFDIuIrEbEAeAo4F9gV+C3wkeISJpK0xXTt2p36+sN56aUXueWWBXnHkSRJ6rTKWabky8BRwN7F894ErgQuAeallNa1S0JJKsGECZ/j3nvPY9q0q9h330/lHUeSJKlTKrnABH4HrANuIisqrymuhSlJuRs+fHcGDhzN7NmzOOecVfTt2zfvSJIkSZ1OOUNkvwaMSil9JqV0scWlpGpSKBQYP/4Y3nxzFXPnzsk7jiRJUqdUzjIlv0gpPd+eYSRpc4wf72yykiRJeWp1iGxE3AP8NqV0XrP9UjSmlD5YiXCSVI5ttgm23fb93HTTDbz88ssMHjw470iSJEmdSlvvYL4PGLbBviRVtfHjP8eCBX9mxoxrOPnkU/KOI0mS1Km0WmCmlLq0tS9J1WjcuCNZuPDbTJ16pQWmJEnSFlZy0RgRe0XE9htpMz4ivrD5sSRp0/Trtx3bb78Pd9/9Jx5//LG840iSJHUq5fRK3gxsrHg8Efj1JqeRpAoYP/4YAK655uqck0iSJHUubU3ycwSwR7OvCsABETGolVN6AEcDLl8iKVd1dYdyww1fZerUKzn99G9SKBTyjiRJktQptDXJz73AJWSFI0AjsHvx05bvViCXJG2ynj0HMHbswaR0Nffe+2fe974P5B1JkiSpU2hrkp+HI2I3YBBZ7+VNwAXAhS00bwTWAs+klJ5sh5ySVJYJE44hpauZOvVKC0xJkqQtpK0eTFJK9zX9HBE/BG5OKd3S7qkkaTONHr0fvXtvw7XXTuOMM/4f3bq1+dedJEmSKqDkSX5SSj8spbiMiDGbF0mSNl/Xrj2orz+cl156kVtvXZh3HEmSpE6hrP/Sj4gDgc8DQ4GuZENnKW67A9sA9cVjkpSrCROO4d57z2Pq1CvZZ59P5h1HkiSp5pVcYEbEYcDVvFtUtmQVMGNzQ0lSJQwf/lEGDhzN7NmzOPvslfTr1y/vSJIkSTWtnHUwTwfeAY4ChgF/Bs4v/rwvcDfZZD/fqnBGSdokhUKBCRM+z5tvrmL27Jl5x5EkSap55QyR3RWYnlKaChARi4BPpZReBF6MiM8AiWyZkhPLCRER3YCvAl8GxgDPAX8EfpJSWlvmtT4LzALen1Ja2sLxi4HjWjn97JTSt8u5n6TqtvPOx7FkyVlcccWlHH305/OOI0mSVNPKKTB7AY802/8r8E8R0TOl9FZK6dWImA58fBNy/Bo4BVgEzAT2BH4ETAKOKPUiETGerDBtyyTgBeC3LRxbVOq9JHUMW221IyNHfpzbbruVJ55Yxg47jM47kiRJUs0qp8B8ARjSbP9RsiG2OwP3FL97GRhZToCI2IOsuJwKHJVSaoyIAtmamydExGdTSg0lXGcf4EpgcBttugPjgIaU0hnl5JTUce2yy/E8/fStXHXV5XzjG9/JO44kSVLNKucdzIXA4RFRX9y/t7g9tFmbPYFXy8xwanH7w5RSI0Bx+x2ydzq/1NbJEdE7In4P3ED2+9zTRvPxZLPd3tdGG0k1pr7+MLp378uVV17O+vXr844jSZJUs8opMH8C9Abuj4gjUkovkL3r+O8RcWVE3ExWYM4vM8NewMsppQeaf5lSehZ4CNh7I+dvC5wMzCYb/np/G20nFrcWmFIn0qNHP+rrp/Dkk8tYsuS2vONIkiTVrJILzJTSg8AngJuAN4pff5XsXcwjyQrBP5H1PJYkInqSDal9tJUmy4CtImJIK8cBXgM+llI6JKX0zEZu2VRgRkTcFhErIuLFiPhjRAwvNbekjmeXXU4A4IorLs05iSRJUu0qpweTlNKdKaUDUkrzi/tPpZR2Bd5H9m7jR4uzypZq6+L29VaONxWyA9vI9EZKqdQuiaYC83vA48B5ZL2kJwJ3RkRZ749K6jhGjvwYAweOZtasGaxcuTLvOJIkSTWpnEl+WpVS2tQhp92L27daOd70fa9NvP6GVgMPA1OKPbIARMR3gf8EfgUc1tYFBg3qQ7duXSsSZsiQ/hW5DkD//tC3b8Uu16n07dsz7whiyzyH973vRBYuPIOFC+dy4oknlnZSlwJQ2T+v1ayz/J7VzudQPXwW1cHnUB18DtWh2p9DqwVmRPx8E6/ZmFL6WoltVxe3PVo53vQvzlWbmOU9UkpTWjn0Y7L3OA+OiH4ppVa7N1577c1KRGHIkP689NKKilwLYMWKbqxaVVaHtMiKmlWrWvv/DW0pW+o51NUdzcKFZ3D++f/LQQcdXtI5W69vBODVCv55rVaV/ntJm8bnUD18FtXB51AdfA7VoVqeQ1tFbls9mKdt4v0agVILzDeA9bQ+BHZgs3btJqW0PiLuBcaQvRP61/a8n6R8bLXVGEaN2pvFixeybNnjjB49Ju9IkiRJNaWtAnOf9r55SuntiHiCrLBryRjgpZRSuUuf/J2I6EP2DubqlNK9LTTpXdyu2dx7Sapeu+xyPE89tZArr7yMb33ru3nHkSRJqimtFpgppYVbKMMi4PiIqE8pPdT0ZXFW13qypVAqYRiwhGwZk4nNDxSLzw8ALwFPVOh+kqpQXd0UbrzxNK688nK+8Y3v0KWLQ8slSZIqpeRJfiJiQKltU0rLy8hwEXA8cFZEHFUcrlogey8SspleN1tK6bGIuAf4QEQcm1K6FKB4r58AQ4AfpZQaK3E/SdWpR4++1NcfxgMPXMTixYv42Mf2yjuSJElSzSjnv+5fJ1tzspRPyVJKNwBXAocDSyLiJ8BC4ARgKjC7qW1EnBERZ5Rz/Q2cAqwELo6Ia4oTGd1Jtp7nLcBZm3FtSR3EzjsfD7gmpiRJUqWVU2De0srnLuBVoADcQbbUR7mOB74PDCabXGhYcf+4DXoUf1D8bJKU0t3Ah8kK172AU4EBxXt9OqXkdKJSJzBy5MfYaqsxxTUx85+JTZIkqVaUPEQ2pfSJto5HxD8BPwNOLzdESmktcGbx01a7QgnXOhE4sY3jfwWOKi+hpFpSKBTYeefjue22HzFz5nQ+//nj844kSZJUEyo2u0VK6TfAzTjMVFIHMGHCsYDDZCVJkiqp0tMn3kc2BFWSqtrAgTuw/faf4PbbF/PYY4/mHUeSJKkmVKzAjIguwN7A6kpdU5LaU9NkP1dddVnOSSRJkmpDOcuU/Esrh7oAfYEDgI8AF1YglyS1u/r6Kdx0079x2WWX8PWvf4du3Ur+K1GSJEktKOdfU78EGslmi23N3cC3NyuRJG0h3bv3Yfz4z7F06e+44YZ57L//gXlHkiRJ6tDKKTBPauX7RuBt4K8ppaWbH0mStpyJE09m6dLfcfHFf7TAlCRJ2kzlLFPi0FdJNWfo0Ilst91u3HjjfJ5++ilGjhyVdyRJkqQOa5NeOIqInkDP1o6nlJZvciJJ2sImTvwic+feyaWXXsS3vvXdvONIkiR1WCXPIhsRvSLi/4uI54A3gdda+bzaHkElqb1EHEnPngO49NKLeOedd/KOI0mS1GGV04N5DvDPwHLgTmBNuySSpC2sR4++TvYjSZJUAeUUmIcBDwB7ppRWtFMeScqFk/1IkiRtvpKHyAIDgDkWl5Jq0dChExk27MN/m+xHkiRJ5SunwFwMvL+9gkhS3iZNOpn169dz6aUX5R1FkiSpQyqnwDwd+HBEnB0RQ9srkCTlJeJIevToz6WXXuxkP5IkSZugnHcw/wpMA74OfD0iVgNvt9CuMaW0TSXCSdKW1DTZz733nudkP5IkSZugnB7MM4EvAgXgFeAl4I0WPq6BKanDmjTpSwBcfPEfc04iSZLU8ZTTg3kS8ASwf0rpoXbKI0m52nCyn63zDiRJktSBlNODORCYZnEpqdZNmvRFJ/uRJEnaBOUUmPcAY9oriCRVi4ij/jbZT2NjY95xJEmSOoxyCszvAp+NiK9GRDlDayWpQ2ma7Of5559lzZo1eceRJEnqMMopFI8DHgZ+CZwdEU8Bq1po15hS+mAlwklSXiZNOpl77z2PlStX0Lt377zjSJIkdQjlFJhfavZzL6CulXaOJ5PU4Q0dOolhwz7Mmuf/5JqYkiRJJSq5wEwplTOcVpI6vEmTTobn/8SqlSvzjiJJktQhWDRKUivGjTuaQqELK1et9F1MSZKkEpTcgxkRE0ttm1K6b9PiSFL16N69N7179+PNN5cza/o0jjnm2LwjSZIkVbVy3sFcSunvV3bdhCySVHWaCszzz/8tRx/9eQqFQt6RJEmSqlY5BeZFtFxg9gHGAh8AbgWuqUAuSaoKXbt2o3fv3tx//73cccft7L77R/OOJEmSVLXKmeTnxLaOR8RBwDTg7M3MJElVpX///rB6Nf/7v7+zwJQkSWpDxSb5SSnNBmYCP6jUNSWpGvTs2YsJE3ahoWEGzz77TN5xJEmSqlalZ5F9DNilwteUpNx9+cv/yLp167jggv/NO4okSVLVqliBGRG9gIOA1yt1TUmqFocddiSDBg3ioov+wOrVq/OOI0mSVJXKWabk560c6gL0BfYFRgP/tfmxJKm69O7dm+OPP4lf/ernTJ8+jc997ri8I0mSJFWdcmaRPW0jx9eRzSD7H5seR5Kq14knnsyvf30uv//97zjmmGNdskSSJGkD5RSY+7TyfSPwNvBISunlzY8kSdVp5MhRHHjgwcyaNd0lSyRJklpQzjIlC9sziCR1BF/60j8wa9Z0fv/731pgSpIkbaCkSX4is00rx34YEXtWNpYkVafdd9+DnXfeldmzZ/LMM0/nHUeSJKmqtFlgRkTPiLgCeJBshtgNjw8DvgfcEhHXRsSA9okpSdWhUCj8bcmSCy/8Q95xJEmS/v/27ju8ijLt4/j3hCAYqkiCgkqx3FYQlSJNsSJ2saPIquyuCoq4gopS7CKLDQVlwYIKutixs6KCgNiw7MoNFsBXVJAmRaQk7x8zJx5COieZE/L7XFeuyZl5ZuaemZRzn6ellAITTDOrArwOnA38AOTXv3IdMAD4FjgVeMXMNOqFiGzXTj/9TOrVq6cpS0RERETyKKwG82/AkcCTwN7u/lreAu7+m7vfDbQAXgI6AJeUQZwiIikjPmXJ8uXLefHF56IOR0RERCRlFJZgdgcWAZe4+6bCDuLuvwMXEdRy9kheeCIiqalnz0uoUqUKY8aMJicnJ+pwRERERFJCYQnmgcCb7r6xOAdy99+At4DmyQhMRCSVNWq0GyeeeApfffUF06ZpkG0RERERKDzBTAdWlvB4PwJVSx+OiEjFccUVVwLwwAP3RByJiIiISGooLMFcBOxVwuPtRZBkiohs91q2PJQOHTrx3ntT+eKLOVGHIyIiIhK5whLM94ETwqlIihSWOxH4IhmBiYhUBL179wVg5Mh7I45EREREJHqFJZijgWrApKLmtzSzWsDzwA7hfiIilULnzkdz4IHNefnlF1mw4PuowxERERGJVHpBG9z9MzO7DbgRcDMbSTCIzzxgNbATQZPY44DeQCYwzt2nlDQIM0sH+gC9gKbAT8CjwJ3FHWQo4VgnAa8ALd19qzZrZpYBXA+cBzQCvgceBB5ydw0FKSIlEovF6N37Kv7+90sYNeoB7rprRNQhiYiIiESmsBpMgMHAIKAecDMwC1gObASWADOAoUAd4C7gr6WM40FgBLAMuI+gH+fNwISSHMTM9iNITAvaXgX4N2HSHJ5rIzASuLs0gYuInHLK6eyxR2MmTHiSpUuXRh2OiIiISGQKTTDdPcfdbyWYsuQO4DNgKUFS9jNBgnkTsJ+7X+/u2SUNwMzaESSmk4CIcfFUAAAgAElEQVRO7n4d0Al4AugW1kgW5zidgfeA+oUUOwfoCgx39xPDcx0GvAP0M7ODShq/iEh6ejqXXdab9evXM3asegmIiIhI5VVUDSYA7j7f3W9098PcfRd3r+7ujdy9o7vf5u7b0vHoinA5NN5ENVxeD+QAlxa2s5ntaGb/AqYQXM+nRZxrE3B7fEXYBPdGIAZcUsprEJFK7rzzLmTnnXdm3LgxrFmzJupwRERERCJRrASzjHUCfnX3rxJXuvtigv6eRxSxfwOCxPBVoAXwZX6FzKwa0BqY4+4r8myeDawrxrlERPKVkZHBJZf8jZUrV/Lkk49FHY6IiIhIJCJNMMOkbzfg2wKKLADqmllmIYdZAXRw91PcvbA5OBsTDGq01bncfTPwA7BPceIWEcnPxRf3IiMjg9GjH2TjxhKNTyYiIiKyXYi6BrNeuFxZwPZV4bJOQQdw91Xu/kExzrVzMc6VEY5oKyJSYvXq7cwFF1zE4sU/8vzz/446HBEREZFyF3UyVTVc/lHA9vj66uV8rgI7UO20Uwbp6VWSEA5kZtZKynEAatWCGjWSdrhKpUaNalGHIKTuc0hLi1Elrfi/rzfcMICxYx9h9OgHuPzyXqSlRf05Xskk8++SlJ6eQ+rQs0gNeg6pQc8hNaT6c4g6wfw9XO5QwPb4O8615XSuHIK+mAVasaLQzcWWmVmLpUtXJ+VYAKtXp7N2bcV6I5sKatSoxtq1BX3mIOUllZ9DdnYOm7NheTF/XzMy6nH66WcyadIzTJgwieOOO6GMI0yeZP9dktLRc0gdehapQc8hNeg5pIZUeQ6FJblRZySrgGwKbgJbJ6HctooP7FPYudaUZqoVEZFEvXv3BeCBB+6NOBIRERGR8hVpgunuG4CFQNMCijQFlrr78iScbgGwIb9zmVkVYHfAk3AeEank9t//AI455jg+/HAms2d/GHU4IiIiIuUm6hpMgOnALma2xQiuZtaQYFTXWck4ibtvAj4EWppZ3jrd1kAGMDMZ5xIR6dPnagDuv/+fEUciIiIiUn5SIcF8IlzebmZpAGYWA+4I1z+S5HNVA4bGV5hZVeCW8OWYJJ5LRCqxtm3b0abN4bz11ht89tknUYcjIiIiUi4iTzDdfQrwDNANmGlmdwLvAT2AScCr8bJmNsTMhmzD6R4FZgBXm9nb4bk+Ao4Ghrv7l9twbBGRXLFYjAEDBgJw9913FFFaREREZPsQeYIZuhAYBNQH+gK7hK8vcPechHKDw69ScffNQBfgHmA/4CqCkXR7AwNKe1wRkfx06NCJ9u07MmXKW3z88eyowxEREREpc1FPUwKAu28kaKZ6SxHlYsU4Vk+gZyHbVwP9wi8RkTLVv/8NnHrqCQwbdjvPPvti1OGIiIiIlKlUqcEUEdkuHX54ezp16sy7777DrFkaR0xERES2b0owRUTKWP/+NwBw9923RxyJiIiISNlSgikiUsZat25D585HM23ae8yYMT3qcERERETKjBJMEZFyEK/FvOuu28jJySmitIiIiEjFpARTRKQcHHpoK4499nhmzvyA6dPfjzocERERkTKhBFNEpJyoFlNERES2d0owRUTKSYsWLenS5URmz57Fu+++E3U4IiIiIkmnBFNEpBxde+31AAwbdrtqMUVERGS7owRTRKQcHXRQc0488RQ++eQj3nnn7ajDEREREUkqJZgiIuUsXoupvpgiIiKyvVGCKSJSzvbf/wBOPfUM5sz5jDfeeC3qcERERESSRgmmiEgE+ve/gSpVqnDzzTexcePGqMMRERERSQolmCIiEdh773248MKefPvtNzzxxLiowxERERFJCiWYIiIRufbaG6hZsxZ3330Hv/22KupwRERERLaZEkwRkYhkZmbSt+81LF++nHvv/WfU4YiIiIhsMyWYIiIR+utfL2e33XbnkUceYtGihVGHIyIiIrJNlGCKiESoevXqDBw4mA0bNnDbbUOiDkdERERkmyjBFBGJ2Omnn0nLlofwwgvP8cknH0UdjoiIiEipKcEUEYlYWloaQ4feDsCgQTeQk5MTcUQiIiIipaMEU0QkBbRt246uXU/mo48+ZPLkl6IOR0RERKRUlGCKiKSIQYOGkp6ezs03D+KPP/6IOhwRERGRElOCKSKSIpo124uLL+7FwoULGDduTNThiIiIiJSYEkwRkRRyzTUDqFOnLiNGDGP58mVRhyMiIiJSIkowRURSyE471aNfv/6sWrWSESOGRR2OiIiISIkowRQRSTEXX9yLxo2bMG7cGNznRh2OiIiISLEpwRQRSTHVqlXj1lvvYtOmTVx7bV+ys7OjDklERESkWJRgioikoOOPP4ETTjiJWbNm8MwzT0cdjoiIiEixKMEUEUlRt98+jBo1ajJ06I0sW6YBf0RERCT1KcEUEUlRjRrtxoABN7B8+XKGDr0x6nBEREREiqQEU0QkhV166d858MDmTJz4FDNmTI86HBEREZFCKcEUEUlh6enpDB9+L7FYjGuv7cuGDRuiDklERESkQEowRURS3CGHHEbPnpcwf/48HnzwvqjDERERESmQEkwRkQpg4MDBZGU14J577ub777+LOhwRERGRfCnBFBGpAGrXrsMtt9zB+vXrGTCgHzk5OVGHJCIiIrIVJZgiIhXEaad148gjj+Ldd9/hpZeejzocERERka0owRQRqSBisRh33TWC6tWrc+ON17Fq1cqoQxIRERHZghJMEZEKpGnTZlx99bUsWfILt946NOpwRERERLagBFNEpIK5/PIr2Xff/Xj88bG8886UqMMRERERyaUEU0SkgqlWrRoPPvgIVatW5aqrLmf58mVRhyQiIiICKMEUEamQDjqoBf3738Avv/zMgAHXaFRZERERSQlKMEVEKqjevfvSqlUbXnrpeZ5//t9RhyMiIiKiBFNEpKKqUqUKI0c+TEZGDQYMuIYff/y/qEMS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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import matplotlib\n", "import seaborn as sns\n", "from scipy.stats import norm\n", "\n", "fig, ax = plt.subplots(figsize=(15,10))\n", "freqs = term_freq_df.pos_freq_pct[term_freq_df.pos_freq_pct > 0]\n", "log_freqs = np.log(freqs)\n", "\n", "sns.distplot(log_freqs[:1000], kde=False, rug=True, hist=False, rug_kws={\"color\": \"k\"})\n", "\n", "x = np.linspace(log_freqs.min(), \n", " log_freqs.max(), \n", " 100)\n", "frozen_norm = norm(log_freqs.mean(), log_freqs.std())\n", "y = frozen_norm.pdf(x)\n", "plt.plot(x, y ,color='k')\n", "term = 'beauty'\n", "word_freq = log_freqs.loc[term]\n", "term_cdf = frozen_norm.cdf(word_freq)\n", "plt.axvline(x=word_freq, color='red', label='Log frequency of \"'+term+'\"')\n", "plt.fill_between(x[x < word_freq], \n", " y[x < word_freq], y[x < word_freq] * 0, \n", " facecolor='blue', \n", " alpha=0.5,\n", " label=\"Log-normal CDF of %s: $%0.3f \\in [0,1]$\" % (term, term_cdf) )\n", "ax.set_xlabel('Log term frequency')\n", "ax.set_ylabel('Cumulative term probability')\n", "plt.legend()\n", "for item in ([ax.title, ax.xaxis.label, ax.yaxis.label] +\n", " ax.get_xticklabels() + ax.get_yticklabels() ):\n", " item.set_fontsize(20)\n", "plt.rc('legend', fontsize=20) \n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Problem: harmonic means are dominated by the precision\n", "### Take the normal CDF of precision and frequency percentage scores, which will fall between 0 and 1, which scales and standardizes both scores.\n", "\n", "Define the the Normal CDF as:\n", "\n", "$$ \\Phi(z) = \\int_{-\\infty}^z \\mathcal{N}(x; \\mu, \\sigma^2)\\ \\mathrm{d}x.$$\n", "\n", "Where $ \\mathcal{N} $ is the PDF of the Normal distribution, $\\mu$ is the mean, and $\\sigma^2$ is the variance.\n", "\n", "$\\Phi$ is used to scale and standardize the precisions and frequencies, and place them on the same scale $[0,1]$.\n", "\n", "Now we can define Scaled F-Score as the harmonic mean of the Normal CDF transformed frequency and precision:\n", "\n", "$$ \\mbox{S-CAT}_{\\beta}(i, j) = \\mathcal{H}_{\\beta}(\\Phi(\\mbox{prec}(i, j)), \\Phi(\\mbox{freq}(i, j))).$$\n", "\n", "$\\mu$ and $\\sigma^2$ are defined separately as the mean and variance of precision and frequency.\n", "\n", "A $\\beta$ of 2 is recommended and is the default value in Scattertext.\n", "\n", "Note that any function with the range of $[0,1]$ (this includes the identity function) may be used in place of $\\Phi$. Also, when the precision is very small (e.g., of a tiny minority class) normalization may be foregone." ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Positive freqNegative freqpos_precisionpos_freq_pctpos_hmeanpos_precision_normcdfpos_freq_pct_normcdfpos_scaled_f_score
term
best108360.7500000.0022110.0044100.7194830.9950080.835107
entertaining58130.8169010.0011880.0023720.7706900.9093940.834316
fun73260.7373740.0014950.0029830.7092330.9562590.814427
heart45110.8035710.0009210.0018410.7609240.8449000.800716
great61230.7261900.0012490.0024940.7000110.9209360.795418
still63260.7078650.0012900.0025750.6846200.9279880.787940
our42110.7924530.0008600.0017180.7526080.8265050.787827
performance53190.7361110.0010850.0021670.7081990.8874540.787758
love61250.7093020.0012490.0024940.6858390.9209360.786188
both52190.7323940.0010650.0021260.7051430.8826450.783972
\n", "
" ], "text/plain": [ " Positive freq Negative freq pos_precision pos_freq_pct \\\n", "term \n", "best 108 36 0.750000 0.002211 \n", "entertaining 58 13 0.816901 0.001188 \n", "fun 73 26 0.737374 0.001495 \n", "heart 45 11 0.803571 0.000921 \n", "great 61 23 0.726190 0.001249 \n", "still 63 26 0.707865 0.001290 \n", "our 42 11 0.792453 0.000860 \n", "performance 53 19 0.736111 0.001085 \n", "love 61 25 0.709302 0.001249 \n", "both 52 19 0.732394 0.001065 \n", "\n", " pos_hmean pos_precision_normcdf pos_freq_pct_normcdf \\\n", "term \n", "best 0.004410 0.719483 0.995008 \n", "entertaining 0.002372 0.770690 0.909394 \n", "fun 0.002983 0.709233 0.956259 \n", "heart 0.001841 0.760924 0.844900 \n", "great 0.002494 0.700011 0.920936 \n", "still 0.002575 0.684620 0.927988 \n", "our 0.001718 0.752608 0.826505 \n", "performance 0.002167 0.708199 0.887454 \n", "love 0.002494 0.685839 0.920936 \n", "both 0.002126 0.705143 0.882645 \n", "\n", " pos_scaled_f_score \n", "term \n", "best 0.835107 \n", "entertaining 0.834316 \n", "fun 0.814427 \n", "heart 0.800716 \n", "great 0.795418 \n", "still 0.787940 \n", "our 0.787827 \n", "performance 0.787758 \n", "love 0.786188 \n", "both 0.783972 " ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy.stats import norm\n", "\n", "def normcdf(x):\n", " return norm.cdf(x, x.mean(), x.std ())\n", "\n", "term_freq_df['pos_precision_normcdf'] = normcdf(term_freq_df.pos_precision)\n", "\n", "term_freq_df['pos_freq_pct_normcdf'] = normcdf(term_freq_df.pos_freq_pct.values)\n", "\n", "term_freq_df['pos_scaled_f_score'] = hmean([term_freq_df['pos_precision_normcdf'], term_freq_df['pos_freq_pct_normcdf']])\n", "\n", "term_freq_df.sort_values(by='pos_scaled_f_score', ascending=False).iloc[:10]\n" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Positive freqNegative freqpos_precisionpos_freq_pctpos_hmeanpos_precision_normcdfpos_freq_pct_normcdfpos_scaled_f_score
term
brawny010.00.00.00.1130860.4599310.181537
derivativeness010.00.00.00.1130860.4599310.181537
blatant010.00.00.00.1130860.4599310.181537
jams010.00.00.00.1130860.4599310.181537
staleness010.00.00.00.1130860.4599310.181537
luck020.00.00.00.1130860.4599310.181537
screenplays020.00.00.00.1130860.4599310.181537
tripe010.00.00.00.1130860.4599310.181537
lackluster060.00.00.00.1130860.4599310.181537
stoop010.00.00.00.1130860.4599310.181537
\n", "
" ], "text/plain": [ " Positive freq Negative freq pos_precision pos_freq_pct \\\n", "term \n", "brawny 0 1 0.0 0.0 \n", "derivativeness 0 1 0.0 0.0 \n", "blatant 0 1 0.0 0.0 \n", "jams 0 1 0.0 0.0 \n", "staleness 0 1 0.0 0.0 \n", "luck 0 2 0.0 0.0 \n", "screenplays 0 2 0.0 0.0 \n", "tripe 0 1 0.0 0.0 \n", "lackluster 0 6 0.0 0.0 \n", "stoop 0 1 0.0 0.0 \n", "\n", " pos_hmean pos_precision_normcdf pos_freq_pct_normcdf \\\n", "term \n", "brawny 0.0 0.113086 0.459931 \n", "derivativeness 0.0 0.113086 0.459931 \n", "blatant 0.0 0.113086 0.459931 \n", "jams 0.0 0.113086 0.459931 \n", "staleness 0.0 0.113086 0.459931 \n", "luck 0.0 0.113086 0.459931 \n", "screenplays 0.0 0.113086 0.459931 \n", "tripe 0.0 0.113086 0.459931 \n", "lackluster 0.0 0.113086 0.459931 \n", "stoop 0.0 0.113086 0.459931 \n", "\n", " pos_scaled_f_score \n", "term \n", "brawny 0.181537 \n", "derivativeness 0.181537 \n", "blatant 0.181537 \n", "jams 0.181537 \n", "staleness 0.181537 \n", "luck 0.181537 \n", "screenplays 0.181537 \n", "tripe 0.181537 \n", "lackluster 0.181537 \n", "stoop 0.181537 " ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "term_freq_df.sort_values(by='pos_scaled_f_score', ascending=True).iloc[:10]" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "freq = term_freq_df.pos_freq_pct_normcdf.values\n", "prec = term_freq_df.pos_precision_normcdf.values\n", "html = st.produce_scattertext_explorer(\n", " corpus.remove_terms(set(corpus.get_terms()) - set(term_freq_df.index)),\n", " category='Positive',\n", " not_category_name='Negative',\n", " not_categories=['Negative'],\n", " \n", " x_label = 'Portion of words used in positive reviews (norm-cdf)',\n", " original_x = freq,\n", " x_coords = (freq - freq.min())/freq.max(),\n", " x_axis_values = [int(freq.min()*1000)/1000., \n", " int(freq.max() * 1000)/1000.],\n", " \n", " y_label = 'documents containing word that are positive (norm-cdf)', \n", " original_y = prec,\n", " y_coords = (prec - prec.min())/prec.max(),\n", " y_axis_values = [int(prec.min() * 1000)/1000., \n", " int((prec.max()/2.)*1000)/1000., \n", " int(prec.max() * 1000)/1000.],\n", " scores = term_freq_df.pos_scaled_f_score.values,\n", " \n", " sort_by_dist=False,\n", " show_characteristic=False\n", ")\n", "file_name = 'normed_freq_prec.html'\n", "open(file_name, 'wb').write(html.encode('utf-8'))\n", "IFrame(src=file_name, width = 1300, height=700)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## A second problem: low scores are low-frequency brittle terms.\n", "## Make the approach fair to negative scoring terms\n", "### Solution: compute SFS of negative class. If that score has a higher magnitude than the positive SFS, keep that, but as a negative score.\n", "\n", "Define the Scaled F-Score for category $j$ as\n", "$$ \\mbox{S-CAT}^{j} = \\mbox{S-CAT}_{\\beta}(i, j). $$\n", "\n", "Define a class $\\neg j$ which includes all categories other than $j$.\n", "\n", "and the Scaled F-Score for all other categories as\n", "$$ \\mbox{S-CAT}^{\\neg j} = \\mbox{S-CAT}_{\\beta}(i, \\neg j). $$\n", "\n", "Let the corrected version of Scaled F-Score be:\n", "\n", "$$\\mathcal{S}_{\\beta} = 2 \\cdot \\big(-0.5 + \\begin{cases}\n", " \\mbox{S-CAT}^{j} & \\text{if}\\ \\mbox{S-CAT}^{j} > \\mbox{S-CAT}^{\\neg j}, \\\\\n", " 1 - \\mbox{S-CAT}^{\\neg j} & \\text{if}\\ \\mbox{S-CAT}^{j} < \\mbox{S-CAT}^{\\neg j}, \\\\\n", " 0 & \\text{otherwise}.\n", " \\end{cases} \\big).$$\n", " \n", "Note that the range of $\\mathcal{S}$ is now $[-1, 1]$, where $\\mathcal{S} < 0$ indicates a term less associated with the category is question than average, and a positive score being more associated." ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Positive freqNegative freqpos_precisionpos_freq_pctpos_hmeanpos_precision_normcdfpos_freq_pct_normcdfpos_scaled_f_scoreneg_precision_normcdfneg_freq_pct_normcdfneg_scaled_f_scorescaled_f_score
term
best108360.7500000.0022110.0044100.7194830.9950080.8351070.2805170.8054910.4161180.670214
entertaining58130.8169010.0011880.0023720.7706900.9093940.8343160.2293100.5963360.3312460.668633
fun73260.7373740.0014950.0029830.7092330.9562590.8144270.2907670.7233800.4148010.628854
heart45110.8035710.0009210.0018410.7609240.8449000.8007160.2390760.5754150.3378010.601433
great61230.7261900.0012490.0024940.7000110.9209360.7954180.2999890.6958020.4192300.590836
still63260.7078650.0012900.0025750.6846200.9279880.7879400.3153800.7233800.4392540.575880
our42110.7924530.0008600.0017180.7526080.8265050.7878270.2473920.5754150.3460190.575654
performance53190.7361110.0010850.0021670.7081990.8874540.7877580.2918010.6572500.4041640.575515
love61250.7093020.0012490.0024940.6858390.9209360.7861880.3141610.7143240.4363950.572376
both52190.7323940.0010650.0021260.7051430.8826450.7839720.2948570.6572500.4070860.567945
\n", "
" ], "text/plain": [ " Positive freq Negative freq pos_precision pos_freq_pct \\\n", "term \n", "best 108 36 0.750000 0.002211 \n", "entertaining 58 13 0.816901 0.001188 \n", "fun 73 26 0.737374 0.001495 \n", "heart 45 11 0.803571 0.000921 \n", "great 61 23 0.726190 0.001249 \n", "still 63 26 0.707865 0.001290 \n", "our 42 11 0.792453 0.000860 \n", "performance 53 19 0.736111 0.001085 \n", "love 61 25 0.709302 0.001249 \n", "both 52 19 0.732394 0.001065 \n", "\n", " pos_hmean pos_precision_normcdf pos_freq_pct_normcdf \\\n", "term \n", "best 0.004410 0.719483 0.995008 \n", "entertaining 0.002372 0.770690 0.909394 \n", "fun 0.002983 0.709233 0.956259 \n", "heart 0.001841 0.760924 0.844900 \n", "great 0.002494 0.700011 0.920936 \n", "still 0.002575 0.684620 0.927988 \n", "our 0.001718 0.752608 0.826505 \n", "performance 0.002167 0.708199 0.887454 \n", "love 0.002494 0.685839 0.920936 \n", "both 0.002126 0.705143 0.882645 \n", "\n", " pos_scaled_f_score neg_precision_normcdf neg_freq_pct_normcdf \\\n", "term \n", "best 0.835107 0.280517 0.805491 \n", "entertaining 0.834316 0.229310 0.596336 \n", "fun 0.814427 0.290767 0.723380 \n", "heart 0.800716 0.239076 0.575415 \n", "great 0.795418 0.299989 0.695802 \n", "still 0.787940 0.315380 0.723380 \n", "our 0.787827 0.247392 0.575415 \n", "performance 0.787758 0.291801 0.657250 \n", "love 0.786188 0.314161 0.714324 \n", "both 0.783972 0.294857 0.657250 \n", "\n", " neg_scaled_f_score scaled_f_score \n", "term \n", "best 0.416118 0.670214 \n", "entertaining 0.331246 0.668633 \n", "fun 0.414801 0.628854 \n", "heart 0.337801 0.601433 \n", "great 0.419230 0.590836 \n", "still 0.439254 0.575880 \n", "our 0.346019 0.575654 \n", "performance 0.404164 0.575515 \n", "love 0.436395 0.572376 \n", "both 0.407086 0.567945 " ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "term_freq_df['neg_precision_normcdf'] = normcdf((term_freq_df['Negative freq'] * 1./\n", " (term_freq_df['Negative freq'] + term_freq_df['Positive freq'])))\n", "\n", "term_freq_df['neg_freq_pct_normcdf'] = normcdf((term_freq_df['Negative freq'] * 1.\n", " /term_freq_df['Negative freq'].sum()))\n", "\n", "term_freq_df['neg_scaled_f_score'] = hmean([term_freq_df['neg_precision_normcdf'], term_freq_df['neg_freq_pct_normcdf']])\n", "\n", "term_freq_df['scaled_f_score'] = 0\n", "term_freq_df.loc[term_freq_df['pos_scaled_f_score'] > term_freq_df['neg_scaled_f_score'], \n", " 'scaled_f_score'] = term_freq_df['pos_scaled_f_score']\n", "term_freq_df.loc[term_freq_df['pos_scaled_f_score'] < term_freq_df['neg_scaled_f_score'], \n", " 'scaled_f_score'] = 1-term_freq_df['neg_scaled_f_score']\n", "term_freq_df['scaled_f_score'] = 2 * (term_freq_df['scaled_f_score'] - 0.5)\n", "term_freq_df.sort_values(by='scaled_f_score', ascending=False).iloc[:10]" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Positive freqNegative freqpos_precisionpos_freq_pctpos_hmeanpos_precision_normcdfpos_freq_pct_normcdfpos_scaled_f_scoreneg_precision_normcdfneg_freq_pct_normcdfneg_scaled_f_scorescaled_f_score
term
bad171050.1393440.0003480.0006940.1901300.6258070.2916520.8098700.9966760.893614-0.787229
too421470.2222220.0008600.0017130.2484300.8265050.3820300.7515700.9999390.858145-0.716289
were14500.2187500.0002870.0005730.2458110.5973170.3482910.7541890.8920090.817330-0.634660
only431000.3006990.0008800.0017560.3113690.8327850.4532670.6886310.9950560.813959-0.627919
would33720.3142860.0006760.0013490.3229310.7634240.4538720.6770690.9662220.796206-0.592412
no651300.3333330.0013310.0026510.3394300.9345470.4979900.6605700.9996440.795481-0.590963
just761450.3438910.0015560.0030980.3487130.9627230.5119790.6512870.9999240.788800-0.577600
video11390.2200000.0002250.0004500.2467520.5683000.3440990.7532480.8268900.788353-0.576706
script25570.3048780.0005120.0010220.3149060.6981420.4340350.6850940.9229540.786432-0.572864
should27580.3176470.0005530.0011040.3258190.7151990.4476870.6741810.9267600.780546-0.561092
\n", "
" ], "text/plain": [ " Positive freq Negative freq pos_precision pos_freq_pct pos_hmean \\\n", "term \n", "bad 17 105 0.139344 0.000348 0.000694 \n", "too 42 147 0.222222 0.000860 0.001713 \n", "were 14 50 0.218750 0.000287 0.000573 \n", "only 43 100 0.300699 0.000880 0.001756 \n", "would 33 72 0.314286 0.000676 0.001349 \n", "no 65 130 0.333333 0.001331 0.002651 \n", "just 76 145 0.343891 0.001556 0.003098 \n", "video 11 39 0.220000 0.000225 0.000450 \n", "script 25 57 0.304878 0.000512 0.001022 \n", "should 27 58 0.317647 0.000553 0.001104 \n", "\n", " pos_precision_normcdf pos_freq_pct_normcdf pos_scaled_f_score \\\n", "term \n", "bad 0.190130 0.625807 0.291652 \n", "too 0.248430 0.826505 0.382030 \n", "were 0.245811 0.597317 0.348291 \n", "only 0.311369 0.832785 0.453267 \n", "would 0.322931 0.763424 0.453872 \n", "no 0.339430 0.934547 0.497990 \n", "just 0.348713 0.962723 0.511979 \n", "video 0.246752 0.568300 0.344099 \n", "script 0.314906 0.698142 0.434035 \n", "should 0.325819 0.715199 0.447687 \n", "\n", " neg_precision_normcdf neg_freq_pct_normcdf neg_scaled_f_score \\\n", "term \n", "bad 0.809870 0.996676 0.893614 \n", "too 0.751570 0.999939 0.858145 \n", "were 0.754189 0.892009 0.817330 \n", "only 0.688631 0.995056 0.813959 \n", "would 0.677069 0.966222 0.796206 \n", "no 0.660570 0.999644 0.795481 \n", "just 0.651287 0.999924 0.788800 \n", "video 0.753248 0.826890 0.788353 \n", "script 0.685094 0.922954 0.786432 \n", "should 0.674181 0.926760 0.780546 \n", "\n", " scaled_f_score \n", "term \n", "bad -0.787229 \n", "too -0.716289 \n", "were -0.634660 \n", "only -0.627919 \n", "would -0.592412 \n", "no -0.590963 \n", "just -0.577600 \n", "video -0.576706 \n", "script -0.572864 \n", "should -0.561092 " ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "term_freq_df.sort_values(by='scaled_f_score', ascending=True).iloc[:10]" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "is_pos = term_freq_df.pos_scaled_f_score > term_freq_df.neg_scaled_f_score\n", "freq = term_freq_df.pos_freq_pct_normcdf*is_pos - term_freq_df.neg_freq_pct_normcdf*~is_pos\n", "prec = term_freq_df.pos_precision_normcdf*is_pos - term_freq_df.neg_precision_normcdf*~is_pos\n", "def scale(ar): \n", " return (ar - ar.min())/(ar.max() - ar.min())\n", "def close_gap(ar): \n", " ar[ar > 0] -= ar[ar > 0].min()\n", " ar[ar < 0] -= ar[ar < 0].max()\n", " return ar\n", "\n", "html = st.produce_scattertext_explorer(\n", " corpus.remove_terms(set(corpus.get_terms()) - set(term_freq_df.index)),\n", " category='Positive',\n", " not_category_name='Negative',\n", " not_categories=['Negative'],\n", " \n", " x_label = 'Frequency',\n", " original_x = freq,\n", " x_coords = scale(close_gap(freq)),\n", " x_axis_labels = ['Frequent in Neg', \n", " 'Not Frequent', \n", " 'Frequent in Pos'],\n", " \n", " y_label = 'Precision', \n", " original_y = prec,\n", " y_coords = scale(close_gap(prec)),\n", " y_axis_labels = ['Neg Precise', \n", " 'Imprecise', \n", " 'Pos Precise'],\n", " \n", " \n", " scores = (term_freq_df.scaled_f_score.values + 1)/2,\n", " sort_by_dist=False,\n", " show_characteristic=False\n", ")\n", "file_name = 'sfs_explain.html'\n", "open(file_name, 'wb').write(html.encode('utf-8'))\n", "IFrame(src=file_name, width = 1300, height=700)" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "html = st.produce_frequency_explorer(\n", " corpus.remove_terms(set(corpus.get_terms()) - set(term_freq_df.index)),\n", " category='Positive',\n", " not_category_name='Negative',\n", " not_categories=['Negative'],\n", " term_scorer=st.ScaledFScorePresets(beta=1, one_to_neg_one=True),\n", " metadata = rdf['movie_name'],\n", " grey_threshold=0\n", ")\n", "file_name = 'freq_sfs.html'\n", "open(file_name, 'wb').write(html.encode('utf-8'))\n", "IFrame(src=file_name, width = 1300, height=700)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python [py36]", "language": "python", "name": "Python [py36]" }, "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.1" } }, "nbformat": 4, "nbformat_minor": 2 }