<!DOCTYPE html>
<html>
  <head>
	  <title>DeReKo-Word-Vector-Distances: <%= $word %></title>
    <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
		<link href="https://fonts.googleapis.com/css?family=Lato|Roboto+Condensed" rel="stylesheet">
    <script src="http://code.jquery.com/jquery-latest.min.js"></script>
		<script src = "https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"></script>
		<script src = "https://cdn.datatables.net/fixedcolumns/3.2.3/js/dataTables.fixedColumns.min.js"></script>
		<script src = "https://cdn.datatables.net/plug-ins/1.10.16/sorting/scientific.js"></script>
		<link rel="stylesheet" href="https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css">
    <script
			src="http://code.jquery.com/ui/1.12.1/jquery-ui.min.js"
			integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU="
			crossorigin="anonymous"></script>
    <script>
		 var urlParams = new URLSearchParams(window.location.search);

     $('#firstable').hide();
		 $(document).ready(function() {

			 $("input").bind("keydown", function(event) {
				 // track enter key
				 var keycode = (event.keyCode ? event.keyCode : (event.which ? event.which : event.charCode));
				 if (keycode == 13) { // keycode for enter key
					 // force the 'Enter Key' to implicitly click the Update button
					 document.getElementById('SEARCH').click();
					 return false;
				 } else  {
					 return true;
				 }});

			 $(".selector").tabs({ active: 1 });


			 $('#firsttable').DataTable({
				 "sScrollY": "780px",
				 "bScrollCollapse": true,
				 "bPaginate": false,
				 "bJQueryUI": true,
				 "dom": '<"top">rt<"bottom"flp><"clear">',
				 "aoColumnDefs": [
					 { "sWidth": "10%", "aTargets": [ -1 ] }
				 ]
			 } );

       $( "#first" ).clone().prependTo( "#tabs-2" );

       function changeCharColor(txt, heat) {
         var newText = "";
         for (var i=0, l=txt.length; i<l; i++) {
           newText += (i == 5 ? txt.charAt(i) : '<span style="background-color:'+getHeatColor(heat[i]/maxHeat)+'">'+txt.charAt(i)+'</span>');
         }
         return newText;
       }

       function getHeatColor(value) {
         var hue=((1-value)*120).toString(10);
         return ["hsl(",hue,",90%,70%)"].join("");
       }

			 function bitvec2window(n, heat) {
				 var str = n.toString(2).padStart(10, "0")
										.replace(/^([0-9]{5})/, '$1x')
										.replace(/0/g, '·')
										.replace(/1/g, '+');
			   return changeCharColor(str, heat);
			 }

			 var collocatorData = <%= b(Mojo::JSON::to_json($collocators)) %>;
       var maxHeat; // = Math.max.apply(Math,collocatorData.map(function(o){return o.cprob;}))
       maxHeat = Math.max.apply(Math,collocatorData.map(function(o){return Math.max.apply(Math,o.heat);}))

			 if (collocatorData != null) {
				 var t = $('#secondtable').DataTable({
           data: collocatorData,
					 "sScrollY": "800px",
					 "bScrollCollapse": true,
					 "bPaginate": false,
					 "bJQueryUI": true,
					 "dom": '<"top">rt<"bottom"flp><"clear">',
					 "columns": [
						 { "data": "rank", type: "allnumeric" },
						 { "data": "pos", width: "7%", sClass: "dt-center mono compact", render: function ( data, type, row ) {return bitvec2window(data, row.heat) }},
						 { "data": "max",  render: function ( data, type, row ) {return data.toFixed(3) }},
						 { "data": "conorm", render: function ( data, type, row ) {return data.toFixed(3) }},
						 { "data": "prob", type: "scientific", render: function ( data, type, row ) {return data.toExponential(3) }  },
						 { "data": "cprob", type: "scientific", render: function ( data, type, row ) {return data.toExponential(3) }  },
						 { "data": "overall", type: "scientific", render: function ( data, type, row ) {return data.toExponential(3) } },
						 { "data": "word",  sClass: "collocator" }
					 ],
					 "columnDefs": [
						 { className: "dt-right", "targets": [0,2,3,4,5,6] },
						 { className: "dt-center", "targets": [ 1] },
						 { "searchable": false,
							 "orderable": false,
							 "targets": 0
						 },
						 { "type": "scientific", targets: [2,3,4,5,6] },
						 { "orderSequence": [ "desc" ], "targets": [ 2, 3, 4, 5, 6 ] },
						 { "orderSequence": [ "asc", "desc" ], "targets": [ 1, 7 ] },
					 ],
					 "order": [[ 4, 'desc' ]],
				 } );

				 t.on( 'order.dt search.dt', function () {
					 t.column(0, {order:'applied'}).nodes().each( function (cell, i) {
						 cell.innerHTML = i+1;
					 } );
				 } ).draw();
			 }
			 $("#tabs").css("visibility", "visible"); // now we can show the tabs

		 });

		 $(function(){
			 $("#dropdownoptions").dialog({
				 title: "Options",
				 autoOpen: false,
				 modal: false,
				 draggable: false,
				 height: "auto",
				 width: "auto",
				 resizable: false,
				 buttons: {
					 "Cancel": function() {
						 $( this ).dialog( "close" );
					 },
					 "Apply": function() {
						 window.open($(location).attr('pathname')+'?'+$('form').serialize(), "_self");
					 }
				 }
			 });
		 });

		 $(function(){
			 $("#SEARCH").click(function() {
				 window.open($(location).attr('pathname')+'?'+$('form').serialize(), "_self");
			 });
		 });

		 $(function(){
			 $("td.collocator").click(function(){
				 queryKorAPCII(this.textContent + " /w5 " + urlParams.get('word'));
			 });
		 });

		 $(function(){
			 $("#showoptions").click(function(){
				 $("#dropdownoptions").dialog("open");
				 var target = $(this);
				 $("#dropdownoptions").dialog("widget").position({
					 my: 'left bottom',
					 at: 'left bottom',
					 of: target
				 });
			 });
		 });

		 $( function() {
			 $( "#no_iterations" ).spinner({
				 spin: function( event, ui ) {
					 if ( ui.value < 1000 ) {
						 $( this ).spinner( "value", 1000 );
						 return false;
					 } else if ( ui.value > 10000 ) {
						 $( this ).spinner( "value", 10000 );
						 return false;
					 }
				 }
			 });
		 } );

		 $( function() {
			 $( "#neighbours" ).spinner({
				 spin: function( event, ui ) {
					 if ( ui.value < 0 ) {
						 $( this ).spinner( "value", 0 );
						 return false;
					 } else if ( ui.value > 200 ) {
						 $( this ).spinner( "value", 200 );
						 return false;
					 }
				 }
			 });
		 } );

		 $( function() {
			 $( "#cutoff" ).spinner({
				 spin: function( event, ui ) {
					 if ( ui.value < 100000 ) {
						 $( this ).spinner( "value", 100000 );
						 return false;
					 } else if ( ui.value > 2000000 ) {
						 $( this ).spinner( "value", 2000000 );
						 return false;
					 }
				 }
			 });
		 } );

		 var tabactivated = {}
     $( function() {
			 $( "#tabs" ).tabs().addClass('tabs-min');
		 } );

		 $( function() {
			 $( ".controlgroup-vertical" ).controlgroup({
				 "direction": "vertical"
			 });
		 } );

		 $(function() {
			 $( document ).tooltip({
				 content: function() {
					 return $(this).attr('title');
				 }}
			 )
		 })

    </script>
	  <script src="//d3js.org/d3.v3.min.js" charset="utf-8"></script>
	  <script src="/derekovecs/js/tsne.js"></script>
	  <script src="/derekovecs/js/som.js"></script>
	  <script src="/derekovecs/js/labeler.js"></script>
    <style>
     body, input {
	     font-family: Lato, sans-serif;
	     font-size: 11pt;
     }

		 h1,  h2, h3 {
			 margin: 5px 10px 0 0;
			 color: rgb(246,168,0);
			 font-family: "Univers LT Std 47 Cn Lt", "Univers LT Std 67 Cn Lt", "Roboto Condensed", "Univers LT Std 67 Cn Bold", "UniversLTStd-BoldCn", "Times", 'League Gothic', Impact, sans-serif;
			 font-weight: bold;
			 line-height: 1.35;
			 letter-spacing: normal;
			 text-transform: uppercase;
			 text-shadow: none;
			 word-wrap: break-word;
		 }


		 showoptions, #SEARCH {
			 margin-left: 10px;
			 margin-right: 10px;
		 }

		 .tabs-left-vertical .ui-tabs-nav {
			 position: absolute;
			 width: 21em;
			 transform: translate(-100%,0%) rotate(-90deg);
			 transform-origin: 100% 0%;
		 }

		 .tabs-left-vertical .ui-tabs-nav li {
			 float: right;
		 }

		 .tabs-left-vertical .ui-tabs-panel {
			 padding-left: 3.5em;
		 }

		 .tabs-left-vertical .ui-tabs-panel {
			 height: 20em;
		 }

		 .mono {
			 font-family: "DejaVu Sans Mono", Inconsolata, SourceCodePro, Courier;
		 }

		 .ui-tooltip-content {
			 font-size: 9pt;
			 color: #222222;
		 }

		 svg > .ui-tooltip-content {
			 font-size: 8pt;
			 color: #222222;
		 }

		 a.merged {
			 color: green;
			 fill: green;
		 }

		 #first a {
			 text-decoration: none;
		 }

		 a.marked, #first a.marked {
			 text-decoration: underline;
		 }

		 a.target {
			 color: red;
			 fill: red;
		 }

		 table.display {
			 width: 40% important!;
			 margin: 1;  /* <- works for me this way ****/
		 }

		 table.dataTable thead th, table.dataTable thead td, table.dataTable tbody td {
			 padding: 2px 2px;
			 //  border-bottom: 1px solid #111;
		 }

		 #collocators {
			 margin-bottom: 15px;
		 }

		 #header {
			 width: 100%;
			 //   border: 1px solid red;
			 overflow: hidden; /* will contain if #first is longer than #second */
		 }

		 #topwrapper {
			 width: 100%;
			 //   border: 1px solid red;
			 overflow: hidden; /* will contain if #first is longer than #second */
		 }

		 #wrapper {
			 //   border: 1px solid red;
			 overflow: hidden; /* will contain if #first is longer than #second */
		 }

		 #pagetitle {
			 max-width: 460px;
			 margin-right: 20px;
			 float: left;
			 overflow: hidden; /* if you don't want #second to wrap below #first */
			 //    border: 1px solid green;
		 }

		 #options {
			 float: left;
			 width: 800px;
			 margin: 10px;
			 overflow: hidden; /* if you don't want #second to wrap below #first */
		 }

		 #word {
			 width: 50%;
		 }

		 #first {
			 margin-right: 20px;
			 float: left;
			 overflow: hidden; /* if you don't want #second to wrap below #first */
			 //    border: 1px solid green;
		 }
		 #tabs {
			 margin-right: 20px;
			 overflow: hidden; /* if you don't want #second to wrap below #first */
		 }

		 .tabs-min {
			 background: transparent;
			 border: none;
		 }

		 .tabs-min .ui-widget-header {
			 background: transparent;
			 border: none;
			 border-bottom: 1px solid #c0c0c0;
			 -moz-border-radius: 0px;
			 -webkit-border-radius: 0px;
			 border-radius: 0px;
		 }

		 .tabs-min .ui-tabs-nav .ui-state-default {
			 background: transparent;
			 border: none;
		 }

		 .tabs-min .ui-tabs-nav .ui-state-active {
			 background: transparent url(img/uiTabsArrow.png) no-repeat bottom center;
			 border: none;
		 }

		 .tabs-min .ui-tabs-nav .ui-state-default a {
			 color: #c0c0c0;
		 }

		 .tabs-min .ui-tabs-nav .ui-state-active a {
			 color: rgb(246,168,0);
		 }

		 #embed {
			 max-width: 802px;
			 border: 1px solid #333;
		 }

		 #second {
			 min-width: 800px;
			 //       border: 1px solid #333;
			 overflow: hidden; /* if you don't want #second to wrap below #first */
		 }
		 #som2 svg {
			 border: 1px solid #333;
		 }

		 #cost {
			 font-size: 8pt;
			 color: #222222;
			 margin-top: 4px;
			 margin-bottom: 12px;
		 }

		 #sominfo1, #sominfo {
			 font-size: 8pt;
			 color: #222222;
			 margin-top: 0px;
		 }

		 #somcolor1, #somcolor2, #somcolor3 {
			 display: inline-block;
			 height: 10px;
			 width: 10px;
		 }

		 #third {
			 border: 1px solid #333;
		 }

    </style>
    <script>

     var opt = {epsilon: <%= $epsilon %>, perplexity: <%= $perplexity %>},
		     mapWidth = 800, // width map
		     mapHeight = 800,
		     jitterRadius = 7;

     var T = new tsnejs.tSNE(opt); // create a tSNE instance

     var Y;

     var data;
     var labeler;

     function applyJitter() {
			 svg.selectAll('.tsnet')
					.data(labels)
					.transition()
					.duration(50)
					.attr("transform", function(d, i) {
						T.Y[i][0] = (d.x - mapWidth/2 - tx)/ss/20;
						T.Y[i][1] = (d.y - mapHeight/2 - ty)/ss/20;
						return "translate(" +
											  (d.x) + "," +
											  (d.y) + ")";
					});
     }

     function updateEmbedding() {
			 var Y = T.getSolution();
			 svg.selectAll('.tsnet')
					.data(data.words)
					.attr("transform", function(d, i) {
						return "translate(" +
											   ((Y[i][0]*20*ss + tx) + mapWidth/2) + "," +
											   ((Y[i][1]*20*ss + ty) + mapHeight/2) + ")"; });
     }

     var svg;
     var labels = [];
     var anchor_array = [];
     var text;

     function drawEmbedding() {
			 $("#embed").empty();
			 var div = d3.select("#embed");

			 // get min and max in each column of Y
			 var Y = T.Y;

			 svg = div.append("svg") // svg is global
								.attr("width", mapWidth)
								.attr("height", mapHeight);

			 var g = svg.selectAll(".b")
									.data(data.words)
									.enter().append("g")
									.attr("class", "tsnet");

			 g.append("a")
				.attr("xlink:href", function(word) {
					return (data.urlprefix+word);})
				.attr("class", function(d, i) {
					var res="";
					if(data.marked[i]) {
						res="marked ";
					}
					if(data.target.indexOf(" "+d+" ") >= 0) {
						return res+"target";
					} else if(data.ranks[i] < data.mergedEnd) {
						return res+"merged";
					} else {
						return res;
					}
				})
				.attr("title", function(d, i) {
					if(data.mergedEnd > 0) {
						if(data.ranks[i] >= data.mergedEnd) {
         			return "rank: "+i +"  "+"freq. rank: "+(data.ranks[i]).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
						} else {
         			return "rank: "+i +"  "+"freq. rank: "+data.ranks[i].toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + " (merged vocab)";
						}
					} else {
						return "rank: "+i +"  "+"freq. rank: "+data.ranks[i].toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
					}
				})
				.append("text")
				.attr("text-anchor", "top")
				.attr("font-size", 12)
				.text(function(d) { return d; });

			 var zoomListener = d3.behavior.zoom()
														.scaleExtent([0.1, 10])
														.center([0,0])
														.on("zoom", zoomHandler);
			 zoomListener(svg);
     }

     var tx=0, ty=0;
     var ss=1;
     var iter_id=-1;

     function zoomHandler() {
			 tx = d3.event.translate[0];
			 ty = d3.event.translate[1];
			 ss = d3.event.scale;
			 updateEmbedding();
     }

     var stepnum = 0;

     function stopStep() {
			 clearInterval(iter_id);
			 text = svg.selectAll("text");

			 // jitter function needs different data and co-ordinate representation
			 labels = d3.range(data.words.length).map(function(i) {
				 var x = (T.Y[i][0]*20*ss + tx) + mapWidth/2;
				 var y = (T.Y[i][1]*20*ss + ty) + mapHeight/2;
				 anchor_array.push({x: x, y: y, r: jitterRadius});
				 return {
					 x: x,
					 y: y,
					 name: data.words[i]
				 };
			 });

			 // get the actual label bounding boxes for the jitter function
			 var index = 0;
			 text.each(function() {
				 labels[index].width = this.getBBox().width;
				 labels[index].height = this.getBBox().height;
				 index += 1;
			 });


			 //	 setTimeout(updateEmbedding, 1);
			 //	 setTimeout(
					 labeler =	 d3.labeler()
												 .label(labels)
												 .anchor(anchor_array)
												 .width(mapWidth)
												 .height(mapHeight)
												 .update(applyJitter);
			 //         .start(1000);

			 iter_id = setInterval(jitterStep, 1);
     }

     var jitter_i=0;

     function jitterStep() {
			 if(jitter_i++ > 100) {
				 clearInterval(iter_id);
			 } else {
				 labeler.start2(10);
				 applyJitter();
			 }
     }

     var last_cost=1000;

     function step() {
			 var i = T.iter;

			 if(i > <%= $no_iterations %>) {
				 stopStep();
			 } else {
				 var cost = Math.round(T.step() * 100000) / 100000; // do a few steps
				 $("#cost").html("tsne iteration " + i + ", cost: " + cost.toFixed(5));
				 if(i % 250 == 0 && cost >= last_cost) {
					 stopStep();
				 } else {
					 last_cost = cost;
					 updateEmbedding();
				 }
			 }
     }

     function showMap(j) {
			 data=j;
			 T.iter=0;
			 T.initDataRaw(data.vecs); // init embedding
			 drawEmbedding(); // draw initial embedding

			 if(iter_id >= 0) {
				 clearInterval(iter_id);
			 }
			 //T.debugGrad();
			 iter_id = setInterval(step, 1);
			 if(true) { // (<%= $show_som %>) {
				 makeSOM(j, <%= $no_iterations %>);
			 }
     }
     var queryword;

     function onload() {
       queryword = document.getElementById('word');
     }

     function queryKorAP() {
       window.open('http://korap.ids-mannheim.de/kalamar/?q='+queryword.value, 'KorAP');
     }

     function queryKorAPCII(query) {
       window.open('http://korap.ids-mannheim.de/kalamar/?ql=cosmas2&q='+query, 'KorAP');
     }
    </script>
  </head>
  <body onload="onload()">
		<div id="header">
			<div id="pagetitle">
				<h1>DeReKo-Vectors</h1>
			</div>
			<div id="options"  class="widget">
				<form id="queryform">
					<input id="word" type="text" name="word"  placeholder="Word(s) to be searched" value="<%= $word %>"
								 title="When looking for multiple words use spaces as separators to search around the average vector and | as separator to get the neighbours for each word."/>
					<input id="SEARCH" type="button" value="SEARCH">
					<input type="button" id="showoptions" name="showoptions" value="Options" />
				</form>
				<div id="dropdownoptions" style="display: none">
					<form id="optionsform">
						<div class="controlgroup-vertical">
							<label for="cutoff">cut-off</label>
							<input id="cutoff" type="text" name="cutoff" size="10"  value="<%= $cutoff %>" title="Only consider the most frequent x word forms.">
							<label for="dedupe">dedupe</label>
							<input id="dedupe" type="checkbox" name="dedupe" value="1" <%= ($dedupe ? "checked" : "") %> title="radically filter out any near-duplicates">
							% if($mergedEnd > 0) {
								<label for="sbf">backw.</label>
								<input id="sbf" type="checkbox" name="sbf" value="1" <%= ($searchBaseVocabFirst ? "checked" : "") %> title="If checkecked base vocabulary will be searched first. Otherwise merged vocabulray will be searched first.">
							% }
							<label for="neighbours">max. neighbours:</label>
							<input id="neighbours" size="4" name="n" value="<%= $no_nbs %>">
							<label for="no_iterations">max. iterations</label>
							<input id="no_iterations" name="N" size="4" value="<%= $no_iterations %>">
							<!-- <label for="dosom">SOM</label>
									 <input id="dosom" type="checkbox" name="som" value="1" <%= ($show_som ? "checked" : "") %>> -->
							% if($collocators) {
								<label for="sortby">window/sort</label>
								<select id="sortby" name="sort">
									<option value="0"  <%= ($sort!=1 && $sort!=2? "selected":"") %>>auto focus</option>
									<!-- <option value="1"  <%= ($sort==1? "selected":"") %>>any single position</option>
											 <option value="2" <%= ($sort==2? "selected":"") %>>whole window</option> -->
								</select>
							% }
							<input type="button" value="→ KorAP" onclick="queryKorAP();" title="query word with KorAP"/>
						</div>
					</form>
				</div>
			</div>
		</div>
		<div id="topwrapper">
			<div style="visibility: hidden;" id="tabs">
				<ul>
					<li><a href="#tabs-1">Semantics (TSNE-map)</a></li>
					<li><a href="#tabs-2">Semantics (SOM)</a></li>
					<li><a href="#tabs-3">Syntagmatic (collocators)</a></li>
				</ul>
				<div id="tabs-1">
					% if($lists && (@$lists) > 0 && (@$lists)[0]) {
						<div id="wrapper">
							<div id="first" style="width: 320px">
								<table class="display compact nowrap" id="firsttable">
									<thead>
										<tr>
											<th align="right">#</th><th align="right">cos</th><th align="left">similars</th>
										</tr>
									</thead>
									<tbody>
										% my $j=0; my @words; my @vecs; my @ranks; my @marked;
										% for my $list (@$lists) {
											% my $i=0; while($list) {
												% my $item = (@$list)[$i];
												% my $c = ($collocators? (@$collocators)[$i] : 0);
												% last if(!$c && !$item);
												<tr>
													<td align="right">
  													<%= ++$i %>.
													</td>
													% if($item) {
														% if(!grep{$_ eq $item->{word}} @words) {
															%   push @vecs, $item->{vector};
															%   push @words, $item->{word};
															%   push @ranks, $item->{rank};
															%   push @marked, ($marked->{$item->{word}}? 1 : 0);
														% }
														<td align="right">
  														<%= sprintf("%.3f", $item->{dist}) %>
														</td>
														<td>
															% my $class = ($marked->{$item->{word}}? "marked " : "");
															% my $r = $item->{rank};
															% if($r < $mergedEnd) {
																%   $class .= "merged";
																%   $r .= " (merged vocab)";
															% } elsif($mergedEnd!=0 && $r > $mergedEnd) {
															%   $r -= $mergedEnd;
													% }
  												<a class="<%= $class =%>"
														 title="freq. rank: <%= $r =%>"
														 href="<%= url_with->query([word => $item->{word}]) =%>">
														<%= $item->{word} =%>
													</a>
														</td>
											% } else {
														<td colspan="2"/>
											% }
												</tr>
												% last if($i >= $no_nbs);
										% }
					% }
									</tbody>
								</table>
							</div>
							<script>
							 % use Mojo::ByteStream 'b';
							 % my $urlprefix = url_with->query([word=>'']);
							 $(window).load(function() {
								 var vecs = <%= b(Mojo::JSON::to_json($lists->[0])) %>;
								 showMap(<%= b(Mojo::JSON::to_json({target => " $word ", mergedEnd=> $mergedEnd, words => \@words, vecs => \@vecs, ranks => \@ranks, marked => \@marked, urlprefix => $urlprefix})); %>);
							 });
							</script>
            % } else {
							<div id="wrapper">
								<div id="not-found-dialog" title="Not found">
									<p>ERROR: "<%= $word %>" not found in vocabluary.</p>
									<p>If you are sure you have spelled the word as intended, you can try to increase the cutoff parameter in the options menu.</p>
								</div>
								<script>
								 $( function() {
									 $( "#not-found-dialog" ).dialog({
										 autoOpen: true,
										 modal: true,
										 draggable: false,
										 height: "auto",
										 width: "auto",
										 resizable: false,
										 buttons: {
											 "OK": function() {
												 $( this ).dialog( "close" );
											 },
											 "Apply": function() {
												 window.open($(location).attr('pathname')+'?'+$('form').serialize(), "_self");
											 }
										 }
									 });
								 });
								</script>
							</div>
						% }
						<div id="second">
							<div id="embed">
							</div>
							<div id="cost">
							</div>
						</div>
					  </div>
				</div>
        <div id="tabs-2">
					<div id="som2" style="width: 800; height: 800px">
					</div>
					<div id="sominfo1"><span id="somcolor1">   </span> <span id="somword1"> </span> <span id="somcolor2">   </span> <span id="somword2"> </span> <span id="somcolor3">   </span></div>
					<div id="sominfo">SOM iteration <span id="iterations">0</span></div>
        </div>
				<div id="tabs-3">
					<div style="width: 800px" id="secondt">
						<table class="display compact nowrap" id="secondtable">
							<thead>
								<tr>
									% if($collocators) {
										<th>#</th>
										<th align="center" title="The columns (c) around the target are considered for summation are marked with *.">w'</th>
										<th align="right" title="Raw (max.) activation of the collocator in the output layers.">max(a)</th>
										<th title="Co-normalized raw activation sum of the collocator in the selected columns." align="right">⊥Σa</th>
										<th title="Sum of activations over the selected colunns normalized by the total activation sum of the selected columns." align="right">Σa/Σc</th>
										<th title="Sum of the column normalized activations over the selected colunns." align="right">Σ(a/c)</th>
										<th title="Sum of the activations over the whole window normalized by the total window sum (no auto-focus)." align="right">Σa/Σw</th>
										<th align="left">collocator</th>
									% }
								</tr>
							</thead>
							<tbody>
								<tr>
									<td align="right">
									</td>
									<td align="right">
									</td>
									<td align="right">
									</td>
									<td align="right">
									</td>
									<td align="right">
									</td>
									<td align="right">
									</td>
									<td align="right">
									</td>
									<td align="left">
									</td>
								</tr>
							</tbody>
						</table>
					</div> <!-- - tab2 -->
			  </div> <!-- tabs -->
      </div>
		</div> <!-- topwrapper  -->
		<div style="clear: both;"></div>
		</div>
    % if($training_args) {
      <p>
        Word vector model trained with <a href="https://code.google.com/p/word2vec/">word2vec</a> using the following parameters: <pre><%= $training_args %></pre>
      </p>
    % }
	</body>
</html>
