<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0">
 <channel>
  <title>SHRIPHANI PALAKODETY: Posts tagged 'html'</title>
  <description>SHRIPHANI PALAKODETY: Posts tagged 'html'</description>
  <link>http://blog.shriphani.com/tags/html.html</link>
  <lastBuildDate>Tue, 24 Jun 2014 14:32:27 UT</lastBuildDate>
  <pubDate>Tue, 24 Jun 2014 14:32:27 UT</pubDate>
  <ttl>1800</ttl>
  <item>
   <title>Subotai: Data Mining for HTML Documents</title>
   <link>http://blog.shriphani.com/2014/06/24/subotai-data-mining-for-html-documents/?utm_source=html&amp;utm_medium=RSS</link>
   <guid>urn:http-blog-shriphani-com:-2014-06-24-subotai-data-mining-for-html-documents</guid>
   <pubDate>Tue, 24 Jun 2014 14:32:27 UT</pubDate>
   <description>&lt;html&gt;
&lt;p&gt;I spent the last few months studying and implementing some routines that take a raw HTML document (or documents) and do stuff with it (them). &lt;a href="https://github.com/shriphani/subotai"&gt;Subotai&lt;/a&gt; is a library that consolidates some of these routines. In this blog post I will describe what is currently implemented and what the roadmap is.&lt;/p&gt;
&lt;!-- more--&gt;

&lt;h2 id="structural-similarity"&gt;Structural Similarity&lt;/h2&gt;

&lt;p&gt;Dynamic web-pages are built by populating templates and thus two pages that look the same, possibly share the same underlying template. Structural similarity measures the similarity of the underlying templates. Subotai contains an implementation of the Restricted Top-Down Mapping algorithm (which I shall call RTDM) - a dynamic programming algorithm which measures the Tree-Edit-Distance (rather like its cousin that works on strings). You can use the subotai implementation like so:&lt;/p&gt;

&lt;p&gt;For the following two documents (which clearly look the same and as we can guess use the same underlying HTML template):&lt;/p&gt;

&lt;table&gt;
 &lt;tr&gt;
  &lt;td&gt;&lt;img src="/img/blog_page_1.png" style="display:inline" /&gt;&lt;/td&gt; 	 
  &lt;td&gt;&lt;img src="/img/blog_page_2.png" style="display:inline" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;you can do this with Subotai:&lt;/p&gt;

&lt;div class="brush: clojure"&gt;
 &lt;table class="sourcetable"&gt;
  &lt;tbody&gt;
   &lt;tr&gt;
    &lt;td class="linenos"&gt;
     &lt;div class="linenodiv"&gt;
      &lt;pre&gt;1
2
3
4
5
6
7
8
9&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
    &lt;td class="code"&gt;
     &lt;div class="source"&gt;
      &lt;pre&gt;&lt;span class="nv"&gt;user=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;clj-http.client&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;user=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;subotai.structural-similarity.core&lt;/span&gt; &lt;span class="ss"&gt;:reload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;user=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;bod1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:body&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;get &lt;/span&gt;&lt;span class="s"&gt;"http://blog.shriphani.com/"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="c1"&gt;; this is page 1&lt;/span&gt;
&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;user/bod1&lt;/span&gt;
&lt;span class="nv"&gt;user=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;bod2&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:body&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;get &lt;/span&gt;&lt;span class="s"&gt;"http://blog.shriphani.com/index-2.html"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="c1"&gt;; this is page 2&lt;/span&gt;
&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;user/bod2&lt;/span&gt;
&lt;span class="nv"&gt;user=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;similar?&lt;/span&gt; &lt;span class="nv"&gt;bod1&lt;/span&gt; &lt;span class="nv"&gt;bod2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;true&lt;/span&gt; &lt;span class="c1"&gt;; both pages have the same structure&lt;/span&gt;
&lt;span class="nv"&gt;user=&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;h2 id="near-duplicate-detection"&gt;Near-Duplicate Detection&lt;/h2&gt;

&lt;p&gt;One can often find pages on the web that are near duplicates of each other - for instance a page on a site mirror vs the actual destination. I have an example here of two web-pages that are not identical but near-identical: &lt;a href="http://www.kidneyspace.com/index.php/topic,5286.msg30719.html"&gt;the first&lt;/a&gt; and &lt;a href="http://www.kidneyspace.com/index.php/topic,5286"&gt;the second&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The two documents differ in the templating slightly and have dates and other meta content that is slightly different. You can test it using:&lt;/p&gt;

&lt;div class="brush: clojure"&gt;
 &lt;table class="sourcetable"&gt;
  &lt;tbody&gt;
   &lt;tr&gt;
    &lt;td class="linenos"&gt;
     &lt;div class="linenodiv"&gt;
      &lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
    &lt;td class="code"&gt;
     &lt;div class="source"&gt;
      &lt;pre&gt;&lt;span class="nv"&gt;user&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;clj-http.client&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;WARNING&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;get &lt;/span&gt;&lt;span class="nv"&gt;already&lt;/span&gt; &lt;span class="nv"&gt;refers&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;clojure.core/get&lt;/span&gt; &lt;span class="nv"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;namespace&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;user&lt;/span&gt;,
&lt;span class="nv"&gt;being&lt;/span&gt; &lt;span class="nv"&gt;replaced&lt;/span&gt; &lt;span class="nv"&gt;by&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;clj-http.client/get&lt;/span&gt;
&lt;span class="nv"&gt;user&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;subotai.near-duplicate.core&lt;/span&gt; &lt;span class="ss"&gt;:reload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;user&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;b2&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:body&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;get &lt;/span&gt;&lt;span class="s"&gt;"http://www.kidneyspace.com/index.php/topic,5286.msg30719.html"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;user/b2&lt;/span&gt;
&lt;span class="nv"&gt;user&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;b1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:body&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;get &lt;/span&gt;&lt;span class="s"&gt;"http://www.kidneyspace.com/index.php/topic,5286"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="ss"&gt;&amp;#39;user/b1&lt;/span&gt;
&lt;span class="nv"&gt;user&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;near-duplicate-html?&lt;/span&gt; &lt;span class="nv"&gt;b1&lt;/span&gt; &lt;span class="nv"&gt;b2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;true&lt;/span&gt;
&lt;span class="nv"&gt;user&amp;gt;&lt;/span&gt; 
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;h2 id="links"&gt;Links&lt;/h2&gt;

&lt;p&gt;The github project page: &lt;a href="https://github.com/shriphani/subotai"&gt;[github: Subotai]&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PDFs of the papers implemented: &lt;a href="https://github.com/shriphani/subotai/tree/master/doc"&gt;[github: Papers]&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="pipeline"&gt;Pipeline&lt;/h2&gt;

&lt;p&gt;Next, I want to implement record detection (automatically figuring out different reviews on an amazon product page for instance).&lt;/p&gt;

&lt;p&gt;The thresholds used are picked from papers or 2-fold cross validation. I will move that codebase into Subotai later.&lt;/p&gt;&lt;/html&gt;</description></item></channel></rss>