{ "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\n", "* TF-IDF\n", "* cosing similarity\n", "* visualizing document similarity with scatterplots\n", "* visualizing document similarity with dendrograms" ] }, { "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 of 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 in some ways, 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": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/sgs/anaconda/lib/python3.5/site-packages/sklearn/utils/fixes.py:64: DeprecationWarning: inspect.getargspec() is deprecated, use inspect.signature() instead\n", " if 'order' in inspect.getargspec(np.copy)[0]:\n" ] }, { "data": { "image/png": "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\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": { "collapsed": false }, "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": { "collapsed": false }, "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 convenience 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": { "collapsed": false }, "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 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": false }, "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": { "collapsed": false }, "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 to plot the values." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "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\n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\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": { "collapsed": false }, "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 argumably 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": [ "---\n", "From [The Art of Literary Text Analysis](ArtOfLiteraryTextAnalysis.ipynb) by [Stéfan Sinclair](http://stefansinclair.name) & [Geoffrey Rockwell](http://geoffreyrockwell.com), [CC BY-SA](https://creativecommons.org/licenses/by-sa/4.0/)
\n", "Created March 24, 2015 (run with Python 3.4)" ] } ], "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.5.0" } }, "nbformat": 4, "nbformat_minor": 0 }