{"id":756,"date":"2015-02-16T00:08:02","date_gmt":"2015-02-16T07:08:02","guid":{"rendered":"http:\/\/homepages.uc.edu\/~yaozo\/wordpress\/?p=756"},"modified":"2015-02-16T00:08:02","modified_gmt":"2015-02-16T07:08:02","slug":"text-mining-the-complete-works-of-william-shakespeare-2","status":"publish","type":"post","link":"https:\/\/zhuoyao.net\/index.php\/2015\/02\/16\/text-mining-the-complete-works-of-william-shakespeare-2\/","title":{"rendered":"Text Mining the Complete Works of William Shakespeare"},"content":{"rendered":"<p>I am starting a new project that will require some serious text mining. So, in the interests of bringing myself up to speed on the tm package, I thought I would apply it to the Complete Works of William Shakespeare and just see what falls out.<\/p>\n<p>The first order of business was getting my hands on all that text. Fortunately it is available from a number of sources. I chose to use <a href=\"http:\/\/www.gutenberg.org\/\" target=\"_blank\" rel=\"noopener\">Project Gutenberg<\/a>.<\/p>\n<div>\n<div id=\"highlighter_554816\" class=\"syntaxhighlighter nogutter  r\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r plain\">&gt; TEXTFILE = <\/code><code class=\"r string\">\"data\/pg100.txt\"<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">if <\/code><code class=\"r plain\">(!<\/code><code class=\"r functions\">file.exists<\/code><code class=\"r plain\">(TEXTFILE)) {<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"r plain\">+\u00a0\u00a0\u00a0\u00a0 <\/code><code class=\"r functions\">download.file<\/code><code class=\"r plain\">(<\/code><code class=\"r string\">\"<a href=\"http:\/\/www.gutenberg.org\/cache\/epub\/100\/pg100.txt\">http:\/\/www.gutenberg.org\/cache\/epub\/100\/pg100.txt<\/a>\"<\/code><code class=\"r plain\">, destfile = TEXTFILE)<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"r plain\">+ }<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"r plain\">&gt; shakespeare = <\/code><code class=\"r functions\">readLines<\/code><code class=\"r plain\">(TEXTFILE)<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">length<\/code><code class=\"r plain\">(shakespeare)<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"r plain\">[1] 124787<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>That\u2019s quite a solid chunk of data: 124787 lines. Let\u2019s take a closer look.<\/p>\n<div>\n<div id=\"highlighter_93752\" class=\"syntaxhighlighter nogutter  r\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">head<\/code><code class=\"r plain\">(shakespeare)<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"r plain\">[1] <\/code><code class=\"r string\">\"The Project Gutenberg EBook of The Complete Works of William Shakespeare, by\"<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"r plain\">[2] <\/code><code class=\"r string\">\"William Shakespeare\"<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"r plain\">[3] <\/code><code class=\"r string\">\"\"<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"r plain\">[4] <\/code><code class=\"r string\">\"This eBook is for the use of anyone anywhere at no cost and with\"<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"r plain\">[5] <\/code><code class=\"r string\">\"almost no restrictions whatsoever.\u00a0 You may copy it, give it away or\"<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"r plain\">[6] <\/code><code class=\"r string\">\"re-use it under the terms of the Project Gutenberg License included\"<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">tail<\/code><code class=\"r plain\">(shakespeare)<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"r plain\">[1] <\/code><code class=\"r string\">\"<a href=\"http:\/\/www.gutenberg.org\/2\/4\/6\/8\/24689\">http:\/\/www.gutenberg.org\/2\/4\/6\/8\/24689<\/a>\"<\/code>\u00a0\u00a0\u00a0 <code class=\"r string\">\"\"<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"r plain\">[3] <\/code><code class=\"r string\">\"An alternative method of locating eBooks:\"<\/code> <code class=\"r string\">\"<a href=\"http:\/\/www.gutenberg.org\/GUTINDEX.ALL\">http:\/\/www.gutenberg.org\/GUTINDEX.ALL<\/a>\"<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"r plain\">[5] <\/code><code class=\"r string\">\"\"<\/code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <code class=\"r string\">\"*** END: FULL LICENSE ***\"<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>There seems to be some header and footer text. We will want to get rid of that! Using a text editor I checked to see how many lines were occupied with metadata and then removed them before concatenating all of the lines into a single long, long, long string.<\/p>\n<div>\n<div id=\"highlighter_248457\" class=\"syntaxhighlighter nogutter  r\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r plain\">&gt; shakespeare = shakespeare[-(1:173)]<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"r plain\">&gt; shakespeare = shakespeare[-(124195:<\/code><code class=\"r functions\">length<\/code><code class=\"r plain\">(shakespeare))]<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"r plain\">&gt;<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"r plain\">&gt; shakespeare = <\/code><code class=\"r functions\">paste<\/code><code class=\"r plain\">(shakespeare, collapse = <\/code><code class=\"r string\">\" \"<\/code><code class=\"r plain\">)<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">nchar<\/code><code class=\"r plain\">(shakespeare)<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"r plain\">[1] 5436541<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>While I had the text open in the editor I noticed that sections in the document were separated by the following text:<\/p>\n<div>\n<div id=\"highlighter_836115\" class=\"syntaxhighlighter nogutter  plain\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"plain plain\">&lt;&lt;THIS ELECTRONIC VERSION OF THE COMPLETE WORKS OF WILLIAM<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"plain plain\">SHAKESPEARE IS COPYRIGHT 1990-1993 BY WORLD LIBRARY, INC., AND IS<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"plain plain\">PROVIDED BY PROJECT GUTENBERG ETEXT OF ILLINOIS BENEDICTINE COLLEGE<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"plain plain\">WITH PERMISSION.\u00a0 ELECTRONIC AND MACHINE READABLE COPIES MAY BE<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"plain plain\">DISTRIBUTED SO LONG AS SUCH COPIES (1) ARE FOR YOUR OR OTHERS<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"plain plain\">PERSONAL USE ONLY, AND (2) ARE NOT DISTRIBUTED OR USED<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"plain plain\">COMMERCIALLY.\u00a0 PROHIBITED COMMERCIAL DISTRIBUTION INCLUDES BY ANY<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"plain plain\">SERVICE THAT CHARGES FOR DOWNLOAD TIME OR FOR MEMBERSHIP.&gt;&gt;<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Obviously that is going to taint the analysis. But it also serves as a convenient marker to divide that long, long, long string into separate documents.<\/p>\n<div>\n<div id=\"highlighter_222268\" class=\"syntaxhighlighter nogutter  r\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r plain\">&gt; shakespeare = <\/code><code class=\"r functions\">strsplit<\/code><code class=\"r plain\">(shakespeare, <\/code><code class=\"r string\">\"&lt;&lt;[^&gt;]*&gt;&gt;\"<\/code><code class=\"r plain\">)[[1]]<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">length<\/code><code class=\"r plain\">(shakespeare)<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"r plain\">[1] 218<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>This left me with a list of 218 documents. On further inspection, some of them appeared to be a little on the short side (in my limited experience, the bard is not known for brevity). As it turns out, the short documents were the <a href=\"http:\/\/en.wikipedia.org\/wiki\/Dramatis_person%C3%A6\" target=\"_blank\" rel=\"noopener\">dramatis personae<\/a> for his plays. I removed them as well.<\/p>\n<div>\n<div id=\"highlighter_581375\" class=\"syntaxhighlighter nogutter  r\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r plain\">&gt; (dramatis.personae &lt;- <\/code><code class=\"r functions\">grep<\/code><code class=\"r plain\">(<\/code><code class=\"r string\">\"Dramatis Personae\"<\/code><code class=\"r plain\">, shakespeare, ignore.case = <\/code><code class=\"r keyword\">TRUE<\/code><code class=\"r plain\">))<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"r spaces\">\u00a0<\/code><code class=\"r plain\">[1]\u00a0\u00a0 2\u00a0\u00a0 8\u00a0 11\u00a0 17\u00a0 23\u00a0 28\u00a0 33\u00a0 43\u00a0 49\u00a0 55\u00a0 62\u00a0 68\u00a0 74\u00a0 81\u00a0 87\u00a0 93\u00a0 99 105 111 117 122 126 134 140 146 152 158<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"r plain\">[28] 164 170 176 182 188 194 200 206 212<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">length<\/code><code class=\"r plain\">(shakespeare)<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"r plain\">[1] 218<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"r plain\">&gt; shakespeare = shakespeare[-dramatis.personae]<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">length<\/code><code class=\"r plain\">(shakespeare)<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"r plain\">[1] 182<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Down to 182 documents, each of which is a complete work.<\/p>\n<p>The next task was to convert these documents into a <a href=\"http:\/\/en.wikipedia.org\/wiki\/Text_corpus\" target=\"_blank\" rel=\"noopener\">corpus<\/a>.<\/p>\n<div>\n<div id=\"highlighter_250758\" class=\"syntaxhighlighter nogutter  r\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">library<\/code><code class=\"r plain\">(tm)<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"r plain\">&gt; <\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"r plain\">&gt; doc.vec &lt;- <\/code><code class=\"r functions\">VectorSource<\/code><code class=\"r plain\">(shakespeare)<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"r plain\">&gt; doc.corpus &lt;- <\/code><code class=\"r functions\">Corpus<\/code><code class=\"r plain\">(doc.vec)<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">summary<\/code><code class=\"r plain\">(doc.corpus)<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"r plain\">A corpus with 182 text documents<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"r plain\">The metadata consists of 2 tag-value pairs and a data frame<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"r plain\">Available tags are:<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">create_date creator <\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"r plain\">Available variables <\/code><code class=\"r keyword\">in<\/code> <code class=\"r plain\">the data frame are:<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">MetaID<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>There is a lot of information in those documents which is not particularly useful for text mining. So before proceeding any further, we will clean things up a bit. First we convert all of the text to lowercase and then remove punctuation, numbers and common English stopwords. Possibly the list of English stop words is not entirely appropriate for Shakespearean English, but it is a reasonable starting point.<\/p>\n<div>\n<div id=\"highlighter_74472\" class=\"syntaxhighlighter nogutter  r\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r plain\">&gt; doc.corpus &lt;- <\/code><code class=\"r functions\">tm_map<\/code><code class=\"r plain\">(doc.corpus, tolower)<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"r plain\">&gt; doc.corpus &lt;- <\/code><code class=\"r functions\">tm_map<\/code><code class=\"r plain\">(doc.corpus, removePunctuation)<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"r plain\">&gt; doc.corpus &lt;- <\/code><code class=\"r functions\">tm_map<\/code><code class=\"r plain\">(doc.corpus, removeNumbers)<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"r plain\">&gt; doc.corpus &lt;- <\/code><code class=\"r functions\">tm_map<\/code><code class=\"r plain\">(doc.corpus, removeWords, <\/code><code class=\"r functions\">stopwords<\/code><code class=\"r plain\">(<\/code><code class=\"r string\">\"english\"<\/code><code class=\"r plain\">))<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Next we perform <a href=\"http:\/\/en.wikipedia.org\/wiki\/Word_stem\" target=\"_blank\" rel=\"noopener\">stemming<\/a>, which removes affixes from words (so, for example, \u201crun\u201d, \u201cruns\u201d and \u201crunning\u201d all become \u201crun\u201d).<\/p>\n<div>\n<div id=\"highlighter_730324\" class=\"syntaxhighlighter nogutter  r\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">library<\/code><code class=\"r plain\">(SnowballC)<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"r plain\">&gt;<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"r plain\">&gt; doc.corpus &lt;- <\/code><code class=\"r functions\">tm_map<\/code><code class=\"r plain\">(doc.corpus, stemDocument)<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>All of these transformations have resulted in a lot of whitespace, which is then removed.<\/p>\n<div>\n<div id=\"highlighter_87988\" class=\"syntaxhighlighter nogutter  r\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r plain\">&gt; doc.corpus &lt;- <\/code><code class=\"r functions\">tm_map<\/code><code class=\"r plain\">(doc.corpus, stripWhitespace)<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>If we have a look at what\u2019s left, we find that it\u2019s just the lowercase, stripped down version of the text (which I have truncated here).<\/p>\n<div>\n<div id=\"highlighter_901963\" class=\"syntaxhighlighter nogutter  r\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">inspect<\/code><code class=\"r plain\">(doc.corpus[8])<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"r plain\">A corpus with 1 text document<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"r plain\">The metadata consists of 2 tag-value pairs and a data frame<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"r plain\">Available tags are:<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">create_date creator <\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"r plain\">Available variables <\/code><code class=\"r keyword\">in<\/code> <code class=\"r plain\">the data frame are:<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">MetaID <\/code><\/div>\n<div class=\"line number9 index8 alt2\"><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"r plain\">[[1]]<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"r spaces\">\u00a0<\/code><code class=\"r plain\">act ii scene messina pompey hous enter pompey menecr mena warlik manner pompey great god just shall<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"r spaces\">\u00a0<\/code><code class=\"r plain\">assist deed justest men menecr know worthi pompey delay deni pompey <\/code><code class=\"r keyword\">while<\/code> <code class=\"r plain\">suitor throne decay thing<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"r spaces\">\u00a0<\/code><code class=\"r plain\">sue menecr ignor beg often harm wise powr deni us good find profit lose prayer pompey shall well<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"r spaces\">\u00a0<\/code><code class=\"r plain\">peopl love sea mine power crescent augur hope say will come th full mark antoni egypt sit dinner<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"r spaces\">\u00a0<\/code><code class=\"r plain\">will make war without door caesar get money lose heart lepidus flatter flatterd neither love either<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>This is where things start to get interesting. Next we create a <a href=\"http:\/\/en.wikipedia.org\/wiki\/Document-term_matrix\" target=\"_blank\" rel=\"noopener\">Term Document Matrix<\/a> (TDM) which reflects the number of times each word in the corpus is found in each of the documents.<\/p>\n<div>\n<div id=\"highlighter_581269\" class=\"syntaxhighlighter nogutter  r\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r plain\">&gt; TDM &lt;- <\/code><code class=\"r functions\">TermDocumentMatrix<\/code><code class=\"r plain\">(doc.corpus)<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"r plain\">&gt; TDM<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"r plain\">A term-document <\/code><code class=\"r functions\">matrix <\/code><code class=\"r plain\">(18651 terms, 182 documents)<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"r plain\">Non-\/sparse entries: 182898\/3211584<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"r plain\">Sparsity\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : 95%<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"r plain\">Maximal term length: 31 <\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"r plain\">Weighting\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : term <\/code><code class=\"r functions\">frequency <\/code><code class=\"r plain\">(tf)<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">inspect<\/code><code class=\"r plain\">(TDM[1:10,1:10])<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"r plain\">A term-document <\/code><code class=\"r functions\">matrix <\/code><code class=\"r plain\">(10 terms, 10 documents)<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"r plain\">Non-\/sparse entries: 1\/99<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"r plain\">Sparsity\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : 99%<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"r plain\">Maximal term length: 9 <\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"r plain\">Weighting\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : term <\/code><code class=\"r functions\">frequency <\/code><code class=\"r plain\">(tf)<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"r spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"r plain\">Docs<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"r plain\">Terms\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1 2 3 4 5 6 7 8 9 10<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">aaron\u00a0\u00a0\u00a0\u00a0 0 0 0 0 0 0 0 0 0\u00a0 0<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">abaissiez 0 0 0 0 0 0 0 0 0\u00a0 0<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">abandon\u00a0\u00a0 0 0 0 0 0 0 0 0 0\u00a0 0<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">abandond\u00a0 0 1 0 0 0 0 0 0 0\u00a0 0<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">abas\u00a0\u00a0\u00a0\u00a0\u00a0 0 0 0 0 0 0 0 0 0\u00a0 0<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">abashd\u00a0\u00a0\u00a0 0 0 0 0 0 0 0 0 0\u00a0 0<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">abat\u00a0\u00a0\u00a0\u00a0\u00a0 0 0 0 0 0 0 0 0 0\u00a0 0<\/code><\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">abatfowl\u00a0 0 0 0 0 0 0 0 0 0\u00a0 0<\/code><\/div>\n<div class=\"line number27 index26 alt2\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">abbess\u00a0\u00a0\u00a0 0 0 0 0 0 0 0 0 0\u00a0 0<\/code><\/div>\n<div class=\"line number28 index27 alt1\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">abbey\u00a0\u00a0\u00a0\u00a0 0 0 0 0 0 0 0 0 0\u00a0 0<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The extract from the TDM shows, for example, that the word \u201cabandond\u201d occurred once in document number 2 but was not present in any of the other first ten documents. We could have generated the transpose of the DTM as well.<\/p>\n<div>\n<div id=\"highlighter_767332\" class=\"syntaxhighlighter nogutter  r\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r plain\">&gt; DTM &lt;- <\/code><code class=\"r functions\">DocumentTermMatrix<\/code><code class=\"r plain\">(doc.corpus)<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">inspect<\/code><code class=\"r plain\">(DTM[1:10,1:10])<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"r plain\">A document-term <\/code><code class=\"r functions\">matrix <\/code><code class=\"r plain\">(10 documents, 10 terms)<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"r plain\">Non-\/sparse entries: 1\/99<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"r plain\">Sparsity\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : 99%<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"r plain\">Maximal term length: 9 <\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"r plain\">Weighting\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : term <\/code><code class=\"r functions\">frequency <\/code><code class=\"r plain\">(tf)<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"r spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"r plain\">Terms<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"r plain\">Docs aaron abaissiez abandon abandond abas abashd abat abatfowl abbess abbey<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">1\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0 0<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">2\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0 0<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">3\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0 0<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">4\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0 0<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">5\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0 0<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">6\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0 0<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">7\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0 0<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">8\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0 0<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">9\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0 0<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">10\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0 0<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Which of these proves to be most convenient will depend on the relative number of documents and terms in your data.<\/p>\n<p>Now we can start asking questions like: what are the most frequently occurring terms?<\/p>\n<div>\n<div id=\"highlighter_377137\" class=\"syntaxhighlighter nogutter  r\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">findFreqTerms<\/code><code class=\"r plain\">(TDM, 2000)<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"r spaces\">\u00a0<\/code><code class=\"r plain\">[1] <\/code><code class=\"r string\">\"come\"<\/code>\u00a0 <code class=\"r string\">\"enter\"<\/code> <code class=\"r string\">\"good\"<\/code>\u00a0 <code class=\"r string\">\"king\"<\/code>\u00a0 <code class=\"r string\">\"let\"<\/code>\u00a0\u00a0 <code class=\"r string\">\"lord\"<\/code>\u00a0 <code class=\"r string\">\"love\"<\/code>\u00a0 <code class=\"r string\">\"make\"<\/code>\u00a0 <code class=\"r string\">\"man\"<\/code>\u00a0\u00a0 <code class=\"r string\">\"now\"<\/code>\u00a0\u00a0 <code class=\"r string\">\"shall\"<\/code> <code class=\"r string\">\"sir\"<\/code>\u00a0\u00a0 <code class=\"r string\">\"thee\"<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"r plain\">[14] <\/code><code class=\"r string\">\"thi\"<\/code>\u00a0\u00a0 <code class=\"r string\">\"thou\"<\/code>\u00a0 <code class=\"r string\">\"well\"<\/code>\u00a0 <code class=\"r string\">\"will\"<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Each of these words occurred more that 2000 times.<\/p>\n<p>What about associations between words? Let\u2019s have a look at what other words had a high association with \u201clove\u201d.<\/p>\n<div>\n<div id=\"highlighter_624298\" class=\"syntaxhighlighter nogutter  r\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">findAssocs<\/code><code class=\"r plain\">(TDM, <\/code><code class=\"r string\">\"love\"<\/code><code class=\"r plain\">, 0.8)<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"r plain\">beauti\u00a0\u00a0\u00a0 eye<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">0.83\u00a0\u00a0 0.80<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Well that\u2019s not too surprising!<\/p>\n<p>From our first look at the TDM we know that there are many terms which do not occur very often. It might make sense to simply remove these sparse terms from the analysis.<\/p>\n<div>\n<div id=\"highlighter_625431\" class=\"syntaxhighlighter nogutter  r\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r plain\">&gt; TDM.common = <\/code><code class=\"r functions\">removeSparseTerms<\/code><code class=\"r plain\">(TDM, 0.1)<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">dim<\/code><code class=\"r plain\">(TDM)<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"r plain\">[1] 18651\u00a0\u00a0 182<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">dim<\/code><code class=\"r plain\">(TDM.common)<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"r plain\">[1]\u00a0 71 182<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>From the 18651 terms that we started with, we are now left with a TDM which considers on 71 commonly occurring terms.<\/p>\n<div>\n<div id=\"highlighter_606134\" class=\"syntaxhighlighter nogutter  r\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">inspect<\/code><code class=\"r plain\">(TDM.common[1:10,1:10])<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"r plain\">A term-document <\/code><code class=\"r functions\">matrix <\/code><code class=\"r plain\">(10 terms, 10 documents)<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"r plain\">Non-\/sparse entries: 94\/6<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"r plain\">Sparsity\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : 6%<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"r plain\">Maximal term length: 6<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"r plain\">Weighting\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : term <\/code><code class=\"r functions\">frequency <\/code><code class=\"r plain\">(tf)<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"r spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"r plain\">Docs<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"r plain\">Terms\u00a0\u00a0\u00a0\u00a0 1 2\u00a0 3\u00a0 4\u00a0 5\u00a0 6\u00a0 7\u00a0 8 9 10<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">act\u00a0\u00a0\u00a0\u00a0 1 4\u00a0 7\u00a0 9\u00a0 6\u00a0 3\u00a0 2 14 1\u00a0 0<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">art\u00a0\u00a0\u00a0 53 0\u00a0 9\u00a0 3\u00a0 5\u00a0 3\u00a0 2 17 0\u00a0 6<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">away\u00a0\u00a0 18 5\u00a0 8\u00a0 4\u00a0 2 10\u00a0 5 13 1\u00a0 7<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">call\u00a0\u00a0 17 1\u00a0 4\u00a0 2\u00a0 2\u00a0 1\u00a0 6 17 3\u00a0 7<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">can\u00a0\u00a0\u00a0 44 8 12\u00a0 5 10\u00a0 6 10 24 1\u00a0 5<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">come\u00a0\u00a0 19 9 16 17 12 15 14 89 9 15<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">day\u00a0\u00a0\u00a0 43 2\u00a0 2\u00a0 4\u00a0 1\u00a0 5\u00a0 3 17 2\u00a0 3<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">enter\u00a0\u00a0 0 7 12 11 10 10 14 87 4\u00a0 6<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">exeunt\u00a0 0 3\u00a0 8\u00a0 8\u00a0 5\u00a0 4\u00a0 7 49 1\u00a0 4<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">exit\u00a0\u00a0\u00a0 0 6\u00a0 8\u00a0 5\u00a0 6\u00a0 5\u00a0 3 31 3\u00a0 2<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Finally we are going to put together a visualisation. The TDM is stored as a<a href=\"http:\/\/en.wikipedia.org\/wiki\/Sparse_matrix\" target=\"_blank\" rel=\"noopener\">sparse matrix<\/a>. This was an apt representation for the initial TDM, but the reduced TDM containing only frequently occurring words is probably better stored as a normal matrix. We\u2019ll make the conversion and see.<\/p>\n<div>\n<div id=\"highlighter_894279\" class=\"syntaxhighlighter nogutter  r\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">library<\/code><code class=\"r plain\">(slam)<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"r plain\">&gt;<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"r plain\">&gt; TDM.dense &lt;- <\/code><code class=\"r functions\">as.matrix<\/code><code class=\"r plain\">(TDM.common)<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"r plain\">&gt;<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"r plain\">&gt; TDM.dense<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">object.size<\/code><code class=\"r plain\">(TDM.common)<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"r plain\">207872 bytes<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">object.size<\/code><code class=\"r plain\">(TDM.dense)<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"r plain\">112888 bytes<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>So, as it turns out the sparse representation was actually wasting space! (This will generally not be true though: it will only apply for a matrix consisting of just the common terms). Anyway, we need the data as a normal matrix in order to produce the visualisation. The next step is to convert it into a tidy format.<\/p>\n<div>\n<div id=\"highlighter_198524\" class=\"syntaxhighlighter nogutter  r\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">library<\/code><code class=\"r plain\">(reshape2)<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"r plain\">&gt;<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"r plain\">&gt; TDM.dense = <\/code><code class=\"r functions\">melt<\/code><code class=\"r plain\">(TDM.dense, value.name = <\/code><code class=\"r string\">\"count\"<\/code><code class=\"r plain\">)<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">head<\/code><code class=\"r plain\">(TDM.dense)<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"r spaces\">\u00a0\u00a0<\/code><code class=\"r plain\">Terms Docs count<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"r plain\">1\u00a0\u00a0 act\u00a0\u00a0\u00a0 1\u00a0\u00a0\u00a0\u00a0 1<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"r plain\">2\u00a0\u00a0 art\u00a0\u00a0\u00a0 1\u00a0\u00a0\u00a0 53<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"r plain\">3\u00a0 away\u00a0\u00a0\u00a0 1\u00a0\u00a0\u00a0 18<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"r plain\">4\u00a0 call\u00a0\u00a0\u00a0 1\u00a0\u00a0\u00a0 17<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"r plain\">5\u00a0\u00a0 can\u00a0\u00a0\u00a0 1\u00a0\u00a0\u00a0 44<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"r plain\">6\u00a0 come\u00a0\u00a0\u00a0 1\u00a0\u00a0\u00a0 19<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>And finally generate the visualisation.<\/p>\n<div>\n<div id=\"highlighter_747666\" class=\"syntaxhighlighter nogutter  r\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">library<\/code><code class=\"r plain\">(ggplot2)<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"r plain\">&gt;<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"r plain\">&gt; <\/code><code class=\"r functions\">ggplot<\/code><code class=\"r plain\">(TDM.dense, <\/code><code class=\"r functions\">aes<\/code><code class=\"r plain\">(x = Docs, y = Terms, fill = <\/code><code class=\"r functions\">log10<\/code><code class=\"r plain\">(count))) +<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"r plain\">+\u00a0\u00a0\u00a0\u00a0 <\/code><code class=\"r functions\">geom_tile<\/code><code class=\"r plain\">(colour = <\/code><code class=\"r string\">\"white\"<\/code><code class=\"r plain\">) +<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"r plain\">+\u00a0\u00a0\u00a0\u00a0 <\/code><code class=\"r functions\">scale_fill_gradient<\/code><code class=\"r plain\">(high=<\/code><code class=\"r string\">\"#FF0000\"<\/code> <code class=\"r plain\">, low=<\/code><code class=\"r string\">\"#FFFFFF\"<\/code><code class=\"r plain\">)+<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"r plain\">+\u00a0\u00a0\u00a0\u00a0 <\/code><code class=\"r functions\">ylab<\/code><code class=\"r plain\">(<\/code><code class=\"r string\">\"\"<\/code><code class=\"r plain\">) +<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"r plain\">+\u00a0\u00a0\u00a0\u00a0 <\/code><code class=\"r functions\">theme<\/code><code class=\"r plain\">(panel.background = <\/code><code class=\"r functions\">element_blank<\/code><code class=\"r plain\">()) +<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"r plain\">+\u00a0\u00a0\u00a0\u00a0 <\/code><code class=\"r functions\">theme<\/code><code class=\"r plain\">(axis.text.x = <\/code><code class=\"r functions\">element_blank<\/code><code class=\"r plain\">(), axis.ticks.x = <\/code><code class=\"r functions\">element_blank<\/code><code class=\"r plain\">())<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><a href=\"http:\/\/i0.wp.com\/www.exegetic.biz\/blog\/wp-content\/uploads\/2013\/09\/shakespeare-common-tdm.png\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-441\" src=\"http:\/\/i0.wp.com\/www.exegetic.biz\/blog\/wp-content\/uploads\/2013\/09\/shakespeare-common-tdm.png?resize=456%2C570\" alt=\"shakespeare-common-tdm\" width=\"456\" height=\"570\" \/><\/a><\/p>\n<p>The colour scale indicates the number of times that each of the terms cropped up in each of the documents. I applied a logarithmic transform to the counts since there was a very large disparity in the numbers across terms and documents. The grey tiles correspond to terms which are not found in the corresponding document.<\/p>\n<p>One can see that some terms, like \u201cwill\u201d turn up frequently in most documents, while \u201clove\u201d is common in some and rare or absent in others.<\/p>\n<p>That was interesting. Not sure that I would like to make any conclusions on the basis of the results above (Shakespeare is well outside my field of expertise!), but I now have a pretty good handle on how the tm package works. As always, feedback will be appreciated!<\/p>\n<h1>References<\/h1>\n<ul>\n<li><a href=\"http:\/\/anythingbutrbitrary.blogspot.com\/2013\/03\/build-search-engine-in-20-minutes-or.html\" target=\"_blank\" rel=\"noopener\">Build a search engine in 20 minutes or less<\/a><\/li>\n<li>Feinerer, I. (2013). Introduction to the tm Package: Text Mining in R.<\/li>\n<li>Feinerer, I., Hornik, K., &amp; Meyer, D. (2008). Text Mining Infrastructure in R. Journal of Statistical Software, 25(5).<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>I am starting a new project that will require some serious text mining. So, in the interests of bringing myself up to speed on the&hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20],"tags":[],"class_list":["post-756","post","type-post","status-publish","format-standard","hentry","category-r"],"_links":{"self":[{"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/posts\/756","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/comments?post=756"}],"version-history":[{"count":0,"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/posts\/756\/revisions"}],"wp:attachment":[{"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/media?parent=756"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/categories?post=756"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/tags?post=756"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}