<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>NLP | Kishan Mistri</title><link>https://deploy-preview-6--kishan-mistri.netlify.app/tag/nlp/</link><atom:link href="https://deploy-preview-6--kishan-mistri.netlify.app/tag/nlp/index.xml" rel="self" type="application/rss+xml"/><description>NLP</description><generator>Wowchemy (https://wowchemy.com)</generator><language>en-us</language><lastBuildDate>Tue, 20 Dec 2022 07:12:41 +0000</lastBuildDate><image><url>https://deploy-preview-6--kishan-mistri.netlify.app/media/icon_huc7c9dc13e82656c337473117c97a25ad_25328_512x512_fill_lanczos_center_3.png</url><title>NLP</title><link>https://deploy-preview-6--kishan-mistri.netlify.app/tag/nlp/</link></image><item><title>Personalized Cancer Diagnosis</title><link>https://deploy-preview-6--kishan-mistri.netlify.app/project/personalized-cancer-diagnosis/</link><pubDate>Tue, 20 Dec 2022 07:12:41 +0000</pubDate><guid>https://deploy-preview-6--kishan-mistri.netlify.app/project/personalized-cancer-diagnosis/</guid><description>&lt;p>From the expert, the time to diagnosis of cancer takes a lot of time as it includes new studies/papers, which makes this a time-consuming and exhaustive process. With machine learning, we can fast-track the majority of scenarios and help the expert get updated details.&lt;/p>
&lt;p>I have used below classical machine learning algorithms for the problem.&lt;/p>
&lt;p>1: Naive Bayes&lt;/p>
&lt;p>2: K Nearest Neighbors&lt;/p>
&lt;p>3: Logistic Regression&lt;/p>
&lt;p>4: Support Vector Machine (SVM)&lt;/p>
&lt;p>5: Random Forest Classifier&lt;/p>
&lt;p>6: StackedClassifier (Ensemble)&lt;/p>
&lt;p>7: MaxVoting Classifier (Ensemble)&lt;/p>
&lt;p>As you might know, these algorithms have their limitation and advantages, I have tried to incorporate the best use of them by remediating the problems. Like&lt;/p>
&lt;ul>
&lt;li>The curse of dimensionality has been addressed by Response Coding.&lt;/li>
&lt;li>Class imbalance can be tuned with stratified splits and using the Class weight parameter whenever exploitable.&lt;/li>
&lt;li>Compute intensive Hyper-Tuning with parallelism when needed.&lt;/li>
&lt;li>At last, the beautiful interface &amp;amp; ton of integration of streamlit used.&lt;/li>
&lt;/ul></description></item><item><title>Book Recommendations engine from Charles Darwin</title><link>https://deploy-preview-6--kishan-mistri.netlify.app/post/book-recommendations-engine-from-charles-darwin/</link><pubDate>Wed, 28 Sep 2022 13:04:04 +0000</pubDate><guid>https://deploy-preview-6--kishan-mistri.netlify.app/post/book-recommendations-engine-from-charles-darwin/</guid><description>&lt;h2 id="1-darwins-bibliography">1. Darwin&amp;rsquo;s bibliography&lt;/h2>
&lt;p>&lt;img src="charles-darwin.jpg" alt="Charles Darwin" width="300px">&lt;/p>
&lt;p>Charles Darwin is one of the few universal figures of science. His most renowned work is without a doubt his "&lt;em>On the Origin of Species&lt;/em>" published in 1859 which introduced the concept of natural selection. But Darwin wrote many other books on a wide range of topics, including geology, plants or his personal life. In this notebook, we will automatically detect how closely related his books are to each other.&lt;/p>
&lt;p>To this purpose, we will develop the bases of &lt;strong>a content-based book recommendation system&lt;/strong>, which will determine which books are close to each other based on how similar the discussed topics are. The methods we will use are commonly used in text- or documents-heavy industries such as legal, tech or customer support to perform some common task such as text classification or handling search engine queries.&lt;/p>
&lt;p>Let's take a look at the books we'll use in our recommendation system.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Import library&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">glob&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># The books files are contained in this folder&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">folder&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;datasets/&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># List all the .txt files and sort them alphabetically&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">files&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">glob&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">glob&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">folder&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="s1">&amp;#39;*.txt&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">recursive&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">files&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>﻿`` ['datasets/Autobiography.txt', 'datasets/CoralReefs.txt', 'datasets/DescentofMan.txt', 'datasets/DifferentFormsofFlowers.txt', 'datasets/EffectsCrossSelfFertilization.txt', 'datasets/ExpressionofEmotionManAnimals.txt', 'datasets/FormationVegetableMould.txt', 'datasets/FoundationsOriginofSpecies.txt', 'datasets/GeologicalObservationsSouthAmerica.txt', 'datasets/InsectivorousPlants.txt', 'datasets/LifeandLettersVol1.txt', 'datasets/LifeandLettersVol2.txt', 'datasets/MonographCirripedia.txt', 'datasets/MonographCirripediaVol2.txt', 'datasets/MovementClimbingPlants.txt', 'datasets/OriginofSpecies.txt', 'datasets/PowerMovementPlants.txt', 'datasets/VariationPlantsAnimalsDomestication.txt', 'datasets/VolcanicIslands.txt', 'datasets/VoyageBeagle.txt'] &lt;/code>﻿``&lt;/p>
&lt;h2 id="2-load-the-contents-of-each-book-into-python">2. Load the contents of each book into Python&lt;/h2>
&lt;p>As a first step, we need to load the content of these books into Python and do some basic pre-processing to facilitate the downstream analyses. We call such a collection of texts &lt;strong>a corpus&lt;/strong>. We will also store the titles for these books for future reference and print their respective length to get a gauge for their contents.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Import libraries&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">re&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Initialize the object that will contain the texts and titles&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">txts&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">titles&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">T&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">files&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Open each file&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">f&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">encoding&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;utf-8-sig&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Remove all non-alpha-numeric characters&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">filtered&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">re&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sub&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;[\W_]+&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39; &amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">read&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Store the texts and titles of the books in two separate lists&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">txts&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">filtered&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">titles&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">basename&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;.txt&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Print the length, in characters, of each book&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">t&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">t&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">txts&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>﻿`` [123231, 496068, 1776539, 617088, 913713, 624232, 335920, 523021, 797401, 901406, 1047518, 1010643, 767492, 1660866, 298319, 916267, 1093567, 1043499, 341447, 1149574] &lt;/code>﻿``&lt;/p>
&lt;h2 id="3-find-on-the-origin-of-species">3. Find &amp;ldquo;On the Origin of Species&amp;rdquo;&lt;/h2>
&lt;p>For the next parts of this analysis, we will often check the results returned by our method for a given book. For consistency, we will refer to Darwin's most famous book: "&lt;em>On the Origin of Species&lt;/em>." Let's find to which index this book is associated.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Browse the list containing all the titles&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># print(titles[:2])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ori&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">titles&lt;/span>&lt;span class="p">)):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Store the index if the title is &amp;#34;OriginofSpecies&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">titles&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s1">&amp;#39;OriginofSpecies&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ori&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">i&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Print the stored index&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ori&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl"> 15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">`﻿``
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">## 4. Tokenize the corpus
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;lt;p&amp;gt;As a next step, we need to transform the corpus into a format that is easier to deal with for the downstream analyses. We will tokenize our corpus, i.e., transform each text into a list of the individual words (called tokens) it is made of. To check the output of our process, we will print the first 20 tokens of &amp;#34;&amp;lt;em&amp;gt;On the Origin of Species&amp;lt;/em&amp;gt;&amp;#34;.&amp;lt;/p&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">```python
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># Define a list of stop words
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">stoplist = set(&amp;#39;for a of the and to in to be which some is at that we i who whom show via may my our might as well&amp;#39;.split())
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># Convert the text to lower case
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">txts_lower_case = [txt.lower() for txt in txts]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># Transform the text into tokens
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">txts_split = [txt.split() for txt in txts_lower_case]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># Remove tokens which are part of the list of stop words
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">texts = []
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">for txts in txts_split:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> temp = []
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> for token in txts:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> if token not in stoplist:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> temp.append(token)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> texts.append(temp)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># Print the first 20 tokens for the &amp;#34;On the Origin of Species&amp;#34; book
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">print(texts[ori][:20])
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>﻿`` ['on', 'origin', 'species', 'but', 'with', 'regard', 'material', 'world', 'can', 'least', 'go', 'so', 'far', 'this', 'can', 'perceive', 'events', 'are', 'brought', 'about'] &lt;/code>﻿``&lt;/p>
&lt;h2 id="5-stemming-of-the-tokenized-corpus">5. Stemming of the tokenized corpus&lt;/h2>
&lt;p>If you have read &lt;em>On the Origin of Species&lt;/em>, you will have noticed that Charles Darwin can use different words to refer to a similar concept. For example, the concept of selection can be described by words such as &lt;em>selection&lt;/em>, &lt;em>selective&lt;/em>, &lt;em>select&lt;/em> or &lt;em>selects&lt;/em>. This will dilute the weight given to this concept in the book and potentially bias the results of the analysis.&lt;/p>
&lt;p>To solve this issue, it is a common practice to use a &lt;strong>stemming process&lt;/strong>, which will group together the inflected forms of a word so they can be analysed as a single item: &lt;strong>the stem&lt;/strong>. In our &lt;em>On the Origin of Species&lt;/em> example, the words related to the concept of selection would be gathered under the &lt;em>select&lt;/em> stem.&lt;/p>
&lt;p>As we are analysing 20 full books, the stemming algorithm can take several minutes to run and, in order to make the process faster, we will directly load the final results from a pickle file and review the method used to generate it.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">pickle&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Load the Porter stemming function from the nltk package&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># from nltk.stem import PorterStemmer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Create an instance of a PorterStemmer object&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># porter = PorterStemmer()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># For each token of each text, we generated its stem &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># texts_stem = [[porter.stem(token) for token in text] for text in texts]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Save to pickle file&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># pickle.dump(texts_stem, open(&amp;#34;datasets/texts_stem.p&amp;#34;, &amp;#34;wb&amp;#34; ))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Load the stemmed tokens list from the pregenerated pickle file&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">texts_stem&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pickle&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">load&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;datasets/texts_stem.p&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;rb&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Print the 20 first stemmed tokens from the &amp;#34;On the Origin of Species&amp;#34; book&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">texts_stem&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">ori&lt;/span>&lt;span class="p">][:&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>﻿`` ['on', 'origin', 'speci', 'but', 'with', 'regard', 'materi', 'world', 'can', 'least', 'go', 'so', 'far', 'thi', 'can', 'perceiv', 'event', 'are', 'brought', 'about'] &lt;/code>﻿``&lt;/p>
&lt;h2 id="6-building-a-bag-of-words-model">6. Building a bag-of-words model&lt;/h2>
&lt;p>Now that we have transformed the texts into stemmed tokens, we need to build models that will be useable by downstream algorithms.&lt;/p>
&lt;p>First, we need to will create a universe of all words contained in our corpus of Charles Darwin's books, which we call &lt;em>a dictionary&lt;/em>. Then, using the stemmed tokens and the dictionary, we will create &lt;strong>bag-of-words models&lt;/strong> (BoW) of each of our texts. The BoW models will represent our books as a list of all uniques tokens they contain associated with their respective number of occurrences. &lt;/p>
&lt;p>To better understand the structure of such a model, we will print the five first elements of one of the "&lt;em>On the Origin of Species&lt;/em>" BoW model.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Load the functions allowing to create and use dictionaries&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">gensim&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">corpora&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Create a dictionary from the stemmed tokens&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">dictionary&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">corpora&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Dictionary&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Create a bag-of-words model for each book, using the previously generated dictionary&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">bows&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">dictionary&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">doc2bow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">doc&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">allow_update&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">doc&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">texts_stem&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Print the first five elements of the On the Origin of species&amp;#39; BoW model&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">bows&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">ori&lt;/span>&lt;span class="p">][:&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>﻿`` [(0, 11), (5, 51), (6, 1), (8, 2), (21, 1)] &lt;/code>﻿``&lt;/p>
&lt;h2 id="7-the-most-common-words-of-a-given-book">7. The most common words of a given book&lt;/h2>
&lt;p>The results returned by the bag-of-words model is certainly easy to use for a computer but hard to interpret for a human. It is not straightforward to understand which stemmed tokens are present in a given book from Charles Darwin, and how many occurrences we can find.&lt;/p>
&lt;p>In order to better understand how the model has been generated and visualize its content, we will transform it into a DataFrame and display the 10 most common stems for the book "&lt;em>On the Origin of Species&lt;/em>".&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Import pandas to create and manipulate DataFrames&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">pandas&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">pd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Convert the BoW model for &amp;#34;On the Origin of Species&amp;#34; into a DataFrame&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">df_bow_origin&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bows&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">ori&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Add the column names to the DataFrame&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">df_bow_origin&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">columns&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;index&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;occurrences&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Add a column containing the token corresponding to the dictionary index&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">df_bow_origin&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;token&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">dictionary&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">idx&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">idx&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">df_bow_origin&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;index&amp;#39;&lt;/span>&lt;span class="p">]]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Sort the DataFrame by descending number of occurrences and print the first 10 values&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">df_bow_origin&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sort_values&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;occurrences&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">ascending&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">False&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">head&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div>
&lt;style>
.dataframe thead tr:only-child th {
text-align: right;
}
&lt;pre>&lt;code>.dataframe thead th {
text-align: left;
}
.dataframe tbody tr th {
vertical-align: top;
}
&lt;/code>&lt;/pre>
&lt;p>&lt;/style>&lt;/p>
&lt;table border="1" class="dataframe">
&lt;thead>
&lt;tr style="text-align: right;">
&lt;th>&lt;/th>
&lt;th>index&lt;/th>
&lt;th>occurrences&lt;/th>
&lt;th>token&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;th>748&lt;/th>
&lt;td>1168&lt;/td>
&lt;td>2023&lt;/td>
&lt;td>have&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>1119&lt;/th>
&lt;td>1736&lt;/td>
&lt;td>1558&lt;/td>
&lt;td>on&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>1489&lt;/th>
&lt;td>2288&lt;/td>
&lt;td>1543&lt;/td>
&lt;td>speci&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>892&lt;/th>
&lt;td>1366&lt;/td>
&lt;td>1480&lt;/td>
&lt;td>it&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>239&lt;/th>
&lt;td>393&lt;/td>
&lt;td>1362&lt;/td>
&lt;td>by&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>1128&lt;/th>
&lt;td>1747&lt;/td>
&lt;td>1201&lt;/td>
&lt;td>or&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>125&lt;/th>
&lt;td>218&lt;/td>
&lt;td>1140&lt;/td>
&lt;td>are&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>665&lt;/th>
&lt;td>1043&lt;/td>
&lt;td>1137&lt;/td>
&lt;td>from&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>1774&lt;/th>
&lt;td>2703&lt;/td>
&lt;td>1000&lt;/td>
&lt;td>with&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>1609&lt;/th>
&lt;td>2452&lt;/td>
&lt;td>962&lt;/td>
&lt;td>thi&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;h2 id="8-build-a-tf-idf-model">8. Build a tf-idf model&lt;/h2>
&lt;p>If it wasn't for the presence of the stem "&lt;em>speci&lt;/em>", we would have a hard time to guess this BoW model comes from the &lt;em>On the Origin of Species&lt;/em> book. The most recurring words are, apart from few exceptions, very common and unlikely to carry any information peculiar to the given book. We need to use an additional step in order to determine which tokens are the most specific to a book.&lt;/p>
&lt;p>To do so, we will use a &lt;strong>tf-idf model&lt;/strong> (term frequency–inverse document frequency). This model defines the importance of each word depending on how frequent it is in this text and how infrequent it is in all the other documents. As a result, a high tf-idf score for a word will indicate that this word is specific to this text.&lt;/p>
&lt;p>After computing those scores, we will print the 10 words most specific to the "&lt;em>On the Origin of Species&lt;/em>" book (i.e., the 10 words with the highest tf-idf score).&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Load the gensim functions that will allow us to generate tf-idf models&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">gensim.models&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">TfidfModel&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Generate the tf-idf model&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">model&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">TfidfModel&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bows&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Print the model for &amp;#34;On the Origin of Species&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">model&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">bows&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">ori&lt;/span>&lt;span class="p">]]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>﻿`` [(8, 0.00020383224047642202), (21, 0.0005716037746542094), (23, 0.0017118699041370883), (27, 0.0006458270601429994), (28, 0.0025678048562056324), (31, 0.0008559349520685442), (35, 0.00101497410751472), (36, 0.00101497410751472), (51, 0.000886740665721021), (54, 0.00202994821502944), (56, 0.0023757190244598344), (57, 0.00010191612023821101), (63, 0.0027544680933525786), (64, 0.000509580601191055), (66, 0.00020383224047642202), (67, 0.0023757190244598344), (68, 0.00202994821502944), (75, 0.0013772340466762893), (76, 0.0004433703328605105), (78, 0.004171843479607349), (80, 0.0020859217398036746), (83, 0.00857405661981314), (84, 0.000509580601191055), (88, 0.002445986885717064), (89, 0.0033632319678609636), (90, 0.000886740665721021), (91, 0.0016747506839411234), (94, 0.000886740665721021), (95, 0.0004433703328605105), (96, 0.003546962662884084), (97, 0.0016306579238113761), (102, 0.037686478293143394), (104, 0.000917245082143899), (106, 0.001417375386254771), (108, 0.0035434384656369273), (109, 0.005299638252386972), (111, 0.0022421546452406423), (114, 0.0015287418035731652), (123, 0.0509769226270304), (125, 0.009580115302391834), (126, 0.004171843479607349), (127, 0.001417375386254771), (137, 0.020026648174904797), (139, 0.007749924721715993), (141, 0.00101916120238211), (143, 0.004751438048919669), (144, 0.0047597336465067894), (154, 0.0010467191774632021), (156, 0.013962508472634907), (165, 0.006781184131501494), (167, 0.000611496721429266), (172, 0.021771758891234606), (176, 0.0033632319678609636), (178, 0.0031035923300235736), (186, 0.009274366941677202), (188, 0.0016747506839411234), (192, 0.006257765219411025), (196, 0.0038749623608579963), (197, 0.0013772340466762893), (198, 0.000886740665721021), (204, 0.0042521261587643135), (207, 0.0022603947105004976), (212, 0.001324909563096743), (214, 0.020395035311583484), (215, 0.021720943436859957), (219, 0.0019374811804289981), (220, 0.004396220545345449), (221, 0.0054618131386103995), (222, 0.0018206043795367997), (223, 0.0007086876931273855), (224, 0.007703414568616897), (226, 0.0030574836071463303), (230, 0.005135609712411265), (231, 0.0027544680933525786), (235, 0.002445986885717064), (236, 0.0012916541202859988), (237, 0.0020934383549264042), (241, 0.0029308136968969663), (242, 0.0015865778821689297), (243, 0.008263404280057736), (245, 0.004520789421000995), (246, 0.003465148088099174), (247, 0.001732574044049587), (249, 0.0018840945194337638), (251, 0.008343686959214698), (252, 0.0030449223225441605), (253, 0.0006458270601429994), (261, 0.001324909563096743), (269, 0.0006458270601429994), (271, 0.0008373753419705617), (276, 0.009921627703783398), (278, 0.0034296226479252566), (280, 0.0021260630793821567), (283, 0.02138147122013851), (285, 0.001417375386254771), (287, 0.0013301109985815313), (288, 0.006886170233381447), (290, 0.0035434384656369273), (291, 0.0018206043795367997), (296, 0.009839160268154101), (298, 0.042694255446964965), (300, 0.0016747506839411234), (301, 0.000611496721429266), (302, 0.0042521261587643135), (303, 0.004171843479607349), (304, 0.0020859217398036746), (311, 0.0016306579238113761), (313, 0.007086876931273855), (323, 0.0047597336465067894), (325, 0.021606217490500734), (327, 0.001732574044049587), (329, 0.01790404260679176), (335, 0.0004433703328605105), (336, 0.0023922081541910096), (338, 0.0020859217398036746), (339, 0.001417375386254771), (344, 0.001417375386254771), (345, 0.011527628654373272), (346, 0.00020383224047642202), (348, 0.0006280315064779214), (349, 0.0006458270601429994), (351, 0.0036412087590735995), (354, 0.007980665991489189), (356, 0.0018840945194337638), (358, 0.013772340466762893), (359, 0.0022603947105004976), (362, 0.00101497410751472), (367, 0.0023922081541910096), (369, 0.19772097392783367), (370, 0.043694505108883196), (371, 0.000509580601191055), (372, 0.0023922081541910096), (373, 0.0016306579238113761), (374, 0.001732574044049587), (375, 0.001936406284526009), (376, 0.006489658900271853), (377, 0.0030449223225441605), (380, 0.0016145676503574987), (387, 0.0007086876931273855), (388, 0.0042521261587643135), (389, 0.0005716037746542094), (391, 0.0023922081541910096), (400, 0.00202994821502944), (406, 0.013772340466762893), (407, 0.0005716037746542094), (409, 0.0035588452033748874), (411, 0.0007086876931273855), (412, 0.004751438048919669), (418, 0.0027544680933525786), (421, 0.0027544680933525786), (424, 0.007538884401734597), (425, 0.00811979286011776), (426, 0.0032291353007149973), (429, 0.000886740665721021), (431, 0.000886740665721021), (432, 0.010149741075147201), (433, 0.0016306579238113761), (434, 0.00405989643005888), (436, 0.0021260630793821567), (442, 0.009212940010656012), (446, 0.004171843479607349), (448, 0.021562415055741965), (449, 0.03291890683694216), (450, 0.0035434384656369273), (453, 0.0011210773226203211), (454, 0.00405989643005888), (456, 0.011301973552502492), (457, 0.0020859217398036746), (458, 0.0003229135300714997), (463, 0.01790404260679176), (464, 0.0027544680933525786), (465, 0.0008559349520685442), (468, 0.00202994821502944), (470, 0.0018206043795367997), (478, 0.010923626277220799), (482, 0.0344479258546676), (484, 0.013772340466762893), (486, 0.0020859217398036746), (489, 0.0054618131386103995), (490, 0.022603947105004983), (491, 0.00405989643005888), (493, 0.0007086876931273855), (497, 0.012839024281028162), (498, 0.0035434384656369273), (502, 0.00637818923814647), (505, 0.011970998987233783), (507, 0.0009687405902144991), (514, 0.0025121260259116855), (520, 0.004280477050004863), (524, 0.0020859217398036746), (526, 0.005716037746542095), (527, 0.0027544680933525786), (529, 0.006318799454769082), (531, 0.003546962662884084), (532, 0.012791353704852355), (534, 0.005320443994326125), (536, 0.0014268256833349542), (541, 0.0011432075493084189), (543, 0.01110604517518251), (544, 0.0031401575323896065), (546, 0.0017148113239626283), (551, 0.004784416308382019), (552, 0.0031731557643378595), (558, 0.0023922081541910096), (559, 0.00020383224047642202), (561, 0.0022421546452406423), (562, 0.005197722132148762), (563, 0.006908346571257135), (564, 0.0011432075493084189), (565, 0.00405989643005888), (566, 0.0013772340466762893), (569, 0.04034670029030646), (573, 0.010630315396910783), (576, 0.0025121260259116855), (578, 0.0028580188732710474), (579, 0.003159399727384541), (582, 0.0035434384656369273), (586, 0.003563578536689751), (590, 0.0017118699041370883), (592, 0.0010467191774632021), (593, 0.0018206043795367997), (594, 0.015898914757160917), (596, 0.0015865778821689297), (598, 0.0023922081541910096), (600, 0.01251553043882205), (601, 0.00202994821502944), (604, 0.05582357591330961), (605, 0.00637818923814647), (606, 0.0005716037746542094), (616, 0.0010467191774632021), (619, 0.00710481875260304), (620, 0.024945049756828264), (626, 0.0013772340466762893), (628, 0.00041868767098528084), (629, 0.004197875890929496), (633, 0.0013301109985815313), (635, 0.004960813851891699), (636, 0.005991544664479809), (641, 0.006346311528675719), (646, 0.0027544680933525786), (649, 0.005763814327186636), (652, 0.000917245082143899), (653, 0.0011432075493084189), (654, 0.0023757190244598344), (655, 0.0016747506839411234), (657, 0.0030449223225441605), (658, 0.007104097661572994), (660, 0.005144433971887885), (662, 0.003563578536689751), (663, 0.0011878595122299172), (665, 0.00101497410751472), (666, 0.006395676852426178), (667, 0.01623958572023552), (668, 0.005669501545019084), (670, 0.011723254787587865), (674, 0.002445986885717064), (675, 0.0450089246309177), (676, 0.061655829302082535), (678, 0.00040766448095284403), (679, 0.005144433971887885), (681, 0.0007134128416674771), (682, 0.0015865778821689297), (685, 0.0020859217398036746), (686, 0.0006458270601429994), (693, 0.0035670642083373855), (698, 0.0022864150986168378), (705, 0.0034237398082741766), (712, 0.0017118699041370883), (713, 0.0013772340466762893), (720, 0.0029308136968969663), (722, 0.005074870537573601), (726, 0.01771719232818464), (727, 0.004396220545345449), (728, 0.0031731557643378595), (729, 0.006089844645088321), (730, 0.01028886794377577), (731, 0.0017148113239626283), (740, 0.008357121859533303), (741, 0.0066990027357644935), (743, 0.006930296176198348), (744, 0.01033323296228799), (745, 0.006257765219411025), (748, 0.017254559827750243), (750, 0.07127157073379503), (752, 0.1459896647842414), (753, 0.06980942681543291), (758, 0.004197875890929496), (769, 0.0017118699041370883), (770, 0.0010467191774632021), (771, 0.0007134128416674771), (776, 0.00020934383549264042), (783, 0.006346311528675719), (784, 0.004171843479607349), (785, 0.002834750772509542), (786, 0.004171843479607349), (787, 0.006930296176198348), (788, 0.002955567486908119), (789, 0.003546962662884084), (793, 0.014208195323145987), (797, 0.004197875890929496), (798, 0.024359378580353284), (803, 0.010149741075147201), (805, 0.0034237398082741766), (806, 0.02571547930590961), (810, 0.0011878595122299172), (811, 0.006886170233381447), (815, 0.0018840945194337638), (816, 0.0012560630129558428), (817, 0.0015865778821689297), (819, 0.0026602219971630626), (820, 0.006458270601429995), (821, 0.006207184660047147), (822, 0.0688958517093352), (825, 0.0003229135300714997), (830, 0.001222993442858532), (831, 0.003552048830786497), (832, 0.02256933073236843), (833, 0.01097906002243099), (834, 0.0017118699041370883), (838, 0.001936406284526009), (839, 0.0016306579238113761), (842, 0.0013772340466762893), (848, 0.006886170233381447), (849, 0.0011432075493084189), (851, 0.0020859217398036746), (857, 0.0005716037746542094), (859, 0.008343686959214698), (861, 0.0018840945194337638), (862, 0.001732574044049587), (866, 0.004433703328605105), (867, 0.004784416308382019), (870, 0.0003229135300714997), (873, 0.01886292456358891), (875, 0.0009687405902144991), (878, 0.00202994821502944), (879, 0.005489530011215495), (881, 0.0007086876931273855), (883, 0.0008153289619056881), (885, 0.0023922081541910096), (887, 0.001732574044049587), (891, 0.0006458270601429994), (892, 0.0013772340466762893), (894, 0.002445986885717064), (897, 0.005991544664479809), (898, 0.0011432075493084189), (903, 0.0011878595122299172), (905, 0.0025678048562056324), (909, 0.002649819126193486), (910, 0.005508936186705157), (917, 0.05877026247301295), (919, 0.0017118699041370883), (921, 0.0011210773226203211), (924, 0.0054015543726251836), (925, 0.004784416308382019), (929, 0.013718490591701027), (931, 0.00101497410751472), (935, 0.0026602219971630626), (936, 0.0025121260259116855), (937, 0.0009687405902144991), (939, 0.0016306579238113761), (944, 0.000886740665721021), (945, 0.00710481875260304), (948, 0.0023757190244598344), (951, 0.012692623057351438), (952, 0.006089844645088321), (953, 0.005074870537573601), (956, 0.010149741075147201), (957, 0.0012560630129558428), (958, 0.0008559349520685442), (962, 0.0011432075493084189), (966, 0.12753430785821307), (967, 0.047703783053191846), (971, 0.0019374811804289981), (973, 0.000509580601191055), (975, 0.00040766448095284403), (976, 0.00203832240476422), (980, 0.009502876097839338), (981, 0.016526808560115472), (982, 0.00101497410751472), (985, 0.03886905667648624), (988, 0.004382393170243073), (992, 0.0014268256833349542), (994, 0.007932889410844648), (995, 0.021725146310165012), (996, 0.011527628654373272), (997, 0.0022603947105004976), (998, 0.03014551231094022), (999, 0.009519467293013579), (1000, 0.00010191612023821101), (1004, 0.0011878595122299172), ...] &lt;/code>﻿``&lt;/p>
&lt;h2 id="9-the-results-of-the-tf-idf-model">9. The results of the tf-idf model&lt;/h2>
&lt;p>Once again, the format of those results is hard to interpret for a human. Therefore, we will transform it into a more readable version and display the 10 most specific words for the "&lt;em>On the Origin of Species&lt;/em>" book.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Convert the tf-idf model for &amp;#34;On the Origin of Species&amp;#34; into a DataFrame&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">df_tfidf&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">bows&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">ori&lt;/span>&lt;span class="p">]])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Name the columns of the DataFrame id and score&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">df_tfidf&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">columns&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;id&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;score&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Add the tokens corresponding to the numerical indices for better readability&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">df_tfidf&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;token&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">dictionary&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">idx&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">idx&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">df_tfidf&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Sort the DataFrame by descending tf-idf score and print the first 10 rows.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">df_tfidf&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sort_values&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;score&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">ascending&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">False&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">head&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div>
&lt;style>
.dataframe thead tr:only-child th {
text-align: right;
}
&lt;pre>&lt;code>.dataframe thead th {
text-align: left;
}
.dataframe tbody tr th {
vertical-align: top;
}
&lt;/code>&lt;/pre>
&lt;p>&lt;/style>&lt;/p>
&lt;table border="1" class="dataframe">
&lt;thead>
&lt;tr style="text-align: right;">
&lt;th>&lt;/th>
&lt;th>id&lt;/th>
&lt;th>score&lt;/th>
&lt;th>token&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;th>878&lt;/th>
&lt;td>2164&lt;/td>
&lt;td>0.327414&lt;/td>
&lt;td>select&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>3106&lt;/th>
&lt;td>10108&lt;/td>
&lt;td>0.203908&lt;/td>
&lt;td>pigeon&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>128&lt;/th>
&lt;td>369&lt;/td>
&lt;td>0.197721&lt;/td>
&lt;td>breed&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>2988&lt;/th>
&lt;td>9396&lt;/td>
&lt;td>0.167496&lt;/td>
&lt;td>migrat&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>945&lt;/th>
&lt;td>2325&lt;/td>
&lt;td>0.148186&lt;/td>
&lt;td>steril&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>284&lt;/th>
&lt;td>752&lt;/td>
&lt;td>0.145990&lt;/td>
&lt;td>domest&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>503&lt;/th>
&lt;td>1255&lt;/td>
&lt;td>0.128272&lt;/td>
&lt;td>hybrid&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>370&lt;/th>
&lt;td>966&lt;/td>
&lt;td>0.127534&lt;/td>
&lt;td>fertil&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>3889&lt;/th>
&lt;td>16210&lt;/td>
&lt;td>0.124392&lt;/td>
&lt;td>rtner&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>3540&lt;/th>
&lt;td>12715&lt;/td>
&lt;td>0.121197&lt;/td>
&lt;td>naturalis&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;h2 id="10-compute-distance-between-texts">10. Compute distance between texts&lt;/h2>
&lt;p>The results of the tf-idf algorithm now return stemmed tokens which are specific to each book. We can, for example, see that topics such as selection, breeding or domestication are defining "&lt;em>On the Origin of Species&lt;/em>" (and yes, in this book, Charles Darwin talks quite a lot about pigeons too). Now that we have a model associating tokens to how specific they are to each book, we can measure how related to books are between each other.&lt;/p>
&lt;p>To this purpose, we will use a measure of similarity called &lt;strong>cosine similarity&lt;/strong> and we will visualize the results as a distance matrix, i.e., a matrix showing all pairwise distances between Darwin's books.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Load the library allowing similarity computations&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">gensim&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">similarities&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Compute the similarity matrix (pairwise distance between all texts)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">sims&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">similarities&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">MatrixSimilarity&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">bows&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Transform the resulting list into a dataframe&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">sim_df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sims&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Add the titles of the books as columns and index of the dataframe&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">sim_df&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">index&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">titles&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">sim_df&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">columns&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">titles&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Print the resulting matrix&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">sim_df&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div>
&lt;style>
.dataframe thead tr:only-child th {
text-align: right;
}
&lt;pre>&lt;code>.dataframe thead th {
text-align: left;
}
.dataframe tbody tr th {
vertical-align: top;
}
&lt;/code>&lt;/pre>
&lt;p>&lt;/style>&lt;/p>
&lt;table border="1" class="dataframe">
&lt;thead>
&lt;tr style="text-align: right;">
&lt;th>&lt;/th>
&lt;th>Autobiography&lt;/th>
&lt;th>CoralReefs&lt;/th>
&lt;th>DescentofMan&lt;/th>
&lt;th>DifferentFormsofFlowers&lt;/th>
&lt;th>EffectsCrossSelfFertilization&lt;/th>
&lt;th>ExpressionofEmotionManAnimals&lt;/th>
&lt;th>FormationVegetableMould&lt;/th>
&lt;th>FoundationsOriginofSpecies&lt;/th>
&lt;th>GeologicalObservationsSouthAmerica&lt;/th>
&lt;th>InsectivorousPlants&lt;/th>
&lt;th>LifeandLettersVol1&lt;/th>
&lt;th>LifeandLettersVol2&lt;/th>
&lt;th>MonographCirripedia&lt;/th>
&lt;th>MonographCirripediaVol2&lt;/th>
&lt;th>MovementClimbingPlants&lt;/th>
&lt;th>OriginofSpecies&lt;/th>
&lt;th>PowerMovementPlants&lt;/th>
&lt;th>VariationPlantsAnimalsDomestication&lt;/th>
&lt;th>VolcanicIslands&lt;/th>
&lt;th>VoyageBeagle&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;th>Autobiography&lt;/th>
&lt;td>1.000000&lt;/td>
&lt;td>0.049467&lt;/td>
&lt;td>0.080428&lt;/td>
&lt;td>0.066482&lt;/td>
&lt;td>0.077184&lt;/td>
&lt;td>0.088723&lt;/td>
&lt;td>0.040678&lt;/td>
&lt;td>0.059271&lt;/td>
&lt;td>0.030562&lt;/td>
&lt;td>0.014878&lt;/td>
&lt;td>0.396709&lt;/td>
&lt;td>0.217129&lt;/td>
&lt;td>0.005686&lt;/td>
&lt;td>0.008483&lt;/td>
&lt;td>0.022856&lt;/td>
&lt;td>0.099991&lt;/td>
&lt;td>0.016247&lt;/td>
&lt;td>0.049018&lt;/td>
&lt;td>0.038556&lt;/td>
&lt;td>0.183507&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>CoralReefs&lt;/th>
&lt;td>0.049467&lt;/td>
&lt;td>1.000000&lt;/td>
&lt;td>0.009480&lt;/td>
&lt;td>0.001952&lt;/td>
&lt;td>0.001923&lt;/td>
&lt;td>0.004999&lt;/td>
&lt;td>0.029432&lt;/td>
&lt;td>0.022096&lt;/td>
&lt;td>0.061027&lt;/td>
&lt;td>0.002276&lt;/td>
&lt;td>0.030965&lt;/td>
&lt;td>0.017558&lt;/td>
&lt;td>0.006324&lt;/td>
&lt;td>0.010579&lt;/td>
&lt;td>0.001518&lt;/td>
&lt;td>0.039089&lt;/td>
&lt;td>0.002707&lt;/td>
&lt;td>0.011586&lt;/td>
&lt;td>0.057514&lt;/td>
&lt;td>0.267749&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>DescentofMan&lt;/th>
&lt;td>0.080428&lt;/td>
&lt;td>0.009480&lt;/td>
&lt;td>1.000000&lt;/td>
&lt;td>0.072761&lt;/td>
&lt;td>0.029968&lt;/td>
&lt;td>0.148670&lt;/td>
&lt;td>0.027055&lt;/td>
&lt;td>0.135775&lt;/td>
&lt;td>0.009698&lt;/td>
&lt;td>0.009404&lt;/td>
&lt;td>0.059684&lt;/td>
&lt;td>0.080314&lt;/td>
&lt;td>0.053506&lt;/td>
&lt;td>0.043275&lt;/td>
&lt;td>0.005146&lt;/td>
&lt;td>0.267554&lt;/td>
&lt;td>0.011357&lt;/td>
&lt;td>0.232841&lt;/td>
&lt;td>0.007882&lt;/td>
&lt;td>0.123917&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>DifferentFormsofFlowers&lt;/th>
&lt;td>0.066482&lt;/td>
&lt;td>0.001952&lt;/td>
&lt;td>0.072761&lt;/td>
&lt;td>1.000000&lt;/td>
&lt;td>0.391834&lt;/td>
&lt;td>0.006474&lt;/td>
&lt;td>0.010585&lt;/td>
&lt;td>0.040104&lt;/td>
&lt;td>0.002846&lt;/td>
&lt;td>0.007502&lt;/td>
&lt;td>0.015933&lt;/td>
&lt;td>0.046523&lt;/td>
&lt;td>0.009405&lt;/td>
&lt;td>0.005484&lt;/td>
&lt;td>0.008151&lt;/td>
&lt;td>0.128909&lt;/td>
&lt;td>0.018964&lt;/td>
&lt;td>0.050023&lt;/td>
&lt;td>0.002611&lt;/td>
&lt;td>0.013124&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>EffectsCrossSelfFertilization&lt;/th>
&lt;td>0.077184&lt;/td>
&lt;td>0.001923&lt;/td>
&lt;td>0.029968&lt;/td>
&lt;td>0.391834&lt;/td>
&lt;td>1.000000&lt;/td>
&lt;td>0.006844&lt;/td>
&lt;td>0.032262&lt;/td>
&lt;td>0.040288&lt;/td>
&lt;td>0.002246&lt;/td>
&lt;td>0.006777&lt;/td>
&lt;td>0.019504&lt;/td>
&lt;td>0.046504&lt;/td>
&lt;td>0.003212&lt;/td>
&lt;td>0.002962&lt;/td>
&lt;td>0.014932&lt;/td>
&lt;td>0.146441&lt;/td>
&lt;td>0.039770&lt;/td>
&lt;td>0.055132&lt;/td>
&lt;td>0.002178&lt;/td>
&lt;td>0.017140&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>ExpressionofEmotionManAnimals&lt;/th>
&lt;td>0.088723&lt;/td>
&lt;td>0.004999&lt;/td>
&lt;td>0.148670&lt;/td>
&lt;td>0.006474&lt;/td>
&lt;td>0.006844&lt;/td>
&lt;td>1.000000&lt;/td>
&lt;td>0.020985&lt;/td>
&lt;td>0.047202&lt;/td>
&lt;td>0.005217&lt;/td>
&lt;td>0.011475&lt;/td>
&lt;td>0.064873&lt;/td>
&lt;td>0.048886&lt;/td>
&lt;td>0.016825&lt;/td>
&lt;td>0.029897&lt;/td>
&lt;td>0.005913&lt;/td>
&lt;td>0.062979&lt;/td>
&lt;td>0.011317&lt;/td>
&lt;td>0.083847&lt;/td>
&lt;td>0.005561&lt;/td>
&lt;td>0.098961&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>FormationVegetableMould&lt;/th>
&lt;td>0.040678&lt;/td>
&lt;td>0.029432&lt;/td>
&lt;td>0.027055&lt;/td>
&lt;td>0.010585&lt;/td>
&lt;td>0.032262&lt;/td>
&lt;td>0.020985&lt;/td>
&lt;td>1.000000&lt;/td>
&lt;td>0.021470&lt;/td>
&lt;td>0.067989&lt;/td>
&lt;td>0.035589&lt;/td>
&lt;td>0.027916&lt;/td>
&lt;td>0.023620&lt;/td>
&lt;td>0.019866&lt;/td>
&lt;td>0.023984&lt;/td>
&lt;td>0.038820&lt;/td>
&lt;td>0.049259&lt;/td>
&lt;td>0.040182&lt;/td>
&lt;td>0.033147&lt;/td>
&lt;td>0.059407&lt;/td>
&lt;td>0.097908&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>FoundationsOriginofSpecies&lt;/th>
&lt;td>0.059271&lt;/td>
&lt;td>0.022096&lt;/td>
&lt;td>0.135775&lt;/td>
&lt;td>0.040104&lt;/td>
&lt;td>0.040288&lt;/td>
&lt;td>0.047202&lt;/td>
&lt;td>0.021470&lt;/td>
&lt;td>1.000000&lt;/td>
&lt;td>0.028028&lt;/td>
&lt;td>0.006023&lt;/td>
&lt;td>0.057820&lt;/td>
&lt;td>0.054782&lt;/td>
&lt;td>0.007618&lt;/td>
&lt;td>0.010883&lt;/td>
&lt;td>0.003973&lt;/td>
&lt;td>0.322405&lt;/td>
&lt;td>0.008788&lt;/td>
&lt;td>0.194533&lt;/td>
&lt;td>0.017590&lt;/td>
&lt;td>0.089132&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>GeologicalObservationsSouthAmerica&lt;/th>
&lt;td>0.030562&lt;/td>
&lt;td>0.061027&lt;/td>
&lt;td>0.009698&lt;/td>
&lt;td>0.002846&lt;/td>
&lt;td>0.002246&lt;/td>
&lt;td>0.005217&lt;/td>
&lt;td>0.067989&lt;/td>
&lt;td>0.028028&lt;/td>
&lt;td>1.000000&lt;/td>
&lt;td>0.006879&lt;/td>
&lt;td>0.028551&lt;/td>
&lt;td>0.012104&lt;/td>
&lt;td>0.009687&lt;/td>
&lt;td>0.024738&lt;/td>
&lt;td>0.002043&lt;/td>
&lt;td>0.058046&lt;/td>
&lt;td>0.003491&lt;/td>
&lt;td>0.014389&lt;/td>
&lt;td>0.373249&lt;/td>
&lt;td>0.260141&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>InsectivorousPlants&lt;/th>
&lt;td>0.014878&lt;/td>
&lt;td>0.002276&lt;/td>
&lt;td>0.009404&lt;/td>
&lt;td>0.007502&lt;/td>
&lt;td>0.006777&lt;/td>
&lt;td>0.011475&lt;/td>
&lt;td>0.035589&lt;/td>
&lt;td>0.006023&lt;/td>
&lt;td>0.006879&lt;/td>
&lt;td>1.000000&lt;/td>
&lt;td>0.005967&lt;/td>
&lt;td>0.016518&lt;/td>
&lt;td>0.019214&lt;/td>
&lt;td>0.020023&lt;/td>
&lt;td>0.249814&lt;/td>
&lt;td>0.014961&lt;/td>
&lt;td>0.023056&lt;/td>
&lt;td>0.010522&lt;/td>
&lt;td>0.008544&lt;/td>
&lt;td>0.014776&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>LifeandLettersVol1&lt;/th>
&lt;td>0.396709&lt;/td>
&lt;td>0.030965&lt;/td>
&lt;td>0.059684&lt;/td>
&lt;td>0.015933&lt;/td>
&lt;td>0.019504&lt;/td>
&lt;td>0.064873&lt;/td>
&lt;td>0.027916&lt;/td>
&lt;td>0.057820&lt;/td>
&lt;td>0.028551&lt;/td>
&lt;td>0.005967&lt;/td>
&lt;td>1.000000&lt;/td>
&lt;td>0.885828&lt;/td>
&lt;td>0.005752&lt;/td>
&lt;td>0.012772&lt;/td>
&lt;td>0.005388&lt;/td>
&lt;td>0.097457&lt;/td>
&lt;td>0.009505&lt;/td>
&lt;td>0.055259&lt;/td>
&lt;td>0.026374&lt;/td>
&lt;td>0.171708&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>LifeandLettersVol2&lt;/th>
&lt;td>0.217129&lt;/td>
&lt;td>0.017558&lt;/td>
&lt;td>0.080314&lt;/td>
&lt;td>0.046523&lt;/td>
&lt;td>0.046504&lt;/td>
&lt;td>0.048886&lt;/td>
&lt;td>0.023620&lt;/td>
&lt;td>0.054782&lt;/td>
&lt;td>0.012104&lt;/td>
&lt;td>0.016518&lt;/td>
&lt;td>0.885828&lt;/td>
&lt;td>1.000000&lt;/td>
&lt;td>0.004967&lt;/td>
&lt;td>0.010843&lt;/td>
&lt;td>0.017565&lt;/td>
&lt;td>0.096955&lt;/td>
&lt;td>0.012099&lt;/td>
&lt;td>0.050764&lt;/td>
&lt;td>0.011806&lt;/td>
&lt;td>0.089947&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>MonographCirripedia&lt;/th>
&lt;td>0.005686&lt;/td>
&lt;td>0.006324&lt;/td>
&lt;td>0.053506&lt;/td>
&lt;td>0.009405&lt;/td>
&lt;td>0.003212&lt;/td>
&lt;td>0.016825&lt;/td>
&lt;td>0.019866&lt;/td>
&lt;td>0.007618&lt;/td>
&lt;td>0.009687&lt;/td>
&lt;td>0.019214&lt;/td>
&lt;td>0.005752&lt;/td>
&lt;td>0.004967&lt;/td>
&lt;td>1.000001&lt;/td>
&lt;td>0.522273&lt;/td>
&lt;td>0.012441&lt;/td>
&lt;td>0.029902&lt;/td>
&lt;td>0.018694&lt;/td>
&lt;td>0.023460&lt;/td>
&lt;td>0.010754&lt;/td>
&lt;td>0.014342&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>MonographCirripediaVol2&lt;/th>
&lt;td>0.008483&lt;/td>
&lt;td>0.010579&lt;/td>
&lt;td>0.043275&lt;/td>
&lt;td>0.005484&lt;/td>
&lt;td>0.002962&lt;/td>
&lt;td>0.029897&lt;/td>
&lt;td>0.023984&lt;/td>
&lt;td>0.010883&lt;/td>
&lt;td>0.024738&lt;/td>
&lt;td>0.020023&lt;/td>
&lt;td>0.012772&lt;/td>
&lt;td>0.010843&lt;/td>
&lt;td>0.522273&lt;/td>
&lt;td>1.000000&lt;/td>
&lt;td>0.006802&lt;/td>
&lt;td>0.036755&lt;/td>
&lt;td>0.022376&lt;/td>
&lt;td>0.030669&lt;/td>
&lt;td>0.017952&lt;/td>
&lt;td>0.025047&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>MovementClimbingPlants&lt;/th>
&lt;td>0.022856&lt;/td>
&lt;td>0.001518&lt;/td>
&lt;td>0.005146&lt;/td>
&lt;td>0.008151&lt;/td>
&lt;td>0.014932&lt;/td>
&lt;td>0.005913&lt;/td>
&lt;td>0.038820&lt;/td>
&lt;td>0.003973&lt;/td>
&lt;td>0.002043&lt;/td>
&lt;td>0.249814&lt;/td>
&lt;td>0.005388&lt;/td>
&lt;td>0.017565&lt;/td>
&lt;td>0.012441&lt;/td>
&lt;td>0.006802&lt;/td>
&lt;td>1.000000&lt;/td>
&lt;td>0.008802&lt;/td>
&lt;td>0.104966&lt;/td>
&lt;td>0.011530&lt;/td>
&lt;td>0.002832&lt;/td>
&lt;td>0.012282&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>OriginofSpecies&lt;/th>
&lt;td>0.099991&lt;/td>
&lt;td>0.039089&lt;/td>
&lt;td>0.267554&lt;/td>
&lt;td>0.128909&lt;/td>
&lt;td>0.146441&lt;/td>
&lt;td>0.062979&lt;/td>
&lt;td>0.049259&lt;/td>
&lt;td>0.322405&lt;/td>
&lt;td>0.058046&lt;/td>
&lt;td>0.014961&lt;/td>
&lt;td>0.097457&lt;/td>
&lt;td>0.096955&lt;/td>
&lt;td>0.029902&lt;/td>
&lt;td>0.036755&lt;/td>
&lt;td>0.008802&lt;/td>
&lt;td>1.000000&lt;/td>
&lt;td>0.018266&lt;/td>
&lt;td>0.405333&lt;/td>
&lt;td>0.036014&lt;/td>
&lt;td>0.164661&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>PowerMovementPlants&lt;/th>
&lt;td>0.016247&lt;/td>
&lt;td>0.002707&lt;/td>
&lt;td>0.011357&lt;/td>
&lt;td>0.018964&lt;/td>
&lt;td>0.039770&lt;/td>
&lt;td>0.011317&lt;/td>
&lt;td>0.040182&lt;/td>
&lt;td>0.008788&lt;/td>
&lt;td>0.003491&lt;/td>
&lt;td>0.023056&lt;/td>
&lt;td>0.009505&lt;/td>
&lt;td>0.012099&lt;/td>
&lt;td>0.018694&lt;/td>
&lt;td>0.022376&lt;/td>
&lt;td>0.104966&lt;/td>
&lt;td>0.018266&lt;/td>
&lt;td>1.000000&lt;/td>
&lt;td>0.020589&lt;/td>
&lt;td>0.003819&lt;/td>
&lt;td>0.024149&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>VariationPlantsAnimalsDomestication&lt;/th>
&lt;td>0.049018&lt;/td>
&lt;td>0.011586&lt;/td>
&lt;td>0.232841&lt;/td>
&lt;td>0.050023&lt;/td>
&lt;td>0.055132&lt;/td>
&lt;td>0.083847&lt;/td>
&lt;td>0.033147&lt;/td>
&lt;td>0.194533&lt;/td>
&lt;td>0.014389&lt;/td>
&lt;td>0.010522&lt;/td>
&lt;td>0.055259&lt;/td>
&lt;td>0.050764&lt;/td>
&lt;td>0.023460&lt;/td>
&lt;td>0.030669&lt;/td>
&lt;td>0.011530&lt;/td>
&lt;td>0.405333&lt;/td>
&lt;td>0.020589&lt;/td>
&lt;td>1.000000&lt;/td>
&lt;td>0.012620&lt;/td>
&lt;td>0.114134&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>VolcanicIslands&lt;/th>
&lt;td>0.038556&lt;/td>
&lt;td>0.057514&lt;/td>
&lt;td>0.007882&lt;/td>
&lt;td>0.002611&lt;/td>
&lt;td>0.002178&lt;/td>
&lt;td>0.005561&lt;/td>
&lt;td>0.059407&lt;/td>
&lt;td>0.017590&lt;/td>
&lt;td>0.373249&lt;/td>
&lt;td>0.008544&lt;/td>
&lt;td>0.026374&lt;/td>
&lt;td>0.011806&lt;/td>
&lt;td>0.010754&lt;/td>
&lt;td>0.017952&lt;/td>
&lt;td>0.002832&lt;/td>
&lt;td>0.036014&lt;/td>
&lt;td>0.003819&lt;/td>
&lt;td>0.012620&lt;/td>
&lt;td>1.000000&lt;/td>
&lt;td>0.138323&lt;/td>
&lt;/tr>
&lt;tr>
&lt;th>VoyageBeagle&lt;/th>
&lt;td>0.183507&lt;/td>
&lt;td>0.267749&lt;/td>
&lt;td>0.123917&lt;/td>
&lt;td>0.013124&lt;/td>
&lt;td>0.017140&lt;/td>
&lt;td>0.098961&lt;/td>
&lt;td>0.097908&lt;/td>
&lt;td>0.089132&lt;/td>
&lt;td>0.260141&lt;/td>
&lt;td>0.014776&lt;/td>
&lt;td>0.171708&lt;/td>
&lt;td>0.089947&lt;/td>
&lt;td>0.014342&lt;/td>
&lt;td>0.025047&lt;/td>
&lt;td>0.012282&lt;/td>
&lt;td>0.164661&lt;/td>
&lt;td>0.024149&lt;/td>
&lt;td>0.114134&lt;/td>
&lt;td>0.138323&lt;/td>
&lt;td>1.000000&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;h2 id="11-the-book-most-similar-to-on-the-origin-of-species">11. The book most similar to &amp;ldquo;On the Origin of Species&amp;rdquo;&lt;/h2>
&lt;p>We now have a matrix containing all the similarity measures between any pair of books from Charles Darwin! We can now use this matrix to quickly extract the information we need, i.e., the distance between one book and one or several others. &lt;/p>
&lt;p>As a first step, we will display which books are the most similar to "&lt;em>On the Origin of Species&lt;/em>," more specifically we will produce a bar chart showing all books ranked by how similar they are to Darwin's landmark work.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># This is needed to display plots in a notebook&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">%&lt;/span>&lt;span class="n">matplotlib&lt;/span> &lt;span class="n">inline&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Import libraries&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">matplotlib.pyplot&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">plt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Select the column corresponding to &amp;#34;On the Origin of Species&amp;#34; and &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">v&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">sim_df&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">iloc&lt;/span>&lt;span class="p">[:,&lt;/span>&lt;span class="n">ori&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Sort by ascending scores&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">v_sorted&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">v&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sort_values&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">v_sorted&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Plot this data has a horizontal bar plot&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">v_sorted&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">plot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">kind&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;barh&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Modify the axes labels and plot title for a better readability&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">plt&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">xlabel&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Score&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">plt&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ylabel&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Book&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">plt&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Similarity with book &lt;/span>&lt;span class="se">\&amp;#39;&lt;/span>&lt;span class="s2">On the Origin of Species&lt;/span>&lt;span class="se">\&amp;#39;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;pre>&lt;code>&amp;lt;matplotlib.text.Text at 0x7f65c9dbdfd0&amp;gt;
&lt;/code>&lt;/pre>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="https://user-images.githubusercontent.com/20341930/208644817-ccb3e48a-6673-4f5e-86fa-7e4a35f20a5f.png" alt="png" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;h2 id="12-which-books-have-similar-content">12. Which books have similar content?&lt;/h2>
&lt;p>This turns out to be extremely useful if we want to determine a given book's most similar work. For example, we have just seen that if you enjoyed "&lt;em>On the Origin of Species&lt;/em>," you can read books discussing similar concepts such as "&lt;em>The Variation of Animals and Plants under Domestication&lt;/em>" or "&lt;em>The Descent of Man, and Selection in Relation to Sex&lt;/em>." If you are familiar with Darwin's work, these suggestions will likely seem natural to you. Indeed, &lt;em>On the Origin of Species&lt;/em> has a whole chapter about domestication and &lt;em>The Descent of Man, and Selection in Relation to Sex&lt;/em> applies the theory of natural selection to human evolution. Hence, the results make sense.&lt;/p>
&lt;p>However, we now want to have a better understanding of the big picture and see how Darwin's books are generally related to each other (in terms of topics discussed). To this purpose, we will represent the whole similarity matrix as a dendrogram, which is a standard tool to display such data. &lt;strong>This last approach will display all the information about book similarities at once.&lt;/strong> For example, we can find a book's closest relative but, also, we can visualize which groups of books have similar topics (e.g., the cluster about Charles Darwin personal life with his autobiography and letters). If you are familiar with Darwin's bibliography, the results should not surprise you too much, which indicates the method gives good results. Otherwise, next time you read one of the author's book, you will know which other books to read next in order to learn more about the topics it addressed.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Import libraries&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">scipy.cluster&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">hierarchy&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Compute the clusters from the similarity matrix,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># using the Ward variance minimization algorithm&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Z&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">hierarchy&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">linkage&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sim_df&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">values&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">method&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;ward&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Display this result as a horizontal dendrogram&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">plot&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">hierarchy&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dendrogram&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Z&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">leaf_font_size&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">labels&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">sim_df&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">index&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">orientation&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;left&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="https://user-images.githubusercontent.com/20341930/208644829-9f814d50-43ac-4f76-91d2-bb7a80e9ba85.png" alt="png" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>Dataset is taken from &lt;a href="https://www.datacamp.com/" target="_blank" rel="noopener">DataCamp&lt;/a>&lt;/p></description></item></channel></rss>