{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Document Similarity" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook introduces techniques for exploring document similarity. It's part of the [The Art of Literary Text Analysis](ArtOfLiteraryTextAnalysis.ipynb) (and assumes that you've already worked through previous notebooks – see the table of contents). In this notebook we'll look in particular at:\n", "\n", "* [Document term matrix](#Document-Term-Matrix)\n", "* [TF-IDF](#TF-IDF)\n", "* [Cosine similarity](#Cosine-Similarity)\n", "* [Visualizing document similarity with scatterplots](#Visualizing-Document-Distances-with-a-Scatterplot)\n", "* [Visualizing document similarity with dendrograms](#Visualizing-Document-Clusters-with-a-Dendrogram)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A common task when working with a larger corpus is to try to determine how documents relate to one another – how similar or different they are, or how they might cluster together. For instance, if we take the 18 texts from the NTLK Gutenberg corpus, are there any texts that group together? There are several authors with multiple texts (Shakespeare, Austen, Chesterton), do these cluster together?\n", "\n", "More importantly, how do we determine similarity? For instance, we could plot the ratio of sentences per number of words and see if that's helpful in determining stylistic similarity." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nf7Dw9+OLJQwuAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import nltk\n", "%matplotlib inline\n", "\n", "sentenceLengths = {}\n", "for fileid in nltk.corpus.gutenberg.fileids():\n", " sentenceLengths[fileid] = len(nltk.corpus.gutenberg.sents(fileid)) / len(nltk.corpus.gutenberg.words(fileid))\n", "\n", "nltk.FreqDist(sentenceLengths).plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We do indeed get a certain amount of grouping, for instance the first three texts are from Shakespeare, where there are a high number of sentences per total number of tokens. But this is perhaps more an indication of genre and even formatting rather than of vocabulary (indicated character names in the plain text plays are counted as sentences and the lines of text tend to be formatted shorter than in prose)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Document Term Matrix" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another way to consider document similarity is to consider and compare the frequency of terms in each document. The first step in doing this is to create what's called a document term matrix where frequencies are indicated for each document – it might look something like this:" ] }, { "cell_type": "code", "execution_count": 2, "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", "
'sandbooksearsgoodhaveiitjazzlovemusicmyreadrecentlysaytowhatwhenyou
00110102012101001000
10010110000001100101
21001001101110011012
\n", "
" ], "text/plain": [ " 's and books ears good have i it jazz love music my read \\\n", "0 0 1 1 0 1 0 2 0 1 2 1 0 1 \n", "1 0 0 1 0 1 1 0 0 0 0 0 0 1 \n", "2 1 0 0 1 0 0 1 1 0 1 1 1 0 \n", "\n", " recently say to what when you \n", "0 0 0 1 0 0 0 \n", "1 1 0 0 1 0 1 \n", "2 0 1 1 0 1 2 " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "documents = [\n", " \"I love jazz music and I love to read good books\",\n", " \"What good books have you read recently\",\n", " \"It's music to my ears when you say I love you\"\n", "]\n", "\n", "allWords = set([word.lower() for word in nltk.word_tokenize(\" \".join(documents)) if any([c for c in word if c.isalpha()])])\n", "allRawFreqs = [nltk.FreqDist(nltk.word_tokenize(document.lower())) for document in documents]\n", "pd.DataFrame(allRawFreqs).fillna(0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The top row indicates each term in the entire corpus and each row represents a document (\"0\" is the first document \"I love jazz…\", etc.). This would be helpful (with real data), but it's not ideal to use raw frequencies (counts) since document length wouldn't be taken into consideration.\n", "\n", "We could create a similar table using relative frequencies instead, in other words, where each value would be relative to the total number of tokens in the document. That would be better for variable length documents, but an even more powerful (and commonly used) technique is to calculate a value that better represents the significance of a term within the corpus. Just as the relative frequency dampens counts based on document length, the [TF-IDF](http://en.wikipedia.org/wiki/Tf–idf) value dampens relative frequencies based on the distribution of the term in the corpus." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## TF-IDF" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We already have the \"TF\" part of the TF-IDF value, it's simply the term's raw or relative frequency in a given document. We need to multiply that by IDF, which is the inverse document frequency, which we can calculate like this:\n", "\n", " IDF = log of the total number of documents divided by the number of documents that contain the term\n", "\n", "So, imagine we want to calculate the TF-IDF score of the word \"boot\" for Austen's _Emma_ within the Gutenberg corpus:\n", "\n", "* 4 occurrences of \"boot\" in _Emma_\n", "* 16,1975 words in _Emma_\n", "* 6 documents that contain \"boot\" (at least once)\n", "* 18 documents in total\n", "\n", " TF = 4 / 161975 = 0.00002469516901\n", "\n", " IDF = log(18 /6) = 1.0986122886681098\n", "\n", " TF-IDF (for boot in _Emma_) = 0.00002469516901 \\* 1.0986122886681098 = **0.00002713041615**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That seems like a lot of work for a single TF-IDF value for one term in one document. But good news! We don't need to calculate TF-IDF scores ourselves, there are several libraries that do that for us. In fact, we've already seen this with the gensim library in the topic modelling notebook, but here we're going to use [scikit](http://scikit-learn.org/stable/), a machine learning library for Python, and in particular with [TfidfVectorizer](http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html)." ] }, { "cell_type": "code", "execution_count": 3, "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", "
012345678910111213141516
00.3725330.2833210.0000000.2833210.0000000.0000000.3725330.5666420.2833210.0000000.2833210.0000000.0000000.2833210.0000000.0000000.000000
10.0000000.3299280.0000000.3299280.4338160.0000000.0000000.0000000.0000000.0000000.3299280.4338160.0000000.0000000.4338160.0000000.329928
20.0000000.0000000.3324330.0000000.0000000.3324330.0000000.2528240.2528240.3324330.0000000.0000000.3324330.2528240.0000000.3324330.505648
\n", "
" ], "text/plain": [ " 0 1 2 3 4 5 6 \\\n", "0 0.372533 0.283321 0.000000 0.283321 0.000000 0.000000 0.372533 \n", "1 0.000000 0.329928 0.000000 0.329928 0.433816 0.000000 0.000000 \n", "2 0.000000 0.000000 0.332433 0.000000 0.000000 0.332433 0.000000 \n", "\n", " 7 8 9 10 11 12 13 \\\n", "0 0.566642 0.283321 0.000000 0.283321 0.000000 0.000000 0.283321 \n", "1 0.000000 0.000000 0.000000 0.329928 0.433816 0.000000 0.000000 \n", "2 0.252824 0.252824 0.332433 0.000000 0.000000 0.332433 0.252824 \n", "\n", " 14 15 16 \n", "0 0.000000 0.000000 0.000000 \n", "1 0.433816 0.000000 0.329928 \n", "2 0.000000 0.332433 0.505648 " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.feature_extraction.text import TfidfVectorizer\n", "simpledtm = TfidfVectorizer().fit_transform(documents) # takes a list of strings (and tokenizes them for us)\n", "pd.DataFrame(simpledtm.toarray())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When we use this convenient method, we lose the term labels (they appear in the top header row as numbers from 0 to 16), but in fact that's not as important for now as just seeing that we have a document term matrix with TF-IDF values for each document and each term (with several values of zero).\n", "\n", "We can generate a similar – though much larger – table for all the texts in the Gutenberg corpus." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "<18x42063 sparse matrix of type ''\n", "\twith 121698 stored elements in Compressed Sparse Row format>" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "names = nltk.corpus.gutenberg.fileids() # we'll keep track of filenames (for labels)\n", "texts = [nltk.corpus.gutenberg.raw(fileid) for fileid in names] # a list of strings, one per document\n", "documentTermMatrix = TfidfVectorizer().fit_transform(texts)\n", "documentTermMatrix" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our document term matrix is stored in something called a sparse matrix, which is a useful and efficient way to store and process a very large table of data where several values are absent or not set. There are typically a lot of zero values in a sparse matrix, (imagine a term that only occurs in one of the 18 documents – a true matrix would need to store 18 cells/values, but a sparse matrix can store just one.\n", "\n", "This document term matrix is conceptually enormous. Depending on the arguments we provide to fit_transform() we could have a huge table of 18 (the number of documents) by the total number of unique words in all the documents (each term is a column and each column needs a value for each one of the documents)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Cosine Similarity" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Even though we have a table of TF-IDF values for every term in every document, in order to make any use of it we need a way of comparing documents. In other words: of determining the distance between the frequency values (columns) for any of the documents in the rows. In effect, we want a way of expressing how different two rows (documents) are.\n", "\n", "We can do this by converting our TF-IDF values from each document into geometric space. Imagine each term frequency (as TF-IDF) as a point on a cartesian graph and a value that expresses the aggregate of these points. Each document could thus be expressed as a vector, or a line with a certain magnitude (length) and angle from the origin (0, 0).\n", "\n", "Because the length of the line (the total magnitude of the total TF-IDF values) would be sensitive to the length of the document, we can't simply compare the lines for each document, but we can compare the angle between the documents – that's the essence of cosine similarity.\n", "\n", "* cosine distance between document 1 and document 2 (d1, d2)\n", "* cosine distance between document 2 and document 3 (d2, d3)\n", "* cosine distance between document 1 and document 3 (d1, d3)\n", "\n", "\n", "![Cosine Similarity](images/cosine-similarity.png)\n", "\n", "We'll use scikit's [cosine_similarity](http://scikit-learn.org/stable/modules/metrics.html#cosine-similarity) function." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sklearn.metrics.pairwise import cosine_similarity\n", "distances = 1 - cosine_similarity(documentTermMatrix)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This creates a new matrix not of individual terms but of distance measures between documents. Think of a table of distances between cities on a map, if you present it in a table there will be duplication, and identity values for where cities meet.\n", "\n", "
CalgaryMontrealTorontoVancouver
Calgary375034501050
Montreal37505504800
Toronto34505504500
Vancouver105048004500
\n", "\n", "The distance values that we get from cosine_similarity() on our documentTermMatrix from Gutenberg are similar, we have an 18 by 18 grid. But the grid is still difficult to read, we want a way of visualizing distances." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Visualizing Document Distances with a Scatterplot" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An 18 by 18 grid can be thought of as an 18 dimensional dataset. Coordinates on a cartesian graph are usually two dimensional, since we have x and y dimensions. So the question becomes: how do we convert a multidimensional grid into a two dimensional graph? Why, with [multidimensional scaling](https://en.wikipedia.org/wiki/Multidimensional_scaling) of course :). The math to accomplish this isn't as important for now as the purpose of multidimensional scaling to two dimensions, which is to represent as well as possible the distance that objects have in their original multiple dimensions." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ -1.51868661e-01, -4.31766715e-02],\n", " [ -9.58487860e-02, -2.17179925e-02],\n", " [ -1.17381710e-01, -7.46157660e-02],\n", " [ 1.22382126e-01, 8.13713408e-02],\n", " [ 1.40288239e-01, 4.29439050e-02],\n", " [ 2.09094984e-02, 7.80592910e-02],\n", " [ -2.37332075e-01, 1.62232197e-01],\n", " [ -7.61926676e-03, 1.89215270e-01],\n", " [ -1.24747072e-02, 6.45721411e-02],\n", " [ 1.96461441e-04, 4.67219521e-02],\n", " [ -3.43572845e-02, 9.69630518e-02],\n", " [ -4.09739841e-02, -3.60270233e-03],\n", " [ 3.78716690e-02, 3.76499973e-02],\n", " [ 6.43095553e-02, -5.06869192e-02],\n", " [ -4.25910013e-02, -3.12768715e-01],\n", " [ 8.34586205e-02, -1.96712245e-01],\n", " [ 1.82436839e-01, -1.50882497e-01],\n", " [ 8.85944675e-02, 5.44343623e-02]])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.manifold import MDS\n", "\n", "# reduce our n-dimensional distances matrix to a two dimensional matrix (for x and y coordinates)\n", "mds = MDS(dissimilarity=\"precomputed\", random_state=1)\n", "positions = mds.fit_transform(distances)\n", "\n", "positions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now have a list of 18 elements (one for each Gutenberg text) where each text has an x and y value. Now all we need to do is plot the values." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/sgs/anaconda/lib/python3.5/site-packages/matplotlib/collections.py:590: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", " if self._edgecolors == str('face'):\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAl4AAAJPCAYAAACtq9q4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xt8j/Xj//HHtYXNmU6fb1ITEnZ6bwxjzGGmnGkkZHJI\nSSeEPqpV6qvQh/Ttgz6x0ZylpMNoaObwkTVnlmMrk3Ojmdj2+v0xu36bHRzGG/W832673d7X+3pd\n1+t1XSueXq/X9bosYwwiIiIicv253OgGiIiIiPxdKHiJiIiIOImCl4iIiIiTKHiJiIiIOImCl4iI\niIiTKHiJiIiIOEmxg5dlWW0sy9plWdZuy7JGFLC/o2VZmy3LSrQs6wfLshoXt04RERGRW5FVnHW8\nLMtyBZKAVsBB4AeghzFmZ64yZYwxaRc+ewHzjTG1i9VqERERkVtQcXu8AoA9xpgDxpjzwFygY+4C\nOaHrgrJAVjHrFBEREbklFTd4VQF+ybX964Xv8rAsq5NlWTuBpcCTxaxTRERE5JZU3OB1WeOUxpjP\nLwwvdgLGFLNOERERkVvSbcU8/iBQNdd2VbJ7vQpkjFltWdYDlmVVNsacyL3Psiy9NFJERERuGcYY\n60qPKW6P10agpmVZHpZllQS6A0tyF7Asq7plWdaFz35AyYtDVw5jjH6c+PP666/f8Db83X50z3XP\n/w4/uue653+Hn6tVrB4vY0yGZVnPAjGAK/CJMWanZVlPXdg/FegKPGFZ1nkgnexwJiIiIvK3U9yh\nRowx3wDfXPTd1Fyf3wPeK249IiIiIrc6rVz/NxYcHHyjm/C3o3vufLrnzqd77ny657eOYi2gei1Z\nlmVulraIiIiIFMWyLMwNmFwvIiIiIpdJwUtERETESRS8RERERJxEwUtERETESRS8RERERJxEwUtE\nRETESRS8RERERJxEwUtERETESRS8RERERJxEwUtERETESRS8RERERJxEwUtERETESRS8RERERJxE\nwUtERETESRS8RERERJxEwUtERETESRS8RERERJxEwUtERETESRS8RERERJxEwUtERETESRS8RERE\nRJxEwUtERETESRS8RERERJxEwUtERETESRS8RERERJxEwUtERETESRS8RERERJxEwUtERETESRS8\nRERERJxEwUtERETESRS8RERERJxEwUtERETESRS8RERERJxEwUtERETESRS8RERERJxEwUtERETE\nSRS8RERERJxEwUtERETESRS8RERERJxEwUtERETESRS8RERERJxEwUtERETESRS8RERERJxEwUtE\nRETESRS8RERERJxEwUtERETESRS8RERERJxEwUtERETESRS8RERERJxEwUtERETESRS8RERERJxE\nwUtERETESRS8RERERJxEwUtERETESRS8RERERJxEwUtERETESRS8RERERJxEwUtERETESRS8RERE\nRJxEwUtERETESRS8RERERJxEwUtERETESRS8RERERJxEwUtERETESRS8RERERJxEwUtERETESRS8\nRERERJxEwUtERETESRS8RERERJyk2MHLsqw2lmXtsixrt2VZIwrY39OyrM2WZW2xLGuNZVnexa1T\nRERE5FZkGWOu/mDLcgWSgFbAQeAHoIcxZmeuMo2AHcaYVMuy2gARxpiGBZzLFKctIiIiIs5iWRbG\nGOtKjytuj1cAsMcYc8AYcx6YC3TMXcAYs84Yk3ph87/AvcWsU0REROSWVNzgVQX4Jdf2rxe+K0w/\n4Oti1ikiIiJyS7qtmMdf9tigZVnNgSeBxsWsU0REROSWVNzgdRCommu7Ktm9XnlcmFD/MdDGGHOy\nsJNFRETYn4ODgwkODi5m80RERESKb9WqVaxatarY5ynu5PrbyJ5c3xJIATaQf3L9fcAKoJcxZn0R\n59LkehG5aUVERFCuXDmGDh1KeHg47du3p2vXrpd9fNmyZfnjjz9ISUnh+eefZ8GCBdextSJyvV3t\n5Ppi9XgZYzIsy3oWiAFcgU+MMTsty3rqwv6pwGtAJeDflmUBnDfGBBSnXhGRayEjI4Pbbrut0O3c\nLMviwp9heT5frpzy99xzj0KXyN9YcYcaMcZ8A3xz0XdTc33uD/Qvbj0iIkWZOXMmEyZMwLIsvL29\n6datG2PGjOHcuXPcfvvtREdHc9dddxEREcHevXvZv38/9913H7Vq1WLPnj3s37+f+++/n3feeYe+\nffty/Phx7rzzTmbMmEHVqtkzKnL3yhfUQ5+WlkbHjh05efIk58+fZ8yYMXTo0CFPmQMHDtC+fXu2\nbt1KZmYmI0aMICYmBhcXFwYMGMCzzz5LQkICQ4cO5Y8//uCOO+4gMjKSf/zjH9f3BoqIUxQ7eImI\n3Gjbt2/n7bffZt26dVSuXJmTJ09iWRbr12fPbvjPf/7De++9x/jx4wHYtWsX8fHxlCpVioiIiDzb\n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\njRsB8sw1ujgMNG7cmPnz5wOwbNkyTp48iWVZtGzZkoULF3L06FEATpw4QXJyMsePHycjI4MuXbrw\n1ltv8eOPP2KMITk5meDgYMaOHUtqaippaWnExMSQmJjItGnT7LrnzZsHwLx58wgMDASynzZMSEgA\nYMmSJZw/fx6A5ORk7rzzTvr370+/fv1ITEwEoESJEvaDAYW1syCF1Z9bhQoVqFSpkt1rOGvWLIKD\ng4HsIPjpp59Ss2ZNLMuicuXKfP311zRp0uRSvzIREZHr4rYb3YC/gwkTppGe/i7QB/gZeJ/33nuf\nadOmUbduXZ555hkCAgLo168f5cuXJzg42O7dsSwrT0/P66+/To8ePZg1axaNGjXiH//4B+XKlaNy\n5cqMGTOG1q1bk5WVRYkSJfjoo49wc3Ojb9++dg/V2LFjyczMpHfv3qSmpmKM4fnnn6d8+fL52m1Z\nFidPnsTHxwc3NzfmzJkDwIABA+jYsSO+vr60adPGHlJcuXIl48ePp0SJEpQrV46ZM2cCMHDgQLy9\nvfH392fWrFkFtvO+++4rcO5YQfXn7MsRFRXFoEGDOHPmDNWrV2fGjBkA3H///QD20GJQUBApKSlU\nqFChwPMU1dsmIiJyLVg3y/CKZVnmZmnLtda6dVeWL+9AdvACiCIkZAnLll35U3Tnzp3D1dUVV1dX\n1q1bZw8XioiIiPNcWPLoiv/Frh4vJxg6dCDx8X1IT8/edncfwdChUVd1ruTkZLp160ZWVhYlS5bk\n448/voYtFRERketJPV5OEhMTw4QJ2XOnhg4dSGho6A1ukYiIiFytq+3xUvASERERuUJXG7z0VKOI\niIiIkyh4iYiIiDiJgpeIiIiIkyh4iYiIiDiJgpeIiIiIkyh4iYiIiDiJgpeIiIiIkyh4iYiIiDiJ\ngpeIiIiIkyh4iYiIiDiJgpeIiIiIkyh4iYiIiDiJgpeIiIiIkyh4iYiIiDiJgpeIiIiIkyh4iYiI\niDiJgpeIiIiIkyh4iYiIiDiJgpeIiIiIkyh4iYiIiDiJgpeIiIiIkyh4iYiIiDiJgpeIiIiIkyh4\niYiIiDiJgpeIiIiIkyh4iYiIiDiJgpeIiIiIkyh4iYiIiDiJgpeIiIiIkyh4iYiIiDiJgpeIiIiI\nkyh4iYiIiDiJgpeIiIiIkyh4iYiIiDiJgpeIiIiIkyh4iYiIiDiJgpeIiIiIkyh4iYiIiDiJgpeI\n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\ntGfPHp599lm2bdtGxYoVL/naqMLWdQOYPn06Gzdu5IcffuCDDz7g5MmTPProoyxevNg+fv78+fTo\n0YOdO3cyf/581q5dS2JiIq6urkRHR7N582ZSUlLYunUrW7ZsoW/fvtf0dyB/DQpeIiJySX5+fiQk\nJHD69Gnc3Nxo1KgRGzduZPXq1QQFBVGyZEnatm0LgL+/f6FrlF08paRDhw4AeHl50aBBA8qUKcMd\nd9xBqVKlOHXqFFlZWYwaNQofHx9CQkJISUmxe9OqVauGt7f3JevMUdi6bpD9uqic3rpffvmF3bt3\nc8cdd/DAAw/w3//+l+PHj7Nr1y4CAwPtRXXr1auHw+EgNjaW/fv388ADD7Bv3z6ee+45YmJiKF++\n/NXebvkL01ONIiJSqNxz68qXL09kZCSBgYF4e3uzYsUK9u7dS+3atSlRooR9jIuLi71G2cUufuIy\nZ10zFxcX+3PO9vnz5/nss884duwYP/74I66urlSrVs0eUsxd3tXVlfT0dH799VfatWuHZVk8/fTT\n+dZwK2hdt5y3Faxfvx43NzeaN29u1/HYY48xf/58HnroIXvxW8heGPedd97Jd31btmzh22+/ZcqU\nKcyfP59PPvmkkDsrf1fq8RKRv53w8PBLDktdjokTJ5Kenn7Fx0VFRXHo0KFi15/Dw8OjyPXMrlbO\n06TLl3dg+fIObNu2mzFjxtCsWTOCgoKYMmUKDoejyHMYY+xertzrnRVUriCnTp3irrvuwtXVlZUr\nV9pLaBTm3nvvZdOmTSQmJuYLWIWt63bq1CkqVaqEm5sbu3btYv369fYxnTt35vPPP2fOnDk89thj\nALRs2ZKFCxdy9OhRIHstueTkZI4fP05GRgZdunThrbfesl8hJZKberxE5G/nWq1zNWnSJHr37o27\nu/tlH5OZmUlkZCSenp7XbFmFC09XXbJeV1fXKzpv3oVrISNjB0ePjqdRo0a4u7vj7u5OUFCQ3Ybc\n7SloXbGL1zu7+BoKOkfPnj1p37493t7e1KtXj9q1a+cpc/E5ClLUum6ffvopbdq0YcqUKdSpU4da\ntWrZ+yH7nZl16tRh586d1KtXD8h+LdWYMWNo3bo1WVlZlChRgo8++gg3Nzf69u1LVlYWAGPHjr2c\n2yx/M1pOQkT+8mbOnMmECROwLAtvb29cXV0pX748Gzdu5LfffuO9996ja9euQPZTbwsWLODPP/+k\nc+fOREREkJaWRrdu3Th48CCZmZm8+uqrHD58mGHDhlGrVi3uvPNOYmNjWbZsGREREfz5559Ur16d\nGTNmUKZMGTw8PHjsscdYvnw5L730EoMGDaJKlSp2AFmzZg3Dhw8nIyOD+vXr8+9//5uSJUvi4eFB\neHg4X375JefPn2fBggXUqlUr3/VVq1aNbt268c033+Du7s7s2bOpXr064eHhuLm5sWnTJpo0aUKv\nXr0YNGgQ6enpVK9enenTp3Pu3DkeeeQRNm7cyObNm3E4HCQnJ3PvvfdSunRZ0tP/BawBKgBf4+5+\niFmzouz7JfJ3dbXLSdjdwDf6J7spIiLX1rZt28yDDz5ojh8/bowx5sSJEyY8PNx069bNGGPMjh07\nTI0aNYwxxsTExJiBAwcaY4zJzMw07dq1M3FxcWbRokVmwIAB9jlPnTpljDHGw8PDPu/Ro0dN06ZN\nzZkzZ4wxxowdO9a8+eabdrlx48bZxwcHB5uEhARjjDHp6emmatWqZvfu3cYYY5544gkzceJE+7gP\nP/zQGGPMRx99ZPr371/gNXp4eJh33nnHGGPMzJkzTbt27YwxxvTp08e0b9/eZGVlGWOM8fLyMnFx\nccYYY1577TXzwgsvGGOMqVu3rjl16pSZPHmyCQgIMNHR0ebAgQOmdu3axt39bgONDQQYd/e7zbRp\n0+z7dSvZv3+/8fT0zPd9s2bNzMaNG4s89v7777d/zyI5LuSWK847muMlIn9pK1asoFu3blSuXBmA\nSpUqAdCpUycge9jo8OHDQOFPvXl5ebF8+XJGjhxJfHw85cqVy1fP+vXr2bFjB4GBgTgcDmbOnEly\ncrK9v3v37nnKmws9/ElJSVSrVo0aNWoA2ZO24+Li7HI5E7r9/PyKfGqvR48eQPZk8HXr1gHZ/yIP\nCwvDsixSU1NJTU21hwZz1xMYGMiaNWtYvXo1o0aNIi4ujvj4eDp06MDixVHcc88veHoaFi+OYsCA\nAfb9+iu4nFcs6RVMci0peInIX1JMTAytW3fl//7vE3vJgNxKlixpf84JQZD91FtiYiKJiYn89NNP\n9O3bl5o1a5KYmIiXlxejR4/mrbfeKrDOkJAQ+9jt27fba1kBlClTJk/Zwv4yN8bk2Zfz5J6rq6v9\npGBoaCgOhyPf5PGCzl26dOlC68nRtGlT4uLiSE5OpmPHjmzatIn4+HiCgoIIDQ2ldesWRESMsBeu\nzX3srSQjI4NevXpRp04dwsLC8j0Y8cwzz1C/fn08PT3zLK6aIz09nYcffphPPvmEM2fO8OSTT9Kg\nQQP8/PzshV0vFhwczAsvvIDD4cDLy4sffvgByJ6Q36lTJ3x8fGjUqBFbt24Fsl/GXtB5IyMj6dSp\nE61bt6ZatWr83//9H++//z5+fn40atSIkydPAvDBBx9Qt25dfHx87DAuNxcFLxH5y8n9NF5SUjfm\nzVvAwoULAYp8+q+wp94OHTqEm5sbPXv2ZNiwYSQmJgJ5n9Jr0KABa9asYe/evUD2X6C7d+8usJ7c\nx9WqVYsDBw7Yx82aNYtmzZpd8voSExOZNi17mQdjDPPmzQNg3rx5BAYG5jumQoUKVKpUifj4eLue\n4OBgAIKCgvj000+pWbMmlmVRuXJlvv76a5o0aVJkO241SUlJDB48mB07dlC+fHk++uijPPvffvtt\nfvjhBzZv3sz333/Ptm3b7H2nT5+mQ4cO9OzZk379+jFmzBhatmzJf//7X1asWMHw4cM5c+ZMvjot\nyyI9PZ3ExEQ++ugjnnzySQBef/11/P392bx5M++88w5PPPGE3YbCzrt9+3YWL17MDz/8wD//+U/K\nli3Ljz/+SKNGjZg5cyYA7777Lps2bWLz5s326v9yc9FTjSLyl3Px03jGHKBv3+y/LB0OR4FP0EHB\nT73NmjWLPXv2MHz4cFxcXChRogRTpkwBYODAgbRp04YqVaoQGxtLZGQkPXr04M8//wSy/xKtWbNm\nvvZd/HTfjBkzCAsLIyMjg4CAAAYNGpSnXTmfi3pq7+TJk/j4+ODm5sacOXPyXRtkL2MxaNAgzpw5\nY0/+B7j//vuB7J4vyA5iKSkpVKhQocDz3KpDb1WrVrV/t7169eKDDz7Is3/evHl8/PHHZGRkcOjQ\nIXbs2IGnpyfGGDp27MiIESPsXqRly5bx5ZdfMn78eAD+/PNPfvnllwIffsg5JigoiFOnTpGamsqa\nNWv47LPPgOx3WB4/fpzTp08XeN7k5GQsy6J58+aUKVOGMmXKUKFCBdq3bw9kLz67ZcsWALy9vXn8\n8cfp1KmTPZwuN5mrmRh2PX7Q5HoRuUZCQroYiDRgLvxEmpCQLje6WcWycuVKe9J8YaZMmWJmzZpl\njMmeWL9w4UJjzOVNIL+Wctd9reSe4B4YGFhk2dzX++2335qQkC6mSZNQc9ddd9llYmNjTefOne0H\nHfbt22dq1Khhfv/9d2OMMeHh4SYqKsoYk/3wwuDBg03v3r3t4/39/c1PP/2Ur+6+ffsaX19f07Zt\nW2NM9oMUK1eutPffd999JjU11TgcDrNv3z77+6pVq5pTp04Vet7IyEjz7LPP2tu5H+zIvS8zM9Os\nXLnSvPTSS6Z27domIyOjyHslVw9NrhcRyTZ06EDc3UcAUUAU7u4jGDq04PlQfyVPPfUUvXr1Agpf\nS8sZrkdduc+5Zs2aS5a1LCvPkHN8fCuOHDliv7h69uzZ9lCqMYZTp05RpkwZypcvz+HDh/nmm2/y\nnPPNN9+kUqVKDB48GMgels7dY5Yz/Dx9+nQSExNZunSpvS9nGDg+Pp6KFStSvnx5goKCiI6OBrJX\nzr/zzjspV65coec1Rcyry9lnjCE5OZng4GDGjh1LamqqPWwuNw8FLxH5ywkNDWXx4ihCQpYQErKE\nxYuj7InhN9KBAwd46KGH6Nu3L7Vq1aJXr1589913NGnShAcffJAffvih0MnVOYwxVKtWjdTUVPu7\nBx98kCNHjhAREcGECROKbMOyZcsIDAzE39+fbt26FfgX86pVq2jWrBmdOnWievXqjBo1iujoaBo0\naIC3tzf79u2zr6dFixb4+PjQqlUrfvnlF/sc3333HfXr16dWrVp89dVXADRr1ozNmzfbZZo0aWJP\nKr/Y8ePHad26NZ6engwYMCBP8Chbtqz9+d1338Xb2xtfX19eeeWVPOcYP34q6ek1gD1AGPA/vPfe\n+9SpU4fU1FSefvppIDuo+fj44HA4eOihh+jZs2eB89smTZpEeno6I0eO5NVXX+X8+fN4e3vj6elp\nv9S7IG5ubvj5+fHMM8/YrxCKiIggISEBHx8fXnnlFaKiogAKPW9hw+O592VmZtK7d2+8vb3x8/Pj\n+eef1/sib0ZX0012PX7QUKOI/MXt37/f3HbbbWbbtm0mKyvL+Pv7m379+hljjPniiy9Mp06dzCuv\nvGI+/fRTY4wxJ0+eNA8++KBJS0vLM9T4/PPPmxkzZhhjjFm/fr0JCQkxxhgTERFhJkyYYIzJHipb\ntGiRMeb/rxtW1Fpjua1cudJUrFjR/Pbbb+bPP/80VapUMREREcYYYyZNmmSv/9WuXTszc+ZMY4wx\n06dPN506dTLGZA81Pvzww8YYY3bv3m3uvfdec/bsWRMVFWUfm5SUZOrVq1fovRoyZIh56623jDHG\n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\n0aZOnWpmZnFxcbZ27VozMyssLLTmzZvbtm3bzMxs8ODB9tJLL5mZWUBAgE2fPt3MzFJTU2348OGV\n1hIQEGDPPPOMmZm9/vrrlpiYaGZlVw8fN2vWLBs9erSZmT3xxBMWFRVlRUVFZlZ25fLx91u3brWo\nqCgzM3v77bctPj7eSktLbffu3dawYUN7++23K3yHNWvWWHx8vO84x69q7tq1q+87rVy50rp27Vrl\nPhYx01WNcolLSEjQCJfIaRy/8rewsOCkK2O7desGlF01m5eXd9p2rPzMw5YtW2jVqhVt27YFIDk5\nmT/96U/87ne/A/BdJRwREcGCBQtO2d6gQYMA+K//+i9+//vfA/DVV18xcOBAvv32W44ePUrr1q2B\nshGEO+64w3eBydGjRxk5ciTr16/H39/fdwXzBx98wF133YVzjqZNm9K1a9eTjtumTRu++OILfvvb\n39K7d2969OjBoUOH+Oc//8mAAQN82x09evS0/SFyvmlyvYjIRe746fjs7Dv46KPu7N79HZmZmUDZ\nlbEnXjV74tW0lTnVvEQzq7DueDg6frUvlP2BFB4ezogRI07b9qhRo/jtb3/Lp59+yowZMypciXzF\nFVf43r/44os0bdqUTz/9lDVr1nDkyBFfO8cD4qk0bNiQ9evXExcXx5///GeGDx+OmdGwYUNycnJ8\nr88///y07YicbwpeIiIXuYpX/v5/mDXx3ffuTOz/pntQv3598vPzAQgMDCQvL48dO3YA8MYbb3D7\n7beftq3MzExycnJ8T28AmDdvnu9/Y2NjgbJ73V1//fVA2YT+E2s5UX5+Pk2aNAHg9ddfp6SkBIDb\nbruNefPmUVpayjfffOO7J96J7ezbt4+SkhL69+/PU089RU5ODvXr16dVq1a+e+6ZGZ9++ulZ9ZPI\n+aJTjSIil7jKRrGOf3biFYFDhgzhgQce8E2unz17NgMGDKC4uJjo6GgeeOCBk9o73dW7AD/88AOh\noaHUqVOHv/71r0DZLSwGDBjA1VdfTdeuXdm5c2elbT300EPceeedvP766/Ts2dP3aLB+/frx/vvv\nc8stt9CiRQtfoDuxpq+//pqhQ4dSWloKwJQpUwCYO3cuDz74IJMnT+bYsWMMGjSIkJCQKvSmSPXo\nqkYRkYvchXrlb6tWrVi7di3XXHNNjdYh8nM416saNeIlInKRS0hIICPjNd/pxdGjaz50wanni4n8\n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\n6++cy3HOLT7X44mIiIhc7Koz4jUWyDazdsCy8uVT+R2wEbBqHE/OsxUrVtR0Cb846nPvqc+9pz73\nnvr84lGd4HUH8Fr5+9eAvpVt5JxrBvwa+B/AVeN4cp7pP1Tvqc+9pz73nvrce+rzi0d1gtd1ZvZd\n+fvvgOtOsd2LwBigtBrHEhEREbnoXXa6lc65bKBJJav+cOKCmZlz7qTTiM65ROB7M8txzsVVp1AR\nERGRi50zO7dpV865zUCcmX3rnGsKLDezm36yzTPAPUAxUAe4CnjbzAZX0p7mf4mIiMhFw8yqPIWq\nOsHrv4F9Zvasc24s0NDMTjnB3jl3O/CImSWd0wFFRERELnLVmeM1BYh3zm0FupYv45y73jm39BT7\naFRLREREfrHOecRLRERERKqmxu5cfzY3YHXO1XHOrXLO/ds595lzbmINlHrJOMs+b+6cW+6c+7y8\nz39bE7VeKs72RsPOuVedc9855zZ4XeOlwjnX0zm32Tm3zTn36Cm2ebl8/XrnXLjXNV5qztTnzrmb\nnHP/dM4VOedG10SNl5qz6PO7y3+/P3XOfeycC6mJOi8lZ9Hnfcr7PMc59y/n3K2na68mHxl0xhuw\nmlkR0MXMwoAwoKdzrqO3ZV5Szuamt8eA35tZe+BXwG+cczd7WOOl5mxvNDwb6OlZVZcY55w/MJ2y\nPrwFGPTT31vn3K+BtmZ2IzACeMXzQi8hZ9PnwD5gFPC8x+Vdks6yz78AbjOzEOApYKa3VV5azrLP\n/9fMQs0sHBhG2X1LT6kmg9dZ3YDVzA6Xv60N1EL3A6uOM/a5mX1rZv8uf38I2ARc71mFl56z/T3/\nEPjBq6IuQdHAdjPLM7NjwN+APj/ZxvezMLNVQEPn3KnuPyhndsY+N7M9ZraGsj/opPrOps//aWYH\nyxdXAc08rvFSczZ9XnDCYj3OkFNqMnid1Q1YnXN+zrl/l2+TZWb/8qrAS9DZ3vQWAOdcABBO2X+8\ncm6q1Odyzm4AvjpheVf5Z2faRv8onbuz6XM5v6ra5/cC7/ysFV36zqrPnXN9nXObgCWUjXqd0mlv\noFpd1b0Ba/m6UiDMOdcAyHDOtTezz89/tZeG89Hn5e3UA9KB35WPfMkpnK8+l2o523796T139PM4\nd+o77511nzvnulAWAE4730jO6Kz63MwWAgudc52ByUD8qbb9WYOXmZ3ywOUTiZuccAPW78/Q1kHn\n3HLKzrMqeJ3C+ehz51wt4G1gTvkvk5zG+fw9l3P2NdD8hOXmlP1lerptmpV/JufmbPpczq+z6vPy\nCfWzgJ5mpikM1VOl33Mz+9A519o5d42Z7a9sm5o81bgISC5/nwyc9A+8c+4/jl8F5pyrS1mC3ORZ\nhZees+lzB/wF2GhmL3lY26XqjH0u58Ua4EbnXIBzrjbwn5T1/YkWAYMBnHO/Ag6ccBpYqu5s+vy4\nKt/dWyp1xj53zrUAFgD/z8y210CNl5qz6fM25f924pyLAGqfKnQBYGY18gKuAf4X2ApkUXbneyib\nyL20/H0IsA5YD2wAxtdUvZfC6yz7vBNlEwP/DeSUv3rWdO0X6+ts+rx8+a/AbuAIZfMJhtZ07Rfb\nC+gFbAG2A+PKP7sfuP+EbaaXr18PRNR0zRf760x9Ttkp+K+Ag5RdPPIlUK+m676YX2fR5/9D2dWk\nx///e3VN13yxv86iz1OAz8r7+xMg9nTt6QaqIiIiIh6pyVONIiIiIr8oCl4iIiIiHlHwEhEREfGI\ngtf/324dCwAAAAAM8reexa6iCABgIl4AABPxAgCYiBcAwES8AAAmAeRtwpcUFJ3fAAAAAElFTkSu\nQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "xvalues = positions[:, 0] # the left colunn (x axis) for all rows\n", "yvalues = positions[: ,1] # the right column (y axis) for all rows\n", "\n", "plt.figure(figsize=(10,10)) # make the graph easier to see\n", "for x, y, name in zip(xvalues, yvalues, names):\n", " plt.scatter(x, y)\n", " plt.text(x, y, name.replace(\".txt\", \"\"))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see a few encouraging clusters, including the authors Shakespeare (bottom right), Austen (middle left) and Chesterton (middle top)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Visualizing Document Clusters with a Dendrogram" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another strategy for showing clusters is to create a hierarchical tree that forms a [dendrogram](http://en.wikipedia.org/wiki/Dendrogram). At its simplest, a dendrogram starts with each document in its own \"cluster\" and then tries to merge it with the closest document that still hasn't been merged. Those merged clusters are then merged again and the process is repeated as many times as possible. Different strategies exist for merging clusters based on distance matrix, but in this case we'll demonstrate [Ward](http://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.ward.html#scipy.cluster.hierarchy.ward)'s approach." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/sgs/anaconda/lib/python3.5/site-packages/matplotlib/collections.py:590: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", " if self._edgecolors == str('face'):\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from scipy.cluster.hierarchy import ward, dendrogram\n", "linkage_matrix = ward(distances)\n", "dendrogram(linkage_matrix, labels=names, orientation=\"right\");\n", "plt.show() # fixes margins" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The clustering of documents is arguably even easier to see here than in the scatterplot. We started the notebook by asking if we could find similarities and clusters of documents in the Gutenberg corpus, and the answer seems to be a resounding yes." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## See Also" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* [Working with texts](https://de.dariah.eu/tatom/working_with_text.html) by Allen Riddell (to which this notebook is particularly indebted)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Next Steps" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's get stuck into some utility examples with [Simple Sentiment Analysis](utilities/SimpleSentimentAnalysis.ipynb)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "[CC BY-SA](https://creativecommons.org/licenses/by-sa/4.0/) From [The Art of Literary Text Analysis](ArtOfLiteraryTextAnalysis.ipynb) by [Stéfan Sinclair](http://stefansinclair.name) & [Geoffrey Rockwell](http://geoffreyrockwell.com). Edited and revised by [Melissa Mony](http://melissamony.com).
Created March 24, 2015 (run with Python 3.4)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.3" } }, "nbformat": 4, "nbformat_minor": 1 }