blob: 6a5d041b2f3036c35e4780e9d3e172789aab859a [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.4"/>
<title>MADlib: plda.sql_in Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
extensions: ["tex2jax.js", "TeX/AMSmath.js", "TeX/AMSsymbols.js"],
jax: ["input/TeX","output/HTML-CSS"],
});
</script><script src="../mathjax/MathJax.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">MADlib
&#160;<span id="projectnumber">0.5</span>
</div>
<div id="projectbrief">User Documentation</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.4 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('plda_8sql__in_source.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Groups</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">plda.sql_in</div> </div>
</div><!--header-->
<div class="contents">
<a href="plda_8sql__in.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/* ----------------------------------------------------------------------- */</span><span class="comment">/** </span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> * @file plda.sql_in</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> * @brief SQL functions for parallel Latent Dirichlet Allocation</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> * @date April 2011</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> * @sa For an introduction to Latent Dirichlet Allocation models, see the </span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> module description \ref grp_plda.</span></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> */</span><span class="comment">/* ------------------------------------------------------------------------*/</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;</div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;m4_include(`SQLCommon.m4<span class="stringliteral">&#39;)</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="stringliteral"></span><span class="comment"></span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="comment">@addtogroup grp_plda</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment">@about</span></div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="comment">Latent Dirichlet Allocation (LDA) is an interesting generative probabilistic </span></div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="comment">model for natural texts that has received a lot of attention in recent years. </span></div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="comment">The model is quite versatile, having found uses in problems like automated </span></div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="comment">topic discovery, collaborative filtering, and document classification.</span></div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="comment">The LDA model posits that each document is associated with a mixture of various </span></div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="comment">topics (e.g. a document is related to Topic 1 with probability 0.7, and Topic 2 with </span></div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="comment">probability 0.3), and that each word in the document is attributable to one </span></div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="comment">of the document&#39;s topics. There is a (symmetric) Dirichlet prior with parameter </span></div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="comment">\f$ \alpha \f$ on each document&#39;s topic mixture. In addition, there is another </span></div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="comment">(symmateric) Dirichlet prior with parameter \f$ \eta \f$ on the distribution </span></div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="comment">of words for each topic. The following generative process then defines a distribution </span></div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="comment">over a corpus of documents. First sample, for each topic \f$ i \f$, a per-topic word distribution </span></div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="comment">\f$ \Phi_i \f$ from the Dirichlet(\f$\eta\f$) prior. </span></div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="comment">Then for each document:</span></div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="comment">-# Sample a document length N from a suitable distribution, say, Poisson.</span></div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="comment">-# Sample a topic mixture \f$ \theta \f$ for the document from the Dirichlet(\f$\alpha\f$) distribution.</span></div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="comment">-# For each of the N words:</span></div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="comment"> -# Sample a topic \f$ z_n \f$ from the multinomial topic distribution \f$ \theta \f$.</span></div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;<span class="comment"> -# Sample a word \f$ w_n \f$ from the multinomial word distribution \f$ \Phi_{z_n} \f$ associated with topic \f$ z_n \f$.</span></div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="comment">In practice, only the words in each document are observable. The topic mixture of </span></div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="comment">each document and the topic for each word in each document are latent unobservable </span></div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="comment">variables that need to be inferred from the observables, and this is the problem</span></div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<span class="comment">people refer to when they talk about the inference problem for LDA. Exact inference</span></div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<span class="comment">is intractable, but several approximate inference algorithms for LDA have been</span></div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;<span class="comment">developed. The simple and effective Gibbs sampling algorithm described in </span></div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;<span class="comment">Griffiths and Steyvers [2] appears to be the current algorithm of choice. Our </span></div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;<span class="comment">parallel implementation of LDA comes from Wang et al [3], which is essentially</span></div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;<span class="comment">a straightforward parallelisation of the Gibbs sampling algorithm.</span></div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="comment">See also http://code.google.com/p/plda/.</span></div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;<span class="comment">@input</span></div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;<span class="comment">The \b corpus to be analyzed is expected to be of the following form:</span></div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;<span class="comment">&lt;pre&gt;{TABLE|VIEW} &lt;em&gt;datatable&lt;/em&gt; (</span></div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;<span class="comment"> &lt;em&gt;id&lt;/em&gt; INTEGER,</span></div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;<span class="comment"> &lt;em&gt;contents&lt;/em&gt; INTEGER[],</span></div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;<span class="comment"> ...</span></div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;<span class="comment">)&lt;/pre&gt;</span></div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;<span class="comment">where \c id refers to the document ID, and \c contents is an integer array that specifies the words in the document using the index from</span></div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;<span class="comment">the dictionary. Words must be represented using positive numbers.</span></div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160;<span class="comment">The \b dictionary that indexes all the words found in the corpus is of the following form:</span></div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;<span class="comment">&lt;pre&gt;{TABLE|VIEW} &lt;em&gt;dicttable&lt;/em&gt; (</span></div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160;<span class="comment"> &lt;em&gt;dict&lt;/em&gt; TEXT[],</span></div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160;<span class="comment"> ...</span></div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160;<span class="comment">)&lt;/pre&gt;</span></div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160;<span class="comment">@usage</span></div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160;<span class="comment">- Topic inference is achieved through the following UDF</span></div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160;<span class="comment"> &lt;pre&gt;</span></div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160;<span class="comment"> SELECT \ref plda_run(&#39;&lt;em&gt;datatable&lt;/em&gt;&#39;, &#39;&lt;em&gt;dicttable&lt;/em&gt;&#39;, &#39;&lt;em&gt;modeltable&lt;/em&gt;&#39;, &#39;&lt;em&gt;outputdatatable&lt;/em&gt;&#39;, </span></div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160;<span class="comment"> &lt;em&gt;numiter&lt;/em&gt;, &lt;em&gt;numtopics&lt;/em&gt;, &lt;em&gt;alpha&lt;/em&gt;, &lt;em&gt;eta&lt;/em&gt;);</span></div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160;<span class="comment"> &lt;/pre&gt;</span></div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160;<span class="comment"> This function stores the resulting model in &lt;tt&gt;&lt;em&gt;outputdatatable&lt;/em&gt;&lt;/tt&gt;.</span></div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160;<span class="comment">- Labelling of test documents using a learned LDA model is achieved using the following UDF</span></div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160;<span class="comment"> &lt;pre&gt;</span></div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160;<span class="comment"> SELECT \ref plda_label_test_documents(&#39;&lt;em&gt;testtable&lt;/em&gt;&#39;, &#39;&lt;em&gt;outputtable&lt;/em&gt;&#39;, &#39;&lt;em&gt;modeltable&lt;/em&gt;&#39;, &#39;&lt;em&gt;dicttable&lt;/em&gt;&#39;,</span></div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160;<span class="comment"> &lt;em&gt;numtopics&lt;/em&gt;, &lt;em&gt;alpha&lt;/em&gt;, &lt;em&gt;eta&lt;/em&gt;);</span></div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160;<span class="comment"> &lt;/pre&gt;</span></div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160;<span class="comment"> This creates the following table with the assigned topic for each word in the test corpus.</span></div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;<span class="comment"> &lt;pre&gt;</span></div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160;<span class="comment"> id | contents | topics </span></div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160;<span class="comment"> ----+-------------------------------+-----------------------------------</span></div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160;<span class="comment"> ...</span></div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160;<span class="comment"> &lt;/pre&gt;</span></div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;<span class="comment">@implementation</span></div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160;<span class="comment">The input format for the Parallel LDA module is different from that used by the </span></div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160;<span class="comment">`lda&#39; package for R. In the `lda&#39; package, each document is represented by two</span></div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160;<span class="comment">equal dimensional integer arrays. The first array represents the words that occur</span></div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160;<span class="comment">in the document, and the second array captures the number of times each word in</span></div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160;<span class="comment">the first array occurs in the document.</span></div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;<span class="comment">This representation appears to have a major weakness in that all the occurrences</span></div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160;<span class="comment">of a word in a document must be assigned the same topic, which is clearly not</span></div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;<span class="comment">satisfactory. Further, at the time of writing, the main learning function in the </span></div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160;<span class="comment">`lda&#39; package actually does not work correctly when the occurrence counts for words </span></div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160;<span class="comment">aren&#39;t one.</span></div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160;<span class="comment">There is a script called generateTestCases.cc that can be used to generate some</span></div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160;<span class="comment">simple test documents to validate the correctness and effiency of the parallel</span></div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160;<span class="comment">LDA implementation.</span></div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160;<span class="comment">@examp</span></div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160;<span class="comment">We now give a usage example.</span></div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160;<span class="comment">-# As a first step, we need to prepare a corpus and dictionary in the appropriate structure.</span></div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160;<span class="comment"> \code</span></div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160;<span class="comment">sql&gt; CREATE TABLE MADLIB_SCHEMA.plda_mydict ( dict text[] ) DISTRIBUTED RANDOMLY;</span></div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160;<span class="comment">sql&gt; INSERT into MADLIB_SCHEMA.plda_mydict values</span></div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160;<span class="comment"> (&#39;{human,machine,interface,for,abc,computer,applications,a,survey,of,</span></div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160;<span class="comment"> user,opinion,system,response,time,the,eps,management,and,engineering,</span></div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160;<span class="comment"> testing,relation,perceived,to,error,generation,random,binary,order,tree,</span></div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160;<span class="comment"> intersection,graph,path,in,minor,IV,widths,well,quasi}&#39;);</span></div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160;<span class="comment">sql&gt; CREATE TABLE MADLIB_SCHEMA.plda_mycorpus ( id int4, contents int4[] );</span></div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160;<span class="comment">sql&gt; INSERT INTO MADLIB_SCHEMA.plda_mycorpus VALUES </span></div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160;<span class="comment"> (1, &#39;{1,2,3,4,5,6,7}&#39;), </span></div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160;<span class="comment"> (2, &#39;{8,9,10,11,12,10,6,13,14,15}&#39;),</span></div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160;<span class="comment"> (3, &#39;{16,17,11,3,18,13}&#39;),</span></div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160;<span class="comment"> (4, &#39;{13,19,1,13,20,21,10,17}&#39;),</span></div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160;<span class="comment"> (5, &#39;{22,10,11,23,14,15,24,25,18}&#39;),</span></div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160;<span class="comment"> (6, &#39;{16,26,10,27,28,29,30}&#39;),</span></div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160;<span class="comment"> (7, &#39;{16,31,32,10,33,34,30}&#39;),</span></div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160;<span class="comment"> (8, &#39;{32,35,36,37,10,30,19,38,39,29}&#39;),</span></div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160;<span class="comment"> (9, &#39;{32,35,8,9}&#39;) ;</span></div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160;<span class="comment"> \endcode </span></div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160;<span class="comment">-# To perform inference, we call the plda_run() function with the appropriate parameters. </span></div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160;<span class="comment"> Here is an example.</span></div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160;<span class="comment"> \code</span></div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160;<span class="comment">sql&gt; select MADLIB_SCHEMA.plda_run(&#39;MADLIB_SCHEMA.plda_mycorpus&#39;, &#39;MADLIB_SCHEMA.plda_mydict&#39;, </span></div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160;<span class="comment"> &#39;MADLIB_SCHEMA.plda_mymodel&#39;, &#39;MADLIB_SCHEMA.plda_corpus&#39;, </span></div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160;<span class="comment"> 30,10,0.5,0.5);</span></div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160;<span class="comment"> \endcode</span></div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160;<span class="comment"> After a successful run of the plda_run() function, the most probable words associated </span></div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160;<span class="comment"> with each topic are displayed. Other results of the learning process can be obtained </span></div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160;<span class="comment"> by running the following commands. Here we assume the modeltable and outputdatatable </span></div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160;<span class="comment"> parameters to plda_run() are &#39;MADLIB_SCHEMA.plda_mymodel&#39; and &#39;MADLIB_SCHEMA.plda_corpus&#39; respectively.</span></div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160;<span class="comment"> -# The topic assignments for each document can be obtained as follows:</span></div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160;<span class="comment"> \code</span></div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160;<span class="comment"> sql&gt; select id, (topics).topics from MADLIB_SCHEMA.plda_corpus;</span></div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160;<span class="comment"> \endcode</span></div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160;<span class="comment"> -# The topic distribution of each document can be obtained as follows:</span></div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160;<span class="comment"> \code</span></div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160;<span class="comment"> sql&gt; select id, (topics).topic_d from MADLIB_SCHEMA.plda_corpus;</span></div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160;<span class="comment"> \endcode</span></div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160;<span class="comment"> -# The number of times each word was assigned to a given topic in the whole corpus can </span></div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160;<span class="comment"> be computed as follows:</span></div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160;<span class="comment"> \code</span></div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;<span class="comment"> sql&gt; select ss.i, MADLIB_SCHEMA.plda_word_topic_distrn(gcounts,$numtopics,ss.i) </span></div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160;<span class="comment"> from MADLIB_SCHEMA.plda_mymodel, </span></div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160;<span class="comment"> (select generate_series(1,$dictsize) i) as ss;</span></div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160;<span class="comment"> \endcode</span></div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160;<span class="comment"> where $numtopics is the number of topics used in the learning process, and </span></div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160;<span class="comment"> $dictsize is the size of the dictionary.</span></div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160;<span class="comment"> -# The total number of words assigned to each topic in the whole corpus can be computed </span></div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160;<span class="comment"> as follows:</span></div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160;<span class="comment"> \code</span></div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160;<span class="comment"> sql&gt; select sum((topics).topic_d) topic_sums from MADLIB_SCHEMA.plda_corpus;</span></div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160;<span class="comment"> \endcode</span></div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160;<span class="comment">-# To use a learned LDA model to label new documents, we can use the following commands:</span></div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160;<span class="comment"> \code</span></div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160;<span class="comment">sql&gt; select MADLIB_SCHEMA.plda_label_test_documents(&#39;MADLIB_SCHEMA.plda_mycorpus&#39;, &#39;MADLIB_SCHEMA.plda_testresult&#39;, &#39;MADLIB_SCHEMA.plda_mymodel&#39;, &#39;MADLIB_SCHEMA.plda_mydict&#39;, 10,0.5,0.5);</span></div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160;<span class="comment">sql&gt; select * from MADLIB_SCHEMA.plda_testresult;</span></div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160;<span class="comment"> \endcode</span></div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160;<span class="comment"> </span></div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160;<span class="comment">@literature</span></div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160;<span class="comment">[1] D.M. Blei, A.Y. Ng, M.I. Jordan, &lt;em&gt;Latent Dirichlet Allocation&lt;/em&gt;, </span></div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160;<span class="comment"> Journal of Machine Learning Research, vol. 3, pp. 993-1022, 2003.</span></div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160;<span class="comment">[2] T. Griffiths and M. Steyvers, &lt;em&gt;Finding scientific topics&lt;/em&gt;, </span></div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160;<span class="comment"> PNAS, vol. 101, pp. 5228-5235, 2004.</span></div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160;<span class="comment">[3] Y. Wang, H. Bai, M. Stanton, W-Y. Chen, and E.Y. Chang, &lt;em&gt;PLDA: </span></div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160;<span class="comment"> Parallel Dirichlet Allocation for Large-scale Applications&lt;/em&gt;, AAIM, 2009.</span></div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160;<span class="comment">[4] http://en.wikipedia.org/wiki/Latent_Dirichlet_allocation</span></div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;<span class="comment">[5] J. Chang, Collapsed Gibbs sampling methods for topic models, R manual, 2010.</span></div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160;<span class="comment">@sa File plda.sql_in documenting the SQL functions.</span></div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160;<span class="comment"></span></div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160;<span class="comment">*/</span></div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160;</div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160;</div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160;-- The plda_topics_t data type store the assignment of topics to each word in a document,</div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160;-- plus the distribution of those topics in the document.</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160;CREATE TYPE MADLIB_SCHEMA.plda_topics_t AS (</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; topics int4[],</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; topic_d int4[]</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160;);</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160;</div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160;-- Returns a zero&#39;d array of a given dimension</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160;CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.plda_zero_array(d int4) RETURNS int4[] </div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160;AS <span class="stringliteral">&#39;MODULE_PATHNAME&#39;</span>, <span class="stringliteral">&#39;zero_array&#39;</span> LANGUAGE C STRICT;</div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160;</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160;-- Returns the element-wise sum of two integer arrays</div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160;CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.plda_sum_int4array(int4[],int4[]) RETURNS int4[]</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160;AS <span class="stringliteral">&#39;MODULE_PATHNAME&#39;</span>, <span class="stringliteral">&#39;sum_int4array&#39;</span> LANGUAGE C;</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160;</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160;-- Aggregate <span class="keyword">function</span> <span class="keywordflow">for</span> computing the element-wise sum of a set of integer arrays</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160;CREATE AGGREGATE MADLIB_SCHEMA.plda_sum_int4array_agg(int4[]) </div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160;(</div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; sfunc = MADLIB_SCHEMA.plda_sum_int4array,</div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; stype = int4[]</div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160;);</div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160;</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160;-- Returns an array of random topic assignments <span class="keywordflow">for</span> a given document length</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160;CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.plda_random_topics(doclen int4, numtopics int4) RETURNS MADLIB_SCHEMA.plda_topics_t </div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160;AS <span class="stringliteral">&#39;MODULE_PATHNAME&#39;</span>, <span class="stringliteral">&#39;randomTopics&#39;</span> LANGUAGE C STRICT;</div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160;</div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160;-- This <span class="keyword">function</span> assigns a randomly chosen topic to each word in a document according to </div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160;-- the count statistics obtained <span class="keywordflow">for</span> the document and the whole corpus so far. </div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160;-- Parameters</div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160;-- doc : the document to be analysed</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160;-- topics : the topic of each word in the doc</div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160;-- topic_d : the topic distribution <span class="keywordflow">for</span> the doc</div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160;-- global_count : the global word-topic counts</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160;-- topic_counts : the counts of all words in the corpus in each topic</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160;-- num_topics : number of topics to be discovered</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160;-- dsize : size of dictionary</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160;-- alpha : the parameter of the Dirichlet distribution</div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160;-- eta : the parameter of the Dirichlet distribution</div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160;--</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160;CREATE OR REPLACE FUNCTION</div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160;MADLIB_SCHEMA.plda_sample_new_topics(doc int4[], topics int4[], topic_d int4[], global_count int4[],</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; topic_counts int4[], num_topics int4, dsize int4, alpha <span class="keywordtype">float</span>, eta <span class="keywordtype">float</span>) </div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160;RETURNS MADLIB_SCHEMA.plda_topics_t</div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160;AS <span class="stringliteral">&#39;MODULE_PATHNAME&#39;</span>, <span class="stringliteral">&#39;sampleNewTopics&#39;</span> LANGUAGE C STRICT;</div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160;</div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160;-- Computes the per document word-topic counts</div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160;CREATE OR REPLACE FUNCTION </div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160;MADLIB_SCHEMA.plda_cword_count(mystate int4[], doc int4[], topics int4[], doclen int4, num_topics int4, dsize int4)</div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160;RETURNS int4[]</div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160;AS <span class="stringliteral">&#39;MODULE_PATHNAME&#39;</span>, <span class="stringliteral">&#39;cword_count&#39;</span> LANGUAGE C;</div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160;</div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160;-- Aggregate <span class="keyword">function</span> to compute all word-topic counts given topic assignments <span class="keywordflow">for each</span> document</div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160;CREATE AGGREGATE MADLIB_SCHEMA.plda_cword_agg(int4[], int4[], int4, int4, int4) (</div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; sfunc = MADLIB_SCHEMA.plda_cword_count,</div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; stype = int4[] </div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160;);</div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160;</div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160;-- The main parallel LDA learning <span class="keyword">function</span></div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160;CREATE OR REPLACE FUNCTION</div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160;MADLIB_SCHEMA.plda_train(num_topics int4, num_iter int4, alpha <span class="keywordtype">float</span>, eta <span class="keywordtype">float</span>, </div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; data_table text, dict_table text, model_table text, output_data_table text) </div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160;RETURNS int4 AS $$</div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160;</div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; PythonFunctionBodyOnly(`plda<span class="stringliteral">&#39;, `plda&#39;</span>)</div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; </div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; <span class="preprocessor"># schema_madlib comes from PythonFunctionBodyOnly</span></div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160;<span class="preprocessor"></span> <span class="keywordflow">return</span> plda.plda_train( schema_madlib, num_topics, num_iter, alpha, eta, data_table, dict_table, model_table, output_data_table)</div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160;</div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160;$$ LANGUAGE plpythonu;</div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160;</div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160;CREATE TYPE MADLIB_SCHEMA.plda_word_weight AS ( word text, prob <span class="keywordtype">float</span>, wcount int4 );</div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160;</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160;-- Returns the most important words <span class="keywordflow">for each</span> topic, base on Pr( word | topic ).</div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160;CREATE OR REPLACE FUNCTION </div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160;MADLIB_SCHEMA.plda_topic_word_prob(num_topics int4, topic int4, model_table text, dict_table text) </div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160;RETURNS SETOF MADLIB_SCHEMA.plda_word_weight AS $$</div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160;</div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; PythonFunctionBodyOnly(`plda<span class="stringliteral">&#39;, `plda&#39;</span>)</div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; </div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="preprocessor"># schema_madlib comes from PythonFunctionBodyOnly</span></div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160;<span class="preprocessor"></span> <span class="keywordflow">return</span> plda.plda_topic_word_prob( schema_madlib, num_topics, topic, model_table, dict_table) </div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160;</div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160;$$ LANGUAGE plpythonu;</div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160;</div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160;</div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160;CREATE TYPE MADLIB_SCHEMA.plda_word_distrn AS ( word text, distrn int4[], prob float8[] );</div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160;</div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160;-- This <span class="keyword">function</span> computes the topic assignments to words in a document given previously computed</div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160;-- statistics from the training corpus. </div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160;-- This <span class="keyword">function</span> has not been rewritten in PL/Python because it is hard to handle structured types</div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160;-- like MADLIB_SCHEMA.plda_topics_t in PL/Python (<span class="keyword">this</span> has to be done via conversion to text, which is not nice).</div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160;CREATE OR REPLACE FUNCTION </div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160;MADLIB_SCHEMA.plda_label_document(doc int4[], global_count int4[], topic_counts int4[], num_topics int4, dsize int4, </div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; alpha <span class="keywordtype">float</span>, eta <span class="keywordtype">float</span>)</div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160;RETURNS MADLIB_SCHEMA.plda_topics_t AS $$</div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160;DECLARE</div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; ret MADLIB_SCHEMA.plda_topics_t;</div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160;BEGIN</div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; ret := MADLIB_SCHEMA.plda_random_topics(array_upper(doc,1), num_topics);</div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; FOR i in 1..20 LOOP</div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; ret := MADLIB_SCHEMA.plda_sample_new_topics(doc,(ret).topics,(ret).topic_d,global_count,topic_counts,num_topics,dsize,alpha,eta);</div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; END LOOP;</div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; RETURN ret;</div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160;END;</div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160;$$ LANGUAGE plpgsql;</div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160;</div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160;-- This <span class="keyword">function</span> computes the topic assignments to documents in a test corpus.</div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160;-- The data_table argument appears unnecessary, as <span class="keywordtype">long</span> as topic_counts is saved in a table from the plda_train() routine<span class="comment"></span></div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160;<span class="comment"> * @brief This function computes the topic assignments to documents in a test corpus.</span></div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160;<span class="comment"> * @param test_table Name of table containing the test corpus (must have columns &lt;tt&gt;id INT&lt;/tt&gt; and &lt;tt&gt;contents INT[]&lt;/tt&gt;).</span></div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160;<span class="comment"> * @param output_table Name of table to store the results.</span></div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160;<span class="comment"> * @param model_table Name of table where learned model is stored (in the form of word-topic counts and topic counts).</span></div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160;<span class="comment"> * @param dict_table Name of the table containing the dictionary (mandatory column is dict text[])</span></div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160;<span class="comment"> * @param num_topics Number of topics to discover. </span></div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160;<span class="comment"> * @param alpha Parameter to the topic Dirichlet prior.</span></div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160;<span class="comment"> * @param eta Parameter to the Dirichlet prior on the per-topic word distributions.</span></div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160;CREATE OR REPLACE FUNCTION</div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160;MADLIB_SCHEMA.<a class="code" href="plda_8sql__in.html#adefc4576799e950baf03e7ba66c34eba" title="This function computes the topic assignments to documents in a test corpus. ">plda_label_test_documents</a>(test_table text, output_table text, model_table text, dict_table text, num_topics int4, alpha <span class="keywordtype">float</span>, eta <span class="keywordtype">float</span>)</div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160;RETURNS VOID AS $$</div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160;</div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; PythonFunctionBodyOnly(`plda&#39;, `plda&#39;)</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; </div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; <span class="preprocessor"># schema_madlib comes from PythonFunctionBodyOnly</span></div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160;<span class="preprocessor"></span> plda.plda_label_test_documents( schema_madlib, test_table, output_table, model_table, dict_table, num_topics, alpha, eta)</div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160;</div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160;$$ LANGUAGE plpythonu;</div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160;</div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160;-- Returns the distribution of topics <span class="keywordflow">for</span> a given word</div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160;CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.plda_word_topic_distrn(arr int4[], ntopics int4, word int4, OUT ret int4[]) AS $$</div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; SELECT $1[(($3-1)*$2 + 1):(($3-1)*$2 + $2)];</div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160;$$ LANGUAGE sql;<span class="comment"></span></div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160;<span class="comment">/**</span></div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160;<span class="comment"> * @brief Main plda function</span></div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160;<span class="comment"> * @param datatable Name of table containing the corpus (must have columns &lt;tt&gt;id INT&lt;/tt&gt; and &lt;tt&gt;contents INT[]&lt;/tt&gt;).</span></div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160;<span class="comment"> * @param dicttable Name of table containing the dictionary (must have column \c dict \c TEXT[]).</span></div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160;<span class="comment"> * @param modeltable Name of table where learned model will be stored (in the form of word-topic counts and topic counts).</span></div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160;<span class="comment"> * @param outputdatatable Name of the table the system will store a copy of the datatable plus topic assignments.</span></div>
<div class="line"><a name="l00332"></a><span class="lineno"><a class="code" href="plda_8sql__in.html#adefc4576799e950baf03e7ba66c34eba"> 332</a></span>&#160;<span class="comment"> * @param numiter Number of iterations to run the Gibbs sampling.</span></div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160;<span class="comment"> * @param numtopics Number of topics to discover. </span></div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160;<span class="comment"> * @param alpha Parameter to the topic Dirichlet prior.</span></div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160;<span class="comment"> * @param eta Parameter to the Dirichlet prior on the per-topic word distributions.</span></div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160;CREATE OR REPLACE FUNCTION </div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160;MADLIB_SCHEMA.plda_run(datatable text, dicttable text, modeltable text, outputdatatable text, </div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; numiter int4, numtopics int4, alpha <span class="keywordtype">float</span>, eta <span class="keywordtype">float</span>)</div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160;RETURNS VOID AS $$</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160;</div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; PythonFunctionBodyOnly(`plda<span class="stringliteral">&#39;, `plda&#39;</span>)</div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; </div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="preprocessor"># schema_madlib comes from PythonFunctionBodyOnly</span></div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160;<span class="preprocessor"></span> plda.plda_run( schema_madlib, datatable, dicttable, modeltable, outputdatatable, numiter, numtopics, alpha, eta) </div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; </div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160;$$ LANGUAGE plpythonu;</div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160;</div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160;</div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_704eb8350b43e1ca74c0f90ed1ba450e.html">methods</a></li><li class="navelem"><a class="el" href="dir_cadc2f84a45765297e3de71a0990944f.html">plda</a></li><li class="navelem"><a class="el" href="dir_e10a5423302f08b62a9f40fa9e226bb0.html">src</a></li><li class="navelem"><a class="el" href="dir_d2147977cd6306f191f6bf61818cc41e.html">pg_gp</a></li><li class="navelem"><a class="el" href="plda_8sql__in.html">plda.sql_in</a></li>
<li class="footer">Generated on Tue Sep 10 2013 13:36:13 for MADlib by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.4 </li>
</ul>
</div>
</body>
</html>