This is an automated email from the ASF dual-hosted git repository.

git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/groovy-dev-site.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 8d0e0a9  2023/02/17 06:39:22: Generated dev website from 
groovy-website@143277b
8d0e0a9 is described below

commit 8d0e0a945c619f9e934f52ddfdcefe906eeeb1bc
Author: jenkins <[email protected]>
AuthorDate: Fri Feb 17 06:39:22 2023 +0000

    2023/02/17 06:39:22: Generated dev website from groovy-website@143277b
---
 blog/classifying-iris-flowers-with-deep.html      |    2 +-
 blog/comparators-and-sorting-in-groovy.html       |    2 +-
 blog/deck-of-cards-with-groovy.html               |    2 +-
 blog/deep-learning-and-eclipse-collections.html   |    2 +-
 blog/detecting-objects-with-groovy-the.html       |    2 +-
 blog/feed.atom                                    |   10 +
 blog/fruity-eclipse-collections.html              |    2 +-
 blog/gmavenplus-1-6-2-released.html               |    2 +-
 blog/groovy-2-4-16-released.html                  |    2 +-
 blog/groovy-2-4-16-windows.html                   |    2 +-
 blog/groovy-2-4-17-released.html                  |    2 +-
 blog/groovy-2-5-1-released.html                   |    2 +-
 blog/groovy-2-5-2-released.html                   |    2 +-
 blog/groovy-2-5-2-windows.html                    |    2 +-
 blog/groovy-2-5-3-released.html                   |    2 +-
 blog/groovy-2-5-3-windows.html                    |    2 +-
 blog/groovy-2-5-4-released.html                   |    2 +-
 blog/groovy-2-5-4-windows.html                    |    2 +-
 blog/groovy-2-5-5-released.html                   |    2 +-
 blog/groovy-2-5-5-windows.html                    |    2 +-
 blog/groovy-2-5-6-released.html                   |    2 +-
 blog/groovy-2-5-7-and.html                        |    2 +-
 blog/groovy-2-5-7-released.html                   |    2 +-
 blog/groovy-3-0-0-alpha.html                      |    2 +-
 blog/groovy-3-0-0-alpha1.html                     |    2 +-
 blog/groovy-3-0-0-beta.html                       |    2 +-
 blog/groovy-3-0-0-beta1.html                      |    2 +-
 blog/groovy-3-0-0-beta2.html                      |    2 +-
 blog/groovy-4-0-3-released.html                   |    2 +-
 blog/groovy-list-processing-cheat-sheet.html      |    2 +-
 blog/groovy-release-train-4-0.html                |    2 +-
 blog/img/groovyconsole_enable_visualization.png   |  Bin 0 -> 205802 bytes
 blog/img/groovyconsole_showing_visutalization.png |  Bin 0 -> 226977 bytes
 blog/img/sentence_encodings_smile_heatmap.png     |  Bin 0 -> 59264 bytes
 blog/index.html                                   |    4 +-
 blog/matrix-calculations-with-groovy-apache.html  |    2 +-
 blog/natural-language-processing-with-groovy.html | 1386 +++++++++++++++++++++
 blog/parsing-json-with-groovy.html                |    2 +-
 blog/reading-and-writing-csv-files.html           |    2 +-
 blog/using-groovy-with-apache-wayang.html         |    2 +-
 blog/whiskey-clustering-with-groovy-and.html      |    2 +-
 blog/wordle-checker.html                          |    2 +-
 blog/zipping-collections-with-groovy.html         |    2 +-
 43 files changed, 1435 insertions(+), 39 deletions(-)

diff --git a/blog/classifying-iris-flowers-with-deep.html 
b/blog/classifying-iris-flowers-with-deep.html
index 04d70a9..08c33bd 100644
--- a/blog/classifying-iris-flowers-with-deep.html
+++ b/blog/classifying-iris-flowers-with-deep.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Classifying Iris Flowers with Deep Learning, Groovy and 
GraalVM</a></li><li><a href='#_deep_learning' class='anchor-link'>Deep 
Learning</a></li><li><a href='#_encog' class='anchor-link'>Encog</a></li><li><a 
href='#_eclipse_deeplearning4j' class='anchor-link'>Eclipse DeepLe [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Classifying Iris Flowers with Deep Learning, Groovy and 
GraalVM</a></li><li><a href='#_deep_learning' class='anchor-link'>Deep 
Learning</a></li><li><a href='#_encog' class='anchor-link'>Encog</a></li><li><a 
href='#_eclipse_deeplearning4j' class='anchor-link'>Eclipse DeepLe [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p><span class="image right"><img src="img/iris_flowers.png" alt="iris 
flowers" width="200"></span>
diff --git a/blog/comparators-and-sorting-in-groovy.html 
b/blog/comparators-and-sorting-in-groovy.html
index a30e9dd..7740d90 100644
--- a/blog/comparators-and-sorting-in-groovy.html
+++ b/blog/comparators-and-sorting-in-groovy.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Comparators and Sorting in Groovy</a></li><li><a 
href='#_the_java_comparator_story_recap' class='anchor-link'>The Java 
comparator story recap</a></li><li><a href='#_the_groovy_comparator_story' 
class='anchor-link'>The Groovy comparator story</a></li><li><a href='#_mixing_i 
[...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Comparators and Sorting in Groovy</a></li><li><a 
href='#_the_java_comparator_story_recap' class='anchor-link'>The Java 
comparator story recap</a></li><li><a href='#_the_groovy_comparator_story' 
class='anchor-link'>The Groovy comparator story</a></li><li><a href='#_mixing_i 
[...]
 <div class="sectionbody">
 <div class="paragraph">
 <p><span class="image right"><img src="img/cher_record.png" alt="Cher" 
width="179" height="179"></span>
diff --git a/blog/deck-of-cards-with-groovy.html 
b/blog/deck-of-cards-with-groovy.html
index 3813075..540a31d 100644
--- a/blog/deck-of-cards-with-groovy.html
+++ b/blog/deck-of-cards-with-groovy.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Deck of cards with Groovy, JDK collections and Eclipse 
Collections</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 
0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./deep-learning-and-eclipse-collections'>Deep Learning and E [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Deck of cards with Groovy, JDK collections and Eclipse 
Collections</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 
0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./deep-learning-and-eclipse-collections'>Deep Learning and E [...]
 <p>Once again, <a href="https://twitter.com/TheDonRaab";>Donald Raab</a> has 
produced an interesting
 <a 
href="https://donraab.medium.com/how-to-create-a-deck-of-cards-using-eclipse-collections-d9838ac430b7";>blog
 post</a> on
 <a href="https://github.com/eclipse/eclipse-collections";>Eclipse 
Collections</a> this one shows some code for modelling and manipulating cards 
with Java 17 and Eclipse Collections. His related katas are highly recommended.
diff --git a/blog/deep-learning-and-eclipse-collections.html 
b/blog/deep-learning-and-eclipse-collections.html
index e9a7f2d..a1c3bde 100644
--- a/blog/deep-learning-and-eclipse-collections.html
+++ b/blog/deep-learning-and-eclipse-collections.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Deep Learning and Eclipse Collections</a></li><li><a 
href='#_setting_up_our_model_and_data' class='anchor-link'>Setting up our model 
and data</a></li><li><a href='#_applying_deep_learning' 
class='anchor-link'>Applying deep learning</a></li></ul><br/><ul 
class='nav-sidebar' [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Deep Learning and Eclipse Collections</a></li><li><a 
href='#_setting_up_our_model_and_data' class='anchor-link'>Setting up our model 
and data</a></li><li><a href='#_applying_deep_learning' 
class='anchor-link'>Applying deep learning</a></li></ul><br/><ul 
class='nav-sidebar' [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p>In previous blogs, we&#8217;ve covered
diff --git a/blog/detecting-objects-with-groovy-the.html 
b/blog/detecting-objects-with-groovy-the.html
index 7f92878..dbc2e52 100644
--- a/blog/detecting-objects-with-groovy-the.html
+++ b/blog/detecting-objects-with-groovy-the.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Detecting objects with Groovy, the Deep Java Library (DJL), and 
Apache MXNet</a></li><li><a href='#_deep_learning' class='anchor-link'>Deep 
Learning</a></li><li><a href='#_deep_java_library_djl_apache_mxnet' 
class='anchor-link'>Deep Java Library (DJL) &amp; Apache MXNet</a [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Detecting objects with Groovy, the Deep Java Library (DJL), and 
Apache MXNet</a></li><li><a href='#_deep_learning' class='anchor-link'>Deep 
Learning</a></li><li><a href='#_deep_java_library_djl_apache_mxnet' 
class='anchor-link'>Deep Java Library (DJL) &amp; Apache MXNet</a [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p>This blog posts looks at using <a href="https://groovy-lang.org/";>Apache 
Groovy</a> with the
diff --git a/blog/feed.atom b/blog/feed.atom
index 18278ff..458def3 100644
--- a/blog/feed.atom
+++ b/blog/feed.atom
@@ -354,6 +354,16 @@
     <published>2022-08-01T11:52:26+00:00</published>
     <summary>This post looks at using Apache Groovy, DLJ and Apache MXNet to 
use neural networks to detect objects within an image.</summary>
   </entry>
+  <entry>
+    <author>
+      <name>Paul King</name>
+    </author>
+    <title>Natural Language Processing with Groovy, OpenNLP, CoreNLP, Nlp4j, 
Datumbox, Smile, Spark NLP, DJL and TensorFlow</title>
+    <link 
href="http://groovy.apache.org/blog/natural-language-processing-with-groovy"/>
+    <updated>2022-08-07T07:34:08+00:00</updated>
+    <published>2022-08-07T07:34:08+00:00</published>
+    <summary>This post looks at numerous common natural language processing 
tasks using Groovy and a range of NLP libraries.</summary>
+  </entry>
   <entry>
     <author>
       <name>Paul King</name>
diff --git a/blog/fruity-eclipse-collections.html 
b/blog/fruity-eclipse-collections.html
index 5b6580e..03a96c9 100644
--- a/blog/fruity-eclipse-collections.html
+++ b/blog/fruity-eclipse-collections.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Fruity Eclipse Collections</a></li><li><a 
href='#_eclipse_collections_fruit_salad' class='anchor-link'>Eclipse 
Collections Fruit Salad</a></li><li><a href='#_exploring_emoji_colors' 
class='anchor-link'>Exploring emoji colors</a></li><li><a 
href='#_putting_it_all_together'  [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Fruity Eclipse Collections</a></li><li><a 
href='#_eclipse_collections_fruit_salad' class='anchor-link'>Eclipse 
Collections Fruit Salad</a></li><li><a href='#_exploring_emoji_colors' 
class='anchor-link'>Exploring emoji colors</a></li><li><a 
href='#_putting_it_all_together'  [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p>This blog post continues on the theme of using fruit emoji from the
diff --git a/blog/gmavenplus-1-6-2-released.html 
b/blog/gmavenplus-1-6-2-released.html
index f47684f..42e661b 100644
--- a/blog/gmavenplus-1-6-2-released.html
+++ b/blog/gmavenplus-1-6-2-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>GMavenPlus 1.6.2 Released (Community Artifact)</a></li><li><a 
href='#_gmavenplus_1_6_2_has_been_released' class='anchor-link'>GMavenPlus 
1.6.2 has been released.</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Rel [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>GMavenPlus 1.6.2 Released (Community Artifact)</a></li><li><a 
href='#_gmavenplus_1_6_2_has_been_released' class='anchor-link'>GMavenPlus 
1.6.2 has been released.</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Rel [...]
 <h2 id="_gmavenplus_1_6_2_has_been_released">GMavenPlus 1.6.2 has been 
released.</h2>
 <div class="sectionbody">
 <div class="paragraph">
diff --git a/blog/groovy-2-4-16-released.html b/blog/groovy-2-4-16-released.html
index f9caca9..f6bfbe5 100644
--- a/blog/groovy-2-4-16-released.html
+++ b/blog/groovy-2-4-16-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.4.16 Released</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a 
href='./groovy-2-4-16-windows'>Groovy 2.4.16 Windows Installer Released 
(Community Artifact)</a></li><li><a hr [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.4.16 Released</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a 
href='./groovy-2-4-16-windows'>Groovy 2.4.16 Windows Installer Released 
(Community Artifact)</a></li><li><a hr [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-4-16-windows.html b/blog/groovy-2-4-16-windows.html
index 098c036..054ea2f 100644
--- a/blog/groovy-2-4-16-windows.html
+++ b/blog/groovy-2-4-16-windows.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.4.16 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-2-4-16-released'>Groovy 2.4.16 Released</a></li><li><a h [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.4.16 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-2-4-16-released'>Groovy 2.4.16 Released</a></li><li><a h [...]
 <p>The Windows installer for Groovy 2.4.16 (community artifact) is available 
from: <a 
href="https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.4.16-installer";
 
class="bare">https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.4.16-installer</a>.</p>
 </div></div></div></div></div><footer id='footer'>
                             <div class='row'>
diff --git a/blog/groovy-2-4-17-released.html b/blog/groovy-2-4-17-released.html
index 822a40e..bc88e62 100644
--- a/blog/groovy-2-4-17-released.html
+++ b/blog/groovy-2-4-17-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.4.17 Released</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a 
href='./groovy-2-4-16-released'>Groovy 2.4.16 Released</a></li><li><a 
href='./groovy-2-4-16-windows'>Groovy 2. [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.4.17 Released</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a 
href='./groovy-2-4-16-windows'>Groovy 2.4.16 Windows Installer Released 
(Community Artifact)</a></li><li><a hr [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-5-1-released.html b/blog/groovy-2-5-1-released.html
index 728ed69..21561fb 100644
--- a/blog/groovy-2-5-1-released.html
+++ b/blog/groovy-2-5-1-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.1 released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-7-released'>Groovy 2.5.7 
Released</a></li><li><a href='./groovy-2-5-5-windows'>Groovy 2.5.5  [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.1 released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-2-windows'>Groovy 2.5.2 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-5-2-released.html b/blog/groovy-2-5-2-released.html
index 7ecdce0..ef04de8 100644
--- a/blog/groovy-2-5-2-released.html
+++ b/blog/groovy-2-5-2-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.2 released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-2-windows'>Groovy 2.5.2 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.2 released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-2-windows'>Groovy 2.5.2 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-5-2-windows.html b/blog/groovy-2-5-2-windows.html
index 0db754b..8c6896d 100644
--- a/blog/groovy-2-5-2-windows.html
+++ b/blog/groovy-2-5-2-windows.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.2 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-2-5-5-windows'>Groovy 2.5.5 Windows Installer Released (C [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.2 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-2-5-7-and'>Groovy 2.5.7 and 3.0.0-beta-1 Windows Installe [...]
 <p>The Windows installer for Groovy 2.5.2 (community artifact) is available 
from:
 <a 
href="https://dl.bintray.com/groovy/Distributions/groovy-2.5.2-installer.exe"; 
class="bare">https://dl.bintray.com/groovy/Distributions/groovy-2.5.2-installer.exe</a></p>
 </div></div></div></div></div><footer id='footer'>
diff --git a/blog/groovy-2-5-3-released.html b/blog/groovy-2-5-3-released.html
index 32941f0..003d3a3 100644
--- a/blog/groovy-2-5-3-released.html
+++ b/blog/groovy-2-5-3-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.3 Released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-3-windows'>Groovy 2.5.3 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.3 Released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-3-windows'>Groovy 2.5.3 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-5-3-windows.html b/blog/groovy-2-5-3-windows.html
index 50a9c89..c5914a2 100644
--- a/blog/groovy-2-5-3-windows.html
+++ b/blog/groovy-2-5-3-windows.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.3 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-2-5-5-windows'>Groovy 2.5.5 Windows Installer Released (C [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.3 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-2-5-2-windows'>Groovy 2.5.2 Windows Installer Released (C [...]
 <p>The Windows installer for Groovy 2.5.3 (community artifact) is available 
from:
 <a 
href="https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.5.3-installer";
 
class="bare">https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.5.3-installer</a></p>
 </div></div></div></div></div><footer id='footer'>
diff --git a/blog/groovy-2-5-4-released.html b/blog/groovy-2-5-4-released.html
index 169e6f6..f6a77b2 100644
--- a/blog/groovy-2-5-4-released.html
+++ b/blog/groovy-2-5-4-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.4 Released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-4-windows'>Groovy 2.5.4 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.4 Released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-4-windows'>Groovy 2.5.4 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-5-4-windows.html b/blog/groovy-2-5-4-windows.html
index 245ae7d..5774383 100644
--- a/blog/groovy-2-5-4-windows.html
+++ b/blog/groovy-2-5-4-windows.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.4 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-2-5-5-windows'>Groovy 2.5.5 Windows Installer Released (C [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.4 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-2-5-2-windows'>Groovy 2.5.2 Windows Installer Released (C [...]
 <p>The Windows installer for Groovy 2.5.4 (community artifact) is available 
from:
 <a 
href="https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.5.4-installer";
 
class="bare">https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.5.4-installer</a></p>
 </div></div></div></div></div><footer id='footer'>
diff --git a/blog/groovy-2-5-5-released.html b/blog/groovy-2-5-5-released.html
index b6a3785..c6e6170 100644
--- a/blog/groovy-2-5-5-released.html
+++ b/blog/groovy-2-5-5-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.5 released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-5-windows'>Groovy 2.5.5 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.5 released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-5-windows'>Groovy 2.5.5 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-5-5-windows.html b/blog/groovy-2-5-5-windows.html
index 68a2090..0af3d0a 100644
--- a/blog/groovy-2-5-5-windows.html
+++ b/blog/groovy-2-5-5-windows.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.5 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-2-5-5-released'>Groovy 2.5.5 released</a></li><li><a href [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.5 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-2-5-2-windows'>Groovy 2.5.2 Windows Installer Released (C [...]
 <p>The Windows installer for Groovy 2.5.5 (community artifact) is available at:
 <a 
href="https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.5.5-installer";
 
class="bare">https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.5.5-installer</a></p>
 </div></div></div></div></div><footer id='footer'>
diff --git a/blog/groovy-2-5-6-released.html b/blog/groovy-2-5-6-released.html
index 1010317..2d8362f 100644
--- a/blog/groovy-2-5-6-released.html
+++ b/blog/groovy-2-5-6-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.6 Released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-7-released'>Groovy 2.5.7 
Released</a></li><li><a href='./groovy-2-5-5-windows'>Groovy 2.5.5  [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.6 Released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-2-windows'>Groovy 2.5.2 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-2-5-7-and.html b/blog/groovy-2-5-7-and.html
index 25e43fc..15c91c4 100644
--- a/blog/groovy-2-5-7-and.html
+++ b/blog/groovy-2-5-7-and.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.7 and 3.0.0-beta-1 Windows Installers Released 
(Community Artifacts)</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-7-released'>Groovy 2.5.7 Released< 
[...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.7 and 3.0.0-beta-1 Windows Installers Released 
(Community Artifacts)</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-2-windows'>Groovy 2.5.2 Windows In 
[...]
 <p>The Windows installer for Groovy 2.5.7 (Community Artifact) is now 
available from Bintray:
 <a 
href="https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.5.7-installer";
 
class="bare">https://bintray.com/groovy/Distributions/Windows-Installer/groovy-2.5.7-installer</a>.</p>
 </div>
diff --git a/blog/groovy-2-5-7-released.html b/blog/groovy-2-5-7-released.html
index caac668..9629de0 100644
--- a/blog/groovy-2-5-7-released.html
+++ b/blog/groovy-2-5-7-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.7 Released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-7-and'>Groovy 2.5.7 and 3.0.0-beta-1 
Windows Installers Released (Community Artifacts)</a></ [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 2.5.7 Released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-7-and'>Groovy 2.5.7 and 3.0.0-beta-1 
Windows Installers Released (Community Artifacts)</a></ [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-3-0-0-alpha.html b/blog/groovy-3-0-0-alpha.html
index 79b7296..ce0a9fc 100644
--- a/blog/groovy-3-0-0-alpha.html
+++ b/blog/groovy-3-0-0-alpha.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 3.0.0-alpha-4 Released</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a href='./groovy-3-0-0-alpha1'>Groovy 
3.0.0-alpha-4 Windows Installer Released (Community Artifact)</a></ [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 3.0.0-alpha-4 Released</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a href='./groovy-3-0-0-alpha1'>Groovy 
3.0.0-alpha-4 Windows Installer Released (Community Artifact)</a></ [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-3-0-0-alpha1.html b/blog/groovy-3-0-0-alpha1.html
index be9d7a5..f791df8 100644
--- a/blog/groovy-3-0-0-alpha1.html
+++ b/blog/groovy-3-0-0-alpha1.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 3.0.0-alpha-4 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-3-0-0-alpha'>Groovy 3.0.0-alpha-4 Released</a></l [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 3.0.0-alpha-4 Windows Installer Released (Community 
Artifact)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-3-0-0-alpha'>Groovy 3.0.0-alpha-4 Released</a></l [...]
 <p>The Windows installer for Groovy 3.0.0-alpha-4 (Community Artifact) is 
available from the usual place:
 <a 
href="https://bintray.com/groovy/Distributions/download_file?file_path=groovy-3.0.0-alpha-4-installer.exe";
 
class="bare">https://bintray.com/groovy/Distributions/download_file?file_path=groovy-3.0.0-alpha-4-installer.exe</a></p>
 </div>
diff --git a/blog/groovy-3-0-0-beta.html b/blog/groovy-3-0-0-beta.html
index 58e141d..b1cd7eb 100644
--- a/blog/groovy-3-0-0-beta.html
+++ b/blog/groovy-3-0-0-beta.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 3.0.0-beta-1 Released</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a href='./groovy-3-0-0-alpha'>Groovy 
3.0.0-alpha-4 Released</a></li><li><a href='./groovy-3-0-0-beta2'>Gro [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 3.0.0-beta-1 Released</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a href='./groovy-3-0-0-alpha'>Groovy 
3.0.0-alpha-4 Released</a></li><li><a href='./groovy-3-0-0-beta1'>Gro [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-3-0-0-beta1.html b/blog/groovy-3-0-0-beta1.html
index db26cbe..eb57fdc 100644
--- a/blog/groovy-3-0-0-beta1.html
+++ b/blog/groovy-3-0-0-beta1.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 3.0.0-beta-2 Released</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a href='./groovy-3-0-0-beta2'>Groovy 
3.0.0-beta-2 Windows Installer Released (Community Release)</a></li>< [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 3.0.0-beta-2 Released</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a href='./groovy-3-0-0-beta2'>Groovy 
3.0.0-beta-2 Windows Installer Released (Community Release)</a></li>< [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-3-0-0-beta2.html b/blog/groovy-3-0-0-beta2.html
index 4d020f6..8d7df3b 100644
--- a/blog/groovy-3-0-0-beta2.html
+++ b/blog/groovy-3-0-0-beta2.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 3.0.0-beta-2 Windows Installer Released (Community 
Release)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-3-0-0-alpha1'>Groovy 3.0.0-alpha-4 Windows Installe [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 3.0.0-beta-2 Windows Installer Released (Community 
Release)</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 
0.625em; background-color: #eee'><span>Related posts</span></li><li><a 
href='./groovy-3-0-0-beta1'>Groovy 3.0.0-beta-2 Released</a></li>< [...]
 <p>The Windows installer for Groovy 3.0.0-beta-2 is now available from Bintray:
 <a 
href="https://bintray.com/groovy/Distributions/download_file?file_path=groovy-3.0.0-beta-2-installer.exe";
 
class="bare">https://bintray.com/groovy/Distributions/download_file?file_path=groovy-3.0.0-beta-2-installer.exe</a></p>
 </div>
diff --git a/blog/groovy-4-0-3-released.html b/blog/groovy-4-0-3-released.html
index 88dfd55..d912bc0 100644
--- a/blog/groovy-4-0-3-released.html
+++ b/blog/groovy-4-0-3-released.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 4.0.3 Released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-7-released'>Groovy 2.5.7 
Released</a></li><li><a href='./groovy-2-5-5-windows'>Groovy 2.5.5  [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy 4.0.3 Released</a></li></ul><br/><ul class='nav-sidebar'><li 
style='padding: 0.35em 0.625em; background-color: #eee'><span>Related 
posts</span></li><li><a href='./groovy-2-5-2-windows'>Groovy 2.5.2 Windows 
Installer Released (Community Artifact)</a></li><li><a href= [...]
 <p>Dear community,</p>
 </div>
 <div class="paragraph">
diff --git a/blog/groovy-list-processing-cheat-sheet.html 
b/blog/groovy-list-processing-cheat-sheet.html
index a305876..3a33fd8 100644
--- a/blog/groovy-list-processing-cheat-sheet.html
+++ b/blog/groovy-list-processing-cheat-sheet.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy List Processing Cheat Sheet</a></li><li><a 
href='#_declaring_lists' class='anchor-link'>Declaring lists</a></li><li><a 
href='#_list_elements_and_properties' class='anchor-link'>List elements and 
properties</a></li><li><a href='#_modifying_mutable_lists' class='ancho [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy List Processing Cheat Sheet</a></li><li><a 
href='#_declaring_lists' class='anchor-link'>Declaring lists</a></li><li><a 
href='#_list_elements_and_properties' class='anchor-link'>List elements and 
properties</a></li><li><a href='#_modifying_mutable_lists' class='ancho [...]
 <h2 id="_declaring_lists">Declaring lists</h2>
 <div class="sectionbody">
 <div class="paragraph">
diff --git a/blog/groovy-release-train-4-0.html 
b/blog/groovy-release-train-4-0.html
index 58ef3ee..4f3dc7a 100644
--- a/blog/groovy-release-train-4-0.html
+++ b/blog/groovy-release-train-4-0.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy release train: 4.0.4, 3.0.12, 2.5.18</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a 
href='./groovy-2-5-7-released'>Groovy 2.5.7 Released</a></li><li><a 
href='./groovy-2-5-5- [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Groovy release train: 4.0.4, 3.0.12, 2.5.18</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a 
href='./groovy-2-5-2-windows'>Groovy 2.5.2 Windows Installer Released 
(Community Artifact [...]
 <p>It&#8217;s been a productive time for the Apache Groovy project recently. 
We recently released versions 4.0.4, 3.0.12 and 2.5.18 with 42, 21 and 15 fixes 
and improvements respectively. Two quick highlights for the 4.0.4 release 
before getting into more details about the release.</p>
 </div>
 <div class="paragraph">
diff --git a/blog/img/groovyconsole_enable_visualization.png 
b/blog/img/groovyconsole_enable_visualization.png
new file mode 100644
index 0000000..65c4af4
Binary files /dev/null and b/blog/img/groovyconsole_enable_visualization.png 
differ
diff --git a/blog/img/groovyconsole_showing_visutalization.png 
b/blog/img/groovyconsole_showing_visutalization.png
new file mode 100644
index 0000000..d3c94d6
Binary files /dev/null and b/blog/img/groovyconsole_showing_visutalization.png 
differ
diff --git a/blog/img/sentence_encodings_smile_heatmap.png 
b/blog/img/sentence_encodings_smile_heatmap.png
new file mode 100644
index 0000000..e4c8ebb
Binary files /dev/null and b/blog/img/sentence_encodings_smile_heatmap.png 
differ
diff --git a/blog/index.html b/blog/index.html
index 565d7eb..bdb0f7e 100644
--- a/blog/index.html
+++ b/blog/index.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3' id='blog-index'><ul 
class='nav-sidebar list'><li class='active'><a 
href='/blog/'>Blogs</a></li><li><a href='wordle-checker'>Checking Wordle with 
Groovy</a></li><li><a href='groovy-null-processing'>Groovy Processing Nulls In 
Lists</a></li><li><a href='groundhog-day'>Groundhog Day</a></li><li><a 
href='fun-with-rating-stars'>Fun with rating stars</a></li><li><a href=' [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3' id='blog-index'><ul 
class='nav-sidebar list'><li class='active'><a 
href='/blog/'>Blogs</a></li><li><a href='wordle-checker'>Checking Wordle with 
Groovy</a></li><li><a href='groovy-null-processing'>Groovy Processing Nulls In 
Lists</a></li><li><a href='groundhog-day'>Groundhog Day</a></li><li><a 
href='fun-with-rating-stars'>Fun with rating stars</a></li><li><a href=' [...]
                             <div class='row'>
                                 <div class='colset-3-footer'>
                                     <div class='col-1'>
@@ -97,7 +97,7 @@
                     colors: am5.ColorSet.new(root, {})
                 }));
                 wc.data.setAll([
-                { category: "data science", value: 7 }, { category: "eclipse 
collections", value: 7 }, { category: "groovy", value: 54 }, { category: 
"kmeans", value: 3 }, { category: "emoji", value: 3 }, { category: "virtual 
threads", value: 3 }, { category: "scala integration", value: 1 }, { category: 
"clustering", value: 2 }, { category: "windows installer", value: 8 }, { 
category: "release", value: 23 }, { category: "decryption", value: 1 }, { 
category: "encryption", value: 1 }, { ca [...]
+                { category: "centroids", value: 1 }, { category: "data 
science", value: 7 }, { category: "groovy", value: 55 }, { category: "kmeans", 
value: 3 }, { category: "records", value: 5 }, { category: "apache spark", 
value: 1 }, { category: "apache wayang", value: 1 }, { category: "release", 
value: 23 }, { category: "decryption", value: 1 }, { category: "encryption", 
value: 1 }, { category: "security", value: 1 }, { category: "bouncy castle", 
value: 1 }, { category: "domain speci [...]
                 ]);
                 wc.labels.template.setAll({
                     paddingTop: 5,
diff --git a/blog/matrix-calculations-with-groovy-apache.html 
b/blog/matrix-calculations-with-groovy-apache.html
index 179f532..8237837 100644
--- a/blog/matrix-calculations-with-groovy-apache.html
+++ b/blog/matrix-calculations-with-groovy-apache.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Matrix calculations with Groovy, Apache Commons Math, ojAlgo, Nd4j 
and EJML</a></li><li><a href='#_fibonacci' 
class='anchor-link'>Fibonacci</a></li><li><a href='#_leslie_matrices' 
class='anchor-link'>Leslie Matrices</a></li><li><a 
href='#_encryption_with_matrices' class='a [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Matrix calculations with Groovy, Apache Commons Math, ojAlgo, Nd4j 
and EJML</a></li><li><a href='#_fibonacci' 
class='anchor-link'>Fibonacci</a></li><li><a href='#_leslie_matrices' 
class='anchor-link'>Leslie Matrices</a></li><li><a 
href='#_encryption_with_matrices' class='a [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p>This blogs looks at performing matrix calculations with Groovy
diff --git a/blog/natural-language-processing-with-groovy.html 
b/blog/natural-language-processing-with-groovy.html
new file mode 100644
index 0000000..52be328
--- /dev/null
+++ b/blog/natural-language-processing-with-groovy.html
@@ -0,0 +1,1386 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' 
content='IE=edge'/><meta name='viewport' content='width=device-width, 
initial-scale=1'/><meta name='keywords' content='groovy, natural language 
processing, spark nlp, apache opennlp, corenlp, nlp4j, tensorflow, djl, smile, 
datumbox'/><meta name='description' content='This post looks at numerous common 
natural language processing tasks using Groovy and a range of NLP 
libraries.'/><title>The Apache Groovy programming language -  [...]
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: 20px; right: -58px; border: 0; 
z-index: 100; transform: rotate(45deg);' 
src='/img/horizontal-github-ribbon.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' 
class='icon'><span class='fa fa-envelope'></span> Discuss on the 
mailing-list</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' 
class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' 
class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' 
class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' 
class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' 
class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow 
questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span 
class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an 
<strong>outdated</strong> browser. Please <a 
href="http://browsehappy.com/";>upgrade your browser</a> to improve your 
experience.</p>
+                <![endif]--><div><div class='navbar navbar-default 
navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' 
class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span 
class='icon-bar'></span><span class='icon-bar'></span><span 
class='icon-bar'></span>
+                                    </button><a class='navbar-brand' 
href='../index.html'>
+                                        <i class='fa fa-star'></i> Apache 
Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a 
href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a 
href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li 
class=''><a href='/download.html'>Download</a></li><li class=''><a 
href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a 
href='/'>Contribute</a></li><li class=''><a 
href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li class=''><a 
href='https://groovy.apac [...]
+                                            <a data-effect='st-effect-9' 
class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='../search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Natural Language Processing with Groovy, OpenNLP, CoreNLP, Nlp4j, 
Datumbox, Smile, Spark NLP, DJL and TensorFlow</a></li><li><a 
href='#_language_detection' class='anchor-link'>Language 
Detection</a></li><li><a href='#_parts_of_speech' class='anchor-link'>Parts of 
Speech</a [...]
+<div class="sectionbody">
+<div class="paragraph">
+<p>Natural Language Processing is certainly a large and sometimes complex 
topic with
+many aspects. Some of those aspects deserve entire blogs in their own right.
+For this blog, we will briefly look at a few simple use cases illustrating
+where you might be able to use NLP technology in your own project.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_language_detection">Language Detection</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Knowing what language some text represents can be a critical first step to 
subsequent
+processing. Let&#8217;s look at how to predict the language using a pre-built 
model and
+<a href="https://opennlp.apache.org/";>Apache OpenNLP</a>. Here, 
<code>ResourceHelper</code> is a utility class used to download and cache the 
model. The first run may take a little while as it downloads the model. 
Subsequent runs should be fast. Here we are using a well-known model referenced 
in the OpenNLP documentation.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def helper = new 
ResourceHelper('https://dlcdn.apache.org/opennlp/models/langdetect/1.8.3/')
+def model = new LanguageDetectorModel(helper.load('langdetect-183'))
+def detector = new LanguageDetectorME(model)
+
+[ spa: 'Bienvenido a Madrid', fra: 'Bienvenue à Paris',
+  dan: 'Velkommen til København', bul: 'Добре дошли в София'
+].each { k, v -&gt;
+    assert detector.predictLanguage(v).lang == k
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>LanguageDetectorME</code> class lets us predict the language. In 
general, the predictor
+may not be accurate on small samples of text, but it was good enough for our 
example.
+We&#8217;ve used the language code as the key in our map, and we check that 
against the
+predicted language.</p>
+</div>
+<div class="paragraph">
+<p>A more complex scenario is training your own model. Let&#8217;s look at how 
to do that with
+<a href="https://www.datumbox.com/machine-learning-framework/";>Datumbox</a>.
+Datumbox has a
+<a href="https://github.com/datumbox/datumbox-framework-zoo";>pre-trained 
models zoo</a>
+but its language detection model didn&#8217;t seem to work well for the small
+snippets in the next example, so we&#8217;ll train our own model.
+First, we&#8217;ll define our datasets:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def datasets = [
+    English: 
getClass().classLoader.getResource("training.language.en.txt").toURI(),
+    French: 
getClass().classLoader.getResource("training.language.fr.txt").toURI(),
+    German: 
getClass().classLoader.getResource("training.language.de.txt").toURI(),
+    Spanish: 
getClass().classLoader.getResource("training.language.es.txt").toURI(),
+    Indonesian: 
getClass().classLoader.getResource("training.language.id.txt").toURI()
+]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>de</code> training dataset comes from the
+<a 
href="https://github.com/datumbox/NaiveBayesClassifier/tree/master/resources/datasets/training.language.de.txt";>Datumbox
 examples</a>. The training datasets for the other
+languages are from <a 
href="https://www.kaggle.com/zarajamshaid/language-identification-datasst";>Kaggle</a>.</p>
+</div>
+<div class="paragraph">
+<p>We set up the training parameters needed by our algorithm:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def trainingParams 
= new TextClassifier.TrainingParameters(
+    numericalScalerTrainingParameters: null,
+    featureSelectorTrainingParametersList: [new 
ChisquareSelect.TrainingParameters()],
+    textExtractorParameters: new NgramsExtractor.Parameters(),
+    modelerTrainingParameters: new MultinomialNaiveBayes.TrainingParameters()
+)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We&#8217;ll use a Naïve Bayes model with Chisquare feature selection.</p>
+</div>
+<div class="paragraph">
+<p>Next we create our algorithm, train it with our training dataset, and then 
validate it
+against the training dataset. We&#8217;d normally want to split the data into 
training and
+testing datasets, to give us a more accurate statistic of the accuracy of our 
model.
+But for simplicity, while still illustrating the API, we&#8217;ll train and 
validate with
+our entire dataset:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def config = 
Configuration.configuration
+def classifier = MLBuilder.create(trainingParams, config)
+classifier.fit(datasets)
+def metrics = classifier.validate(datasets)
+println "Classifier Accuracy (using training data): 
$metrics.accuracy"</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>When run, we see the following output:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>Classifier Accuracy (using training data): 0.9975609756097561</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Our test dataset will consist of some hard-coded illustrative phrases. 
Let&#8217;s use our model to predict the language for each phrase:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">[   'Bienvenido a 
Madrid', 'Bienvenue à Paris', 'Welcome to London',
+    'Willkommen in Berlin', 'Selamat Datang di Jakarta'
+].each { txt -&gt;
+    def r = classifier.predict(txt)
+    def predicted = r.YPredicted
+    def probability = sprintf '%4.2f', r.YPredictedProbabilities.get(predicted)
+    println "Classifying: '$txt',  Predicted: $predicted,  Probability: 
$probability"
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>When run, it has this output:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>Classifying: 'Bienvenido a Madrid',&amp;nbsp; Predicted: 
Spanish,&amp;nbsp; Probability: 0.83
+Classifying: 'Bienvenue à Paris',&amp;nbsp; Predicted: French,&amp;nbsp; 
Probability: 0.71
+Classifying: 'Welcome to London',&amp;nbsp; Predicted: English,&amp;nbsp; 
Probability: 1.00
+Classifying: 'Willkommen in Berlin',&amp;nbsp; Predicted: German,&amp;nbsp; 
Probability: 0.84
+Classifying: 'Selamat Datang di Jakarta',&amp;nbsp; Predicted: 
Indonesian,&amp;nbsp; Probability: 1.00</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Given these phrases are very short, it is nice to get them all correct,
+and the probabilities all seem reasonable for this scenario.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_parts_of_speech">Parts of Speech</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Parts of speech (POS) analysers examine each part of a sentence (the words 
and
+potentially punctuation) in terms of the role they play in a sentence. A 
typical
+analyser will assign or annotate words with their role like identifying nouns,
+verbs, adjectives and so forth. This can be a key early step for tools like the
+voice assistants from Amazon, Apple and Google.</p>
+</div>
+<div class="paragraph">
+<p>We&#8217;ll start by looking at a perhaps lesser known library Nlp4j before 
looking at
+some others. In fact, there are multiple Nlp4j libraries. We&#8217;ll use the 
one from
+<a href="https://nlp4j.org/";>nlp4j.org</a>, which seems to be the most active 
and recently updated.</p>
+</div>
+<div class="paragraph">
+<p>This library uses the <a 
href="https://stanfordnlp.github.io/CoreNLP/";>Stanford CoreNLP</a>
+library under the covers for its English POS functionality. The library has the
+concept of documents, and annotators that work on documents. Once annotated,
+we can print out all of the discovered words and their annotations:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">var doc = new 
DefaultDocument()
+doc.putAttribute('text', 'I eat sushi with chopsticks.')
+var ann = new StanfordPosAnnotator()
+ann.setProperty('target', 'text')
+ann.annotate(doc)
+println doc.keywords.collect{  k -&gt; "${k.facet - 'word.'}(${k.str})" 
}.join(' ')</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>When run, we see the following output:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>PRP(I) VBP(eat) NN(sushi) IN(with) NNS(chopsticks) .(.)</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The annotations, also known as tags or facets, for this example are as 
follows:</p>
+</div>
+<table class="tableblock frame-all grid-all stripes-even stretch">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p 
class="tableblock">PRP</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Personal 
pronoun</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p 
class="tableblock">VBP</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Present 
tense verb</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">NN</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Noun, 
singular</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">IN</p></td>
+<td class="tableblock halign-left valign-top"><p 
class="tableblock">Preposition</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p 
class="tableblock">NNS</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Noun, 
plural</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The documentation for the libraries we are using give a more complete list 
of such
+annotations.</p>
+</div>
+<div class="paragraph">
+<p>A nice aspect of this library is support for other languages, in 
particular, Japanese.
+The code is very similar but uses a different annotator:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">doc = new 
DefaultDocument()
+doc.putAttribute('text', '私は学校に行きました。')
+ann = new KuromojiAnnotator()
+ann.setProperty('target', 'text')
+ann.annotate(doc)
+println doc.keywords.collect{ k -&gt; "${k.facet}(${k.str})" }.join(' 
')</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>When run, we see the following output:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>名詞(私) 助詞(は) 名詞(学校) 助詞(に) 動詞(行き) 助動詞(まし) 助動詞(た) 記号(。)</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Before progressing, we&#8217;ll highlight the result visualization 
capabilities of the
+GroovyConsole. This feature lets us write a small Groovy script which converts
+results to any swing component. In our case we&#8217;ll convert lists of 
annotated strings
+to a <code>JLabel</code> component containing HTML including colored 
annotation boxes.
+The details aren&#8217;t included here but can be found in the
+<a 
href="https://github.com/paulk-asert/groovy-data-science/blob/master/subprojects/LanguageProcessing/src/main/resources/OutputTransforms.groovy";>repo</a>.
+We need to copy that file into our <code>~/.groovy</code> folder and then 
enable script
+visualization as shown here:</p>
+</div>
+<div class="paragraph">
+<p><span class="image"><img src="img/groovyconsole_enable_visualization.png" 
alt="How to enable visualization in the groovyconsole"></span></p>
+</div>
+<div class="paragraph">
+<p>Then we should see the following when running the script:</p>
+</div>
+<div class="paragraph">
+<p><span class="image"><img src="img/groovyconsole_showing_visutalization.png" 
alt="natural language processing in the groovyconsole with 
visualization"></span></p>
+</div>
+<div class="paragraph">
+<p>The visualization is purely optional but adds a nice touch. If using Groovy 
in
+notebook environments like Jupyter/BeakerX, there might be visualization tools
+in those environments too.</p>
+</div>
+<div class="paragraph">
+<p>Let&#8217;s look at a larger example using the <a 
href="https://haifengl.github.io/";>Smile</a> library.</p>
+</div>
+<div class="paragraph">
+<p>First, the sentences that we&#8217;ll examine:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def sentences = [
+    'Paul has two sisters, Maree and Christine.',
+    'No wise fish would go anywhere without a porpoise',
+    'His bark was much worse than his bite',
+    'Turn on the lights to the main bedroom',
+    "Light 'em all up",
+    'Make it dark downstairs'
+]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A couple of those sentences might seem a little strange, but they are 
selected
+to show off quite a few of the different POS tags.</p>
+</div>
+<div class="paragraph">
+<p>Smile has a tokenizer class which splits a sentence into words. It handles 
numerous
+cases like contractions and abbreviations ("e.g.", "'tis", "won&#8217;t").
+Smile also has a POS class based on the hidden Markov model and a built-in
+model is used for that class. Here is our code using those classes:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def tokenizer = 
new SimpleTokenizer(true)
+sentences.each {
+    def tokens = Arrays.stream(tokenizer.split(it)).toArray(String[]::new)
+    def tags = HMMPOSTagger.default.tag(tokens)*.toString()
+    println tokens.indices.collect{tags[it] == tokens[it] ? tags[it] : 
"${tags[it]}(${tokens[it]})" }.join(' ')
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We run the tokenizer for each sentence. Each token is then displayed 
directly
+or with its tag if it has one.</p>
+</div>
+<div class="paragraph">
+<p>Running the script gives this visualization:</p>
+</div>
+<table style="background-color: white; margin: 5px; border: 1px solid 
gray"><tbody><tr><td style="padding: 5px;">
+ <table><tbody><tr><td style="padding: 5px; text-align: center; "><div 
style="padding: 5px; background-color:#0088FF;">
+ <span style="background-color:white; color:#0088FF;">Paul</span><br>
+ <span style="color:white;">NNP</span></div></td><td style="padding: 5px; 
text-align: center;"><div style="padding: 5px; background-color:#2B5F19;">
+ <span style="background-color:white; color:#2B5F19;">has</span><br>
+ <span style="color:white;">VBZ</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#DF401C;">
+ <span style="background-color:white; color:#DF401C;">two</span><br>
+ <span style="color:white;">CD</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#A4772B;">
+ <span style="background-color:white; color:#A4772B;">sisters</span><br>
+ <span style="color:white;">NNS</span></div></td><td style="text-align: 
center; padding: 5px;">, </td><td style="padding: 5px;"><div style="padding: 
5px; background-color:#0088FF;">
+ <span style="background-color:white; color:#0088FF;">Maree</span><br>
+ <span style="color:white;">NNP</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#C54AA8;">
+ <span style="background-color:white; color:#C54AA8;">and</span><br>
+ <span style="color:white;">CC</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#0088FF;">
+ <span style="background-color:white; color:#0088FF;">Christine</span><br>
+ <span style="color:white;">NNP</span></div></td><td style="text-align: 
center; padding: 5px;">.</td></tr></tbody></table>
+<table><tbody><tr><td style="text-align: center; padding: 5px;"><div 
style="padding: 5px; background-color:#895C9F;">
+ <span style="background-color:white; color:#895C9F;">No</span><br>
+ <span style="color:white;">DT</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#5B6AA4;">
+ <span style="background-color:white; color:#5B6AA4;">wise</span><br>
+ <span style="color:white;">JJ</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#5B6633;">
+ <span style="background-color:white; color:#5B6633;">fish</span><br>
+ <span style="color:white;">NN</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#FC5F00;">
+ <span style="background-color:white; color:#FC5F00;">would</span><br>
+ <span style="color:white;">MD</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#561B06;">
+ <span style="background-color:white; color:#561B06;">go</span><br>
+ <span style="color:white;">VB</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#32CD32;">
+ <span style="background-color:white; color:#32CD32;">anywhere</span><br>
+ <span style="color:white;">RB</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#0000CD;">
+ <span style="background-color:white; color:#0000CD;">without</span><br>
+ <span style="color:white;">IN</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#895C9F;">
+ <span style="background-color:white; color:#895C9F;">a</span><br>
+ <span style="color:white;">DT</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#5B6633;">
+ <span style="background-color:white; color:#5B6633;">porpoise</span><br>
+ <span style="color:white;">NN</span></div></td><td style="text-align: center; 
padding: 5px;"></td></tr></tbody></table>
+<table><tbody><tr><td style="text-align: center; padding: 5px;"><div 
style="padding: 5px; background-color:#CD853F;">
+ <span style="background-color:white; color:#CD853F;">His</span><br>
+ <span style="color:white;">PRP$</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#5B6633;">
+ <span style="background-color:white; color:#5B6633;">bark</span><br>
+ <span style="color:white;">NN</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#8B4513;">
+ <span style="background-color:white; color:#8B4513;">was</span><br>
+ <span style="color:white;">VBD</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#32CD32;">
+ <span style="background-color:white; color:#32CD32;">much</span><br>
+ <span style="color:white;">RB</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#57411B;">
+ <span style="background-color:white; color:#57411B;">worse</span><br>
+ <span style="color:white;">JJR</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#0000CD;">
+ <span style="background-color:white; color:#0000CD;">than</span><br>
+ <span style="color:white;">IN</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#CD853F;">
+ <span style="background-color:white; color:#CD853F;">his</span><br>
+ <span style="color:white;">PRP$</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#5B6633;">
+ <span style="background-color:white; color:#5B6633;">bite</span><br>
+ <span style="color:white;">NN</span></div></td><td style="text-align: center; 
padding: 5px;"></td></tr></tbody></table>
+<table><tbody><tr><td style="text-align: center; padding: 5px;"><div 
style="padding: 5px; background-color:#561B06;">
+ <span style="background-color:white; color:#561B06;">Turn</span><br>
+ <span style="color:white;">VB</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#0000CD;">
+ <span style="background-color:white; color:#0000CD;">on</span><br>
+ <span style="color:white;">IN</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#895C9F;">
+ <span style="background-color:white; color:#895C9F;">the</span><br>
+ <span style="color:white;">DT</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#A4772B;">
+ <span style="background-color:white; color:#A4772B;">lights</span><br>
+ <span style="color:white;">NNS</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#0088FF;">
+ <span style="background-color:white; color:#0088FF;">to</span><br>
+ <span style="color:white;">TO</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#895C9F;">
+ <span style="background-color:white; color:#895C9F;">the</span><br>
+ <span style="color:white;">DT</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#5B6AA4;">
+ <span style="background-color:white; color:#5B6AA4;">main</span><br>
+ <span style="color:white;">JJ</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#5B6633;">
+ <span style="background-color:white; color:#5B6633;">bedroom</span><br>
+ <span style="color:white;">NN</span></div></td><td style="text-align: center; 
padding: 5px;"></td></tr></tbody></table>
+<table><tbody><tr><td style="text-align: center; padding: 5px;"><div 
style="padding: 5px; background-color:#0088FF;">
+ <span style="background-color:white; color:#0088FF;">Light</span><br>
+ <span style="color:white;">NNP</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#2B5F19;">
+ <span style="background-color:white; color:#2B5F19;">'em</span><br>
+ <span style="color:white;">PRP</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#32CD32;">
+ <span style="background-color:white; color:#32CD32;">all</span><br>
+ <span style="color:white;">RB</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#32CD32;">
+ <span style="background-color:white; color:#32CD32;">up</span><br>
+ <span style="color:white;">RB</span></div></td><td style="text-align: center; 
padding: 5px;"></td></tr></tbody></table>
+<table><tbody><tr><td style="text-align: center; padding: 5px;"><div 
style="padding: 5px; background-color:#561B06;">
+ <span style="background-color:white; color:#561B06;">Make</span><br>
+ <span style="color:white;">VB</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#2B5F19;">
+ <span style="background-color:white; color:#2B5F19;">it</span><br>
+ <span style="color:white;">PRP</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#5B6AA4;">
+ <span style="background-color:white; color:#5B6AA4;">dark</span><br>
+ <span style="color:white;">JJ</span></div></td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#5B6633;">
+ <span style="background-color:white; color:#5B6633;">downstairs</span><br>
+ <span style="color:white;">NN</span></div></td><td style="text-align: center; 
padding: 5px;"></td></tr></tbody></table>
+ </td></tr></tbody></table>
+<div class="paragraph">
+<p>[Note: the scripts in the repo just print to stdout which is perfect when 
using the
+command-line or IDEs. The visualization in the GoovyConsole kicks in only for 
the
+actual result. So, if you are following along at home and wanting to use the
+GroovyConsole, you&#8217;d change the <code>each</code> to 
<code>collect</code> and remove the <code>println</code>,
+and you should be good for visualization.]</p>
+</div>
+<div class="paragraph">
+<p>The OpenNLP code is very similar:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def tokenizer = 
SimpleTokenizer.INSTANCE
+sentences.each {
+    String[] tokens = tokenizer.tokenize(it)
+    def posTagger = new POSTaggerME('en')
+    String[] tags = posTagger.tag(tokens)
+    println tokens.indices.collect{tags[it] == tokens[it] ? tags[it] : 
"${tags[it]}(${tokens[it]})" }.join(' ')
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>OpenNLP allows you to supply your own POS model but downloads a default
+one if none is specified.</p>
+</div>
+<div class="paragraph">
+<p>When the script is run, it has this visualization:</p>
+</div>
+<table style="background-color: white; margin:5px; border: 1px solid 
gray;"><tbody><tr><td style="padding: 5px;">
+ <table><tbody><tr><td style="text-align: center; padding: 5px;"><div 
style="padding: 5px; background-color:#0088FF;">
+ <span style="background-color:white; color:#0088FF;">Paul</span><br>
+ <span style="color:white;">PROPN</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#2B5F19;">
+ <span style="background-color:white; color:#2B5F19;">has</span><br>
+ <span style="color:white;">VERB</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#DF401C;">
+ <span style="background-color:white; color:#DF401C;">two</span><br>
+ <span style="color:white;">NUM</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#A4772B;">
+ <span style="background-color:white; color:#A4772B;">sisters</span><br>
+ <span style="color:white;">NOUN</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#C54AA8;">
+ <span style="background-color:white; color:#C54AA8;">,</span><br>
+ <span style="color:white;">PUNCT</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#0088FF;">
+ <span style="background-color:white; color:#0088FF;">Maree</span><br>
+ <span style="color:white;">PROPN</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#895C9F;">
+ <span style="background-color:white; color:#895C9F;">and</span><br>
+ <span style="color:white;">CCONJ</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#0088FF;">
+ <span style="background-color:white; color:#0088FF;">Christine</span><br>
+ <span style="color:white;">PROPN</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#C54AA8;">
+ <span style="background-color:white; color:#C54AA8;">.</span><br>
+ <span style="color:white;">PUNCT</span></div></td><td style="text-align: 
center; padding: 5px;"></td></tr></tbody></table>
+<table><tbody><tr><td style="text-align: center; padding: 5px;"><div 
style="padding: 5px; background-color:#5B6AA4;">
+ <span style="background-color:white; color:#5B6AA4;">No</span><br>
+ <span style="color:white;">DET</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#5B6633;">
+ <span style="background-color:white; color:#5B6633;">wise</span><br>
+ <span style="color:white;">ADJ</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#A4772B;">
+ <span style="background-color:white; color:#A4772B;">fish</span><br>
+ <span style="color:white;">NOUN</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#FC5F00;">
+ <span style="background-color:white; color:#FC5F00;">would</span><br>
+ <span style="color:white;">AUX</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#2B5F19;">
+ <span style="background-color:white; color:#2B5F19;">go</span><br>
+ <span style="color:white;">VERB</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#561B06;">
+ <span style="background-color:white; color:#561B06;">anywhere</span><br>
+ <span style="color:white;">ADV</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#32CD32;">
+ <span style="background-color:white; color:#32CD32;">without</span><br>
+ <span style="color:white;">ADP</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#5B6AA4;">
+ <span style="background-color:white; color:#5B6AA4;">a</span><br>
+ <span style="color:white;">DET</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#A4772B;">
+ <span style="background-color:white; color:#A4772B;">porpoise</span><br>
+ <span style="color:white;">NOUN</span></div></td><td style="text-align: 
center; padding: 5px;"></td></tr></tbody></table>
+<table><tbody><tr><td style="text-align: center; padding: 5px;"><div 
style="padding: 5px; background-color:#0000CD;">
+ <span style="background-color:white; color:#0000CD;">His</span><br>
+ <span style="color:white;">PRON</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#A4772B;">
+ <span style="background-color:white; color:#A4772B;">bark</span><br>
+ <span style="color:white;">NOUN</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#FC5F00;">
+ <span style="background-color:white; color:#FC5F00;">was</span><br>
+ <span style="color:white;">AUX</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#561B06;">
+ <span style="background-color:white; color:#561B06;">much</span><br>
+ <span style="color:white;">ADV</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#5B6633;">
+ <span style="background-color:white; color:#5B6633;">worse</span><br>
+ <span style="color:white;">ADJ</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#32CD32;">
+ <span style="background-color:white; color:#32CD32;">than</span><br>
+ <span style="color:white;">ADP</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#0000CD;">
+ <span style="background-color:white; color:#0000CD;">his</span><br>
+ <span style="color:white;">PRON</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#A4772B;">
+ <span style="background-color:white; color:#A4772B;">bite</span><br>
+ <span style="color:white;">NOUN</span></div></td><td style="text-align: 
center; padding: 5px;"></td></tr></tbody></table>
+<table><tbody><tr><td style="text-align: center; padding: 5px;"><div 
style="padding: 5px; background-color:#2B5F19;">
+ <span style="background-color:white; color:#2B5F19;">Turn</span><br>
+ <span style="color:white;">VERB</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#32CD32;">
+ <span style="background-color:white; color:#32CD32;">on</span><br>
+ <span style="color:white;">ADP</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#5B6AA4;">
+ <span style="background-color:white; color:#5B6AA4;">the</span><br>
+ <span style="color:white;">DET</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#A4772B;">
+ <span style="background-color:white; color:#A4772B;">lights</span><br>
+ <span style="color:white;">NOUN</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#32CD32;">
+ <span style="background-color:white; color:#32CD32;">to</span><br>
+ <span style="color:white;">ADP</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#5B6AA4;">
+ <span style="background-color:white; color:#5B6AA4;">the</span><br>
+ <span style="color:white;">DET</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#5B6633;">
+ <span style="background-color:white; color:#5B6633;">main</span><br>
+ <span style="color:white;">ADJ</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#A4772B;">
+ <span style="background-color:white; color:#A4772B;">bedroom</span><br>
+ <span style="color:white;">NOUN</span></div></td><td style="text-align: 
center; padding: 5px;"></td></tr></tbody></table>
+<table><tbody><tr><td style="text-align: center; padding: 5px;"><div 
style="padding: 5px; background-color:#A4772B;">
+ <span style="background-color:white; color:#A4772B;">Light</span><br>
+ <span style="color:white;">NOUN</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#C54AA8;">
+ <span style="background-color:white; color:#C54AA8;">'</span><br>
+ <span style="color:white;">PUNCT</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#A4772B;">
+ <span style="background-color:white; color:#A4772B;">em</span><br>
+ <span style="color:white;">NOUN</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#561B06;">
+ <span style="background-color:white; color:#561B06;">all</span><br>
+ <span style="color:white;">ADV</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#32CD32;">
+ <span style="background-color:white; color:#32CD32;">up</span><br>
+ <span style="color:white;">ADP</span></div></td><td style="text-align: 
center; padding: 5px;"></td></tr></tbody></table>
+<table><tbody><tr><td style="padding: 5px;"><div style="padding: 5px; 
background-color:#2B5F19;">
+ <span style="background-color:white; color:#2B5F19;">Make</span><br>
+ <span style="color:white;">VERB</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#0000CD;">
+ <span style="background-color:white; color:#0000CD;">it</span><br>
+ <span style="color:white;">PRON</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#5B6633;">
+ <span style="background-color:white; color:#5B6633;">dark</span><br>
+ <span style="color:white;">ADJ</span></div></td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#A4772B;">
+ <span style="background-color:white; color:#A4772B;">downstairs</span><br>
+ <span style="color:white;">NOUN</span></div></td><td style="text-align: 
center; padding: 5px;"></td></tr></tbody></table>
+ </td></tr></tbody></table>
+<div class="paragraph">
+<p>The observant reader may have noticed some slight differences in the tags 
used in
+this library. They are essentially the same but using slightly different names.
+This is something to be aware of when swapping between POS libraries or models.
+Make sure you look up the documentation for the library/model you are using to
+understand the available tag types.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_entity_detection">Entity Detection</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Named entity recognition (NER), seeks to identity and classify named 
entities in text.
+Categories of interest might be persons, organizations, locations dates, etc.
+It is another technology used in many fields of NLP.</p>
+</div>
+<div class="paragraph">
+<p>We&#8217;ll start with our sentences to analyse:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">String[] sentences 
= [
+    "A commit by Daniel Sun on December 6, 2020 improved Groovy 4's language 
integrated query.",
+    "A commit by Daniel on Sun., December 6, 2020 improved Groovy 4's language 
integrated query.",
+    'The Groovy in Action book by Dierk Koenig et. al. is a bargain at $50, or 
indeed any price.',
+    'The conference wrapped up yesterday at 5:30 p.m. in Copenhagen, Denmark.',
+    'I saw Ms. May Smith waving to June Jones.',
+    'The parcel was passed from May to June.',
+    'The Mona Lisa by Leonardo da Vinci has been on display in the Louvre, 
Paris since 1797.'
+]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We&#8217;ll use some well-known models, we&#8217;ll focus on the 
<em>person</em>, <em>money</em>, <em>date</em>, <em>time</em>, and 
<em>location</em> models:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def base = 
'http://opennlp.sourceforge.net/models-1.5'
+def modelNames = ['person', 'money', 'date', 'time', 'location']
+def finders = modelNames.collect { model -&gt;
+    new NameFinderME(DownloadUtil.downloadModel(new 
URL("$base/en-ner-${model}.bin"), TokenNameFinderModel))
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We&#8217;ll now tokenize our sentences:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def tokenizer = 
SimpleTokenizer.INSTANCE
+sentences.each { sentence -&gt;
+    String[] tokens = tokenizer.tokenize(sentence)
+    Span[] tokenSpans = tokenizer.tokenizePos(sentence)
+    def entityText = [:]
+    def entityPos = [:]
+    finders.indices.each {fi -&gt;
+        // could be made smarter by looking at probabilities and overlapping 
spans
+        Span[] spans = finders[fi].find(tokens)
+        spans.each{span -&gt;
+            def se = span.start..&lt;span.end
+            def pos = (tokenSpans[se.from].start)..&lt;(tokenSpans[se.to].end)
+            entityPos[span.start] = pos
+            entityText[span.start] = "$span.type(${sentence[pos]})"
+        }
+    }
+    entityPos.keySet().sort().reverseEach {
+        def pos = entityPos[it]
+        def (from, to) = [pos.from, pos.to + 1]
+        sentence = sentence[0..&lt;from] + entityText[it] + sentence[to..-1]
+    }
+    println sentence
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>And when visualized, shows this:</p>
+</div>
+<table style="border:1px solid grey; margin:5px; 
background-color:white"><tbody><tr><td>
+ <table style="margin:5px;"><tbody><tr><td style="padding:5px;">A commit by 
</td><td style="text-align:center;"><div style="padding:5px; 
background-color:#0088FF;">
+ <span style="background-color:white; color:#0088FF;">Daniel Sun</span><br>
+ <span style="color:white;">person</span></div></td><td style="text-align: 
center; padding:5px;">on </td><td style="text-align:center;"><div 
style="padding:5px; background-color:#2B5F19;">
+ <span style="background-color:white; color:#2B5F19;">December 6, 
2020</span><br>
+ <span style="color:white;">date</span></div></td><td style="text-align: 
center; padding:5px;">improved Groovy 4's language integrated 
query.</td></tr></tbody></table>
+<table style="margin:5px;"><tbody><tr><td style="text-align: center; 
padding:5px;">A commit by </td><td style="text-align: center;"><div 
style="padding:5px; background-color:#0088FF;">
+ <span style="background-color:white; color:#0088FF;">Daniel</span><br>
+ <span style="color:white;">person</span></div></td><td 
style="text-align:center; padding:5px;">on Sun., </td><td 
style="text-align:center;"><div style="padding: 5px; background-color:#2B5F19;">
+ <span style="background-color:white; color:#2B5F19;">December 6, 
2020</span><br>
+ <span style="color:white;">date</span></div></td><td style="text-align: 
center; padding:5px;">improved Groovy 4's language integrated 
query.</td></tr></tbody></table>
+<table style="margin:5px;"><tbody><tr><td style="text-align: center; 
padding:5px;">The Groovy in Action book by </td><td style="text-align: 
center;"><div style="padding:5px; background-color:#0088FF;">
+ <span style="background-color:white; color:#0088FF;">Dierk Koenig</span><br>
+ <span style="color:white;">person</span></div></td><td style="text-align: 
center; padding:5px;">et. al. is a bargain at </td><td 
style="text-align:center;"><div style="padding:5px; background-color:#DF401C;">
+ <span style="background-color:white; color:#DF401C;">$50</span><br>
+ <span style="color:white;">money</span></div></td><td style="text-align: 
center; padding:5px;">, or indeed any price.</td></tr></tbody></table>
+<table style="margin:5px;"><tbody><tr><td style="text-align: center; 
padding:5px;">The conference wrapped up </td><td style="text-align: 
center;"><div style="padding: 5px; background-color:#2B5F19;">
+ <span style="background-color:white; color:#2B5F19;">yesterday</span><br>
+ <span style="color:white;">date</span></div></td><td style="text-align: 
center; padding:5px;">at </td><td style="text-align:center;"><div 
style="padding:5px; background-color:#A4772B;">
+ <span style="background-color:white; color:#A4772B;">5:30 p.m.</span><br>
+ <span style="color:white;">time</span></div></td><td style="text-align: 
center; padding:5px;">in </td><td style="text-align: center;"><div 
style="padding:5px; background-color:#C54AA8;">
+ <span style="background-color:white; color:#C54AA8;">Copenhagen</span><br>
+ <span style="color:white;">location</span></div></td><td 
style="padding:5px;">, </td><td style="text-align:center;"><div style="padding: 
5px; background-color:#C54AA8;">
+ <span style="background-color:white; color:#C54AA8;">Denmark</span><br>
+ <span style="color:white;">location</span></div></td><td 
style="padding:5px;">.</td></tr></tbody></table>
+<table style="margin:5px;"><tbody><tr><td style="padding:5px;">I saw Ms. 
</td><td style="text-align:center;"><div style="padding: 5px; 
background-color:#0088FF;">
+ <span style="background-color:white; color:#0088FF;">May Smith</span><br>
+ <span style="color:white;">person</span></div></td><td style="text-align: 
center; padding:5px;">waving to </td><td style="text-align:center;"><div 
style="padding:5px; background-color:#0088FF;">
+ <span style="background-color:white; color:#0088FF;">June Jones</span><br>
+ <span style="color:white;">person</span></div></td><td style="text-align: 
center; padding:5px;">.</td></tr></tbody></table>
+<table style="margin:5px;"><tbody><tr><td style="padding:5px;">The parcel was 
passed from </td><td style="text-align:center;"><div style="padding: 5px; 
background-color:#2B5F19;">
+ <span style="background-color:white; color:#2B5F19;">May to June</span><br>
+ <span style="color:white;">date</span></div></td><td 
style="padding:5px;">.</td></tr></tbody></table>
+<table style="margin:5px;"><tbody><tr><td style="padding:5px;">The Mona Lisa 
by </td><td style="text-align:center;"><div style="padding: 5px; 
background-color:#0088FF;">
+ <span style="background-color:white; color:#0088FF;">Leonardo da 
Vinci</span><br>
+ <span style="color:white;">person</span></div></td><td 
style="padding:5px;">has been on display in the Louvre, </td><td 
style="text-align:center;"><div style="padding:5px; background-color:#C54AA8;">
+ <span style="background-color:white; color:#C54AA8;">Paris</span><br>
+ <span style="color:white;">location</span></div></td><td 
style="text-align:center; padding:5px;"><div style="padding: 5px; 
background-color:#2B5F19;">
+ <span style="background-color:white; color:#2B5F19;">since 1797</span><br>
+ <span 
style="color:white;">date</span></div></td><td>.</td></tr></tbody></table>
+ </td></tr></tbody></table>
+<div class="paragraph">
+<p>We can see here that most examples have been categorized as we might expect.
+We&#8217;d have to improve our model for it to do a better job on the <em>"May 
to June"</em>
+example.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_scaling_entity_detection">Scaling Entity Detection</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>We can also run our named entity detection algorithms on platforms like
+<a href="http://nlp.johnsnowlabs.com/";>Spark NLP</a> which adds NLP 
functionality to
+<a href="https://spark.apache.org/";>Apache Spark</a>. We&#8217;ll use
+<a 
href="https://nlp.johnsnowlabs.com/2020/01/22/glove_100d.html";>glove_100d</a>
+embeddings and the
+<a 
href="https://nlp.johnsnowlabs.com/2020/02/03/onto_100_en.html";>onto_100</a> 
NER model.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">var assembler = 
new DocumentAssembler(inputCol: 'text', outputCol: 'document', cleanupMode: 
'disabled')
+
+var tokenizer = new Tokenizer(inputCols: ['document'] as String[], outputCol: 
'token')
+
+var embeddings = WordEmbeddingsModel.pretrained('glove_100d').tap {
+    inputCols = ['document', 'token'] as String[]
+    outputCol = 'embeddings'
+}
+
+var model = NerDLModel.pretrained('onto_100', 'en').tap {
+    inputCols = ['document', 'token', 'embeddings'] as String[]
+    outputCol ='ner'
+}
+
+var converter = new NerConverter(inputCols: ['document', 'token', 'ner'] as 
String[], outputCol: 'ner_chunk')
+
+var pipeline = new Pipeline(stages: [assembler, tokenizer, embeddings, model, 
converter] as PipelineStage[])
+
+var spark = SparkNLP.start(false, false, '16G', '', '', '')
+
+var text = [
+    "The Mona Lisa is a 16th century oil painting created by Leonardo. It's 
held at the Louvre in Paris."
+]
+var data = spark.createDataset(text, Encoders.STRING()).toDF('text')
+
+var pipelineModel = pipeline.fit(data)
+
+var transformed = pipelineModel.transform(data)
+transformed.show()
+
+use(SparkCategory) {
+    transformed.collectAsList().each { row -&gt;
+        def res =  row.text
+        def chunks = row.ner_chunk.reverseIterator()
+        while (chunks.hasNext()) {
+            def chunk = chunks.next()
+            int begin = chunk.begin
+            int end = chunk.end
+            def entity = chunk.metadata.get('entity').get()
+            res = res[0..&lt;begin] + "$entity($chunk.result)" + 
res[end&lt;..-1]
+        }
+        println res
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We won&#8217;t go into all of the details here. In summary, the code sets 
up a pipeline
+that transforms our input sentences, via a series of steps, into chunks, where
+each chunk corresponds to a detected entity. Each chunk has a start and ending
+position, and an associated tag type.</p>
+</div>
+<div class="paragraph">
+<p>This may not seem like it is much different to our earlier examples, but if 
we had
+large volumes of data, and we were running in a large cluster, the work could 
be
+spread across worker nodes within the cluster.</p>
+</div>
+<div class="paragraph">
+<p>Here we have used a utility <code>SparkCategory</code> class which makes 
accessing the
+information in Spark <code>Row</code> instances a little nicer in terms of 
Groovy shorthand
+syntax. We can use <code>row.text</code> instead of 
<code>row.get(row.fieldIndex('text'))</code>.
+Here is the code for this utility class:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">class 
SparkCategory {
+    static get(Row r, String field) { r.get(r.fieldIndex(field)) }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If doing more than this simple example, the use of 
<code>SparkCategory</code> could
+be made implicit through various standard Groovy techniques.</p>
+</div>
+<div class="paragraph">
+<p>When we run our script, we see the following output:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>22/08/07 12:31:39 INFO SparkContext: Running Spark version 3.3.0
+...
+glove_100d download started this may take some time.
+Approximate size to download 145.3 MB
+...
+onto_100 download started this may take some time.
+Approximate size to download 13.5 MB
+...
++--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
+|                text|            document|               token|          
embeddings|                 ner|           ner_chunk|
++--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
+|The Mona Lisa is ...|[{document, 0, 98...|[{token, 0, 2, 
Th...|[{word_embeddings...|[{named_entity, 0...|[{chunk, 0, 12, T...|
++--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
+PERSON(The Mona Lisa) is a DATE(16th century) oil painting created by 
PERSON(Leonardo). It's held at the FAC(Louvre) in GPE(Paris).</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The result has the following visualization:</p>
+</div>
+<table style="border:1px solid grey; margin:5px; 
background-color:white;"><tbody><tr><td style="text-align: center; padding: 
5px;">
+ <table style="margin:5px;"><tbody><tr><td style="text-align: center; padding: 
5px;"><div style="padding: 5px; background-color:#0088FF;">
+ <span style="background-color:white; color:#0088FF;">The Mona Lisa</span><br>
+ <span style="color:white;">PERSON</span></div></td><td style="text-align: 
center; padding: 5px;">is a </td><td style="text-align: center; padding: 
5px;"><div style="padding: 5px; background-color:#2B5F19;">
+ <span style="background-color:white; color:#2B5F19;">16th century</span><br>
+ <span style="color:white;">DATE</span></div></td><td style="text-align: 
center; padding: 5px;">oil painting created by </td><td style="text-align: 
center; padding: 5px;"><div style="padding: 5px; background-color:#0088FF;">
+ <span style="background-color:white; color:#0088FF;">Leonardo</span><br>
+ <span style="color:white;">PERSON</span></div></td><td style="text-align: 
center; padding: 5px;">. It's held at the </td><td style="text-align: center; 
padding: 5px;"><div style="padding: 5px; background-color:#DF401C;">
+ <span style="background-color:white; color:#DF401C;">Louvre</span><br>
+ <span style="color:white;">FAC</span></div></td><td style="text-align: 
center; padding: 5px;">in </td><td style="text-align: center; padding: 
5px;"><div style="padding: 5px; background-color:#A4772B;">
+ <span style="background-color:white; color:#A4772B;">Paris</span><br>
+ <span style="color:white;">GPE</span></div></td><td style="text-align: 
center; padding: 5px;">.</td></tr></tbody></table>
+ </td></tr></tbody></table>
+<div class="paragraph">
+<p>Here FAC is facility (buildings, airports, highways, bridges, etc.) and
+GPE is Geo-Political Entity (countries, cities, states, etc.).</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_sentence_detection">Sentence Detection</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Detecting sentences in text might seem a simple concept at first
+but there are numerous special cases.</p>
+</div>
+<div class="paragraph">
+<p>Consider the following text:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def text = '''
+The most referenced scientific paper of all time is "Protein measurement with 
the
+Folin phenol reagent" by Lowry, O. H., Rosebrough, N. J., Farr, A. L. &amp; 
Randall,
+R. J. and was published in the J. BioChem. in 1951. It describes a method for
+measuring the amount of protein (even as small as 0.2 γ, were γ is the specific
+weight) in solutions and has been cited over 300,000 times and can be found 
here:
+https://www.jbc.org/content/193/1/265.full.pdf. Dr. Lowry completed
+two doctoral degrees under an M.D.-Ph.D. program from the University of Chicago
+before moving to Harvard under A. Baird Hastings. He was also the H.O.D of
+Pharmacology at Washington University in St. Louis for 29 years.
+'''</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>There are full stops at the end of each sentence (though in general, it 
could
+also be other punctuation like exclamation marks and question marks). There are
+also full stops and decimal points in abbreviations, URLs, decimal numbers and
+so forth. Sentence detection algorithms might have some special hard-coded 
cases,
+like "Dr.", "Ms.", or in an emoticon, and may also use some heuristics.
+In general, they might also be trained with examples like above.</p>
+</div>
+<div class="paragraph">
+<p>Here is some code for OpenNLP for detecting sentences in the above:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def helper = new 
ResourceHelper('http://opennlp.sourceforge.net/models-1.5')
+def model = new SentenceModel(helper.load('en-sent'))
+def detector = new SentenceDetectorME(model)
+def sentences = detector.sentDetect(text)
+assert text.count('.') == 28
+assert sentences.size() == 4
+println "Found ${sentences.size()} sentences:\n" + 
sentences.join('\n\n')</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>It has the following output:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre><span class="maroon">Downloading en-sent</span>
+Found 4 sentences:
+The most referenced scientific paper of all time is "Protein measurement with 
the
+Folin phenol reagent" by Lowry, O. H., Rosebrough, N. J., Farr, A. L. &amp; 
Randall,
+R. J. and was published in the J. BioChem. in 1951.
+
+It describes a method for
+measuring the amount of protein (even as small as 0.2 γ, were γ is the specific
+weight) in solutions and has been cited over 300,000 times and can be found 
here:
+https://www.jbc.org/content/193/1/265.full.pdf.
+
+Dr. Lowry completed
+two doctoral degrees under an M.D.-Ph.D. program from the University of Chicago
+before moving to Harvard under A. Baird Hastings.
+
+He was also the H.O.D of
+Pharmacology at Washington University in St. Louis for 29 years.</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We can see here, it handled all of the tricky cases in the example.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_relationship_extraction_with_triples">Relationship Extraction with 
Triples</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The next step after detecting named entities and the various parts of speech
+of certain words is to explore relationships between them. This is often done
+in the form of <em>subject-predicate-object</em> triplets. In our earlier NER 
example,
+for the sentence <em>"The conference wrapped up yesterday at 5:30 p.m. in 
Copenhagen, Denmark."</em>, we found various date, time and location named 
entities.</p>
+</div>
+<div class="paragraph">
+<p>We can extract triples using the <a 
href="https://github.com/uma-pi1/minie";>MinIE library</a>
+(which in turns uses the Standford CoreNLP library) with the following 
code:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def parser = 
CoreNLPUtils.StanfordDepNNParser()
+sentences.each { sentence -&gt;
+    def minie = new MinIE(sentence, parser, MinIE.Mode.SAFE)
+
+    println "\nInput sentence: $sentence"
+    println '============================='
+    println 'Extractions:'
+    for (ap in minie.propositions) {
+        println "\tTriple: $ap.tripleAsString"
+        def attr = ap.attribution.attributionPhrase ? 
ap.attribution.toStringCompact() : 'NONE'
+        println "\tFactuality: $ap.factualityAsString\tAttribution: $attr"
+        println '\t----------'
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The output for the previously mentioned sentence is shown below:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>Input sentence: The conference wrapped up yesterday at 5:30 p.m. in 
Copenhagen, Denmark.
+=============================
+Extractions:
+        Triple: "conference"    "wrapped up yesterday at"       "5:30 p.m."
+        Factuality: (+,CT)      Attribution: NONE
+        ----------
+        Triple: "conference"    "wrapped up yesterday in"       "Copenhagen"
+        Factuality: (+,CT)      Attribution: NONE
+        ----------
+        Triple: "conference"    "wrapped up"    "yesterday"
+        Factuality: (+,CT)      Attribution: NONE</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We can now piece together the relationships between the earlier entities we 
detected.</p>
+</div>
+<div class="paragraph">
+<p>There was also a problematic case amongst the earlier NER examples,
+<em>"The parcel was passed from May to June."</em>.
+Using the previous model, detected <em>"May to June"</em> as a <em>date</em>.
+Let&#8217;s explore that using CoreNLP&#8217;s triple extraction directly.
+We won&#8217;t show the source code here but CoreNLP supports
+<a 
href="https://github.com/paulk-asert/groovy-data-science/blob/master/subprojects/LanguageProcessing/src/main/groovy/DetectTriplesPOS_CoreNLP.groovy";>simple</a>
 and
+<a 
href="https://github.com/paulk-asert/groovy-data-science/blob/master/subprojects/LanguageProcessing/src/main/groovy/DetectTriplesAnnotation_CoreNLP.groovy";>more
 powerful</a>
+approaches to solving this problem. The output for the sentence in
+question using the more powerful technique is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>Sentence #7: The parcel was passed from May to June.
+root(ROOT-0, passed-4)
+det(parcel-2, The-1)
+nsubj:pass(passed-4, parcel-2)
+aux:pass(passed-4, was-3)
+case(May-6, from-5)
+obl:from(passed-4, May-6)
+case(June-8, to-7)
+obl:to(passed-4, June-8)
+punct(passed-4, .-9)
+
+Triples:
+1.0 parcel was passed
+1.0 parcel was passed to June
+1.0 parcel was passed from May to June
+1.0 parcel was passed from May</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We can see that this has done a better job of piecing together what 
entities we have and their relationships.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_sentiment_analysis">Sentiment Analysis</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Sentiment analysis is a NLP technique used to determine whether data is 
positive,
+negative, or neutral. Standford CoreNLP has default models it uses for this 
purpose:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def doc = new 
Document('''
+StanfordNLP is fantastic!
+Groovy is great fun!
+Math can be hard!
+''')
+for (sent in doc.sentences()) {
+    println "${sent.toString().padRight(40)} ${sent.sentiment()}"
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Which has the following output:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre><span class="maroon">[main] INFO 
edu.stanford.nlp.parser.common.ParserGrammar - Loading parser from serialized 
file edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz ... done [0.6 sec].
+[main] INFO edu.stanford.nlp.sentiment.SentimentModel - Loading sentiment 
model edu/stanford/nlp/models/sentiment/sentiment.ser.gz ... done [0.1 
sec].</span>
+StanfordNLP is fantastic!                POSITIVE
+Groovy is great fun!                     VERY_POSITIVE
+Math can be hard!                        NEUTRAL</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We can also train our own. Let&#8217;s start with two datasets:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def datasets = [
+    positive: getClass().classLoader.getResource("rt-polarity.pos").toURI(),
+    negative: getClass().classLoader.getResource("rt-polarity.neg").toURI()
+]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We&#8217;ll first use Datumbox which, as we saw earlier,
+requires training parameters for our algorithm:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def trainingParams 
= new TextClassifier.TrainingParameters(
+    numericalScalerTrainingParameters: null,
+    featureSelectorTrainingParametersList: [new 
ChisquareSelect.TrainingParameters()],
+    textExtractorParameters: new NgramsExtractor.Parameters(),
+    modelerTrainingParameters: new MultinomialNaiveBayes.TrainingParameters()
+)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We now create our algorithm, train it with or training dataset,
+and for illustrative purposes validate against the training dataset:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def config = 
Configuration.configuration
+TextClassifier classifier = MLBuilder.create(trainingParams, config)
+classifier.fit(datasets)
+def metrics = classifier.validate(datasets)
+println "Classifier Accuracy (using training data): 
$metrics.accuracy"</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The output is shown here:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre><span class="maroon">[main] INFO 
com.datumbox.framework.core.common.dataobjects.Dataframe$Builder - Dataset 
Parsing positive class
+[main] INFO com.datumbox.framework.core.common.dataobjects.Dataframe$Builder - 
Dataset Parsing negative class
+...</span>
+Classifier Accuracy (using training data): 0.8275959103273615</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Now we can test our model against several sentences:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">['Datumbox is 
divine!', 'Groovy is great fun!', 'Math can be hard!'].each {
+    def r = classifier.predict(it)
+    def predicted = r.YPredicted
+    def probability = sprintf '%4.2f', r.YPredictedProbabilities.get(predicted)
+    println "Classifing: '$it',  Predicted: $predicted,  Probability: 
$probability"
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Which has this output:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre><span class="maroon">...
+[main] INFO com.datumbox.framework.applications.nlp.TextClassifier - predict()
+...</span>
+Classifing: 'Datumbox is divine!', Predicted: positive, Probability: 0.83
+Classifing: 'Groovy is great fun!', Predicted: positive, Probability: 0.80
+Classifing: 'Math can be hard!', Predicted: negative, Probability: 0.95</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We can do the same thing but with OpenNLP. First, we collect our input data.
+OpenNLP is expecting it in a single dataset with tagged examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def 
trainingCollection = datasets.collect { k, v -&gt;
+    new File(v).readLines().collect{"$k $it".toString() }
+}.sum()</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Now, we&#8217;ll train two models. One uses <em>naïve bayes</em>, the other 
<em>maxent</em>.
+We train up both variants.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def variants = [
+        Maxent    : new TrainingParameters(),
+        NaiveBayes: new TrainingParameters((CUTOFF_PARAM): '0', 
(ALGORITHM_PARAM): NAIVE_BAYES_VALUE)
+]
+def models = [:]
+variants.each{ key, trainingParams -&gt;
+    def trainingStream = new CollectionObjectStream(trainingCollection)
+    def sampleStream = new DocumentSampleStream(trainingStream)
+    println "\nTraining using $key"
+    models[key] = DocumentCategorizerME.train('en', sampleStream, 
trainingParams, new DoccatFactory())
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Now we run sentiment predictions on our sample sentences using both 
variants:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def w = 
sentences*.size().max()
+
+variants.each { key, params -&gt;
+    def categorizer = new DocumentCategorizerME(models[key])
+    println "\nAnalyzing using $key"
+    sentences.each {
+        def result = categorizer.categorize(it.split('[ !]'))
+        def category = categorizer.getBestCategory(result)
+        def prob = sprintf '%4.2f', result[categorizer.getIndex(category)]
+        println "${it.padRight(w)} $category ($prob)}"
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>When we run this we get:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>Training using Maxent …done.
+…
+
+Training using NaiveBayes …done.
+…
+
+Analyzing using Maxent
+OpenNLP is fantastic! positive (0.64)}
+Groovy is great fun! positive (0.74)}
+Math can be hard! negative (0.61)}
+
+Analyzing using NaiveBayes
+OpenNLP is fantastic! positive (0.72)}
+Groovy is great fun! positive (0.81)}
+Math can be hard! negative (0.72)}</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The models here appear to have lower probability levels compared to the 
model we
+trained for Datumbox. We could try tweaking the training parameters further if 
this
+was a problem. We&#8217;d probably also need a bigger testing set to convince 
ourselves
+of the relative merits of each model. Some models can be over-trained on small
+datasets and perform very well with data similar to their training datasets but
+perform much worse for other data.</p>
+</div>
+<div class="paragraph">
+<p>This example is inspired from the <a 
href="https://github.com/deepjavalibrary/djl/blob/master/examples/src/main/java/ai/djl/examples/inference/UniversalSentenceEncoder.java";>UniversalSentenceEncoder</a>
 example in the
+<a href="https://github.com/deepjavalibrary/djl/tree/master/examples";>DJL 
examples module</a>.
+It looks at using the universal sentence encoder model from
+<a 
href="https://github.com/paulk-asert/groovy-data-science/tree/master/subprojects";>TensorFlow
 Hub</a>
+via the <a href="https://djl.ai/";>DeepJavaLibrary</a> (DJL) api.</p>
+</div>
+<div class="paragraph">
+<p>First we define a translator. The <code>Translator</code> interface allow 
us to specify pre
+and post-processing functionality.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">class MyTranslator 
implements NoBatchifyTranslator&lt;String[], double[][]&gt; {
+    @Override
+    NDList processInput(TranslatorContext ctx, String[] raw) {
+        var factory = ctx.NDManager
+        var inputs = new NDList(raw.collect(factory::create))
+        new NDList(NDArrays.stack(inputs))
+    }
+
+    @Override
+    double[][] processOutput(TranslatorContext ctx, NDList list) {
+        long numOutputs = list.singletonOrThrow().shape.get(0)
+        NDList result = []
+        for (i in 0..&lt;numOutputs) {
+            result &lt;&lt; list.singletonOrThrow().get(i)
+        }
+        result*.toFloatArray() as double[][]
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, we manually pack our input sentences into the required n-dimensional 
data types,
+and extract our output calculations into a 2D double array.</p>
+</div>
+<div class="paragraph">
+<p>Next, we create our <code>predict</code> method by first defining the 
criteria for our prediction
+algorithm. We are going to use our translator, use the TensorFlow engine, use a
+predefined sentence encoder model from the TensorFlow Hub, and indicate that we
+are creating a text embedding application:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">def 
predict(String[] inputs) {
+    String modelUrl = 
"https://storage.googleapis.com/tfhub-modules/google/universal-sentence-encoder/4.tar.gz";
+
+    Criteria&lt;String[], double[][]&gt; criteria =
+        Criteria.builder()
+            .optApplication(Application.NLP.TEXT_EMBEDDING)
+            .setTypes(String[], double[][])
+            .optModelUrls(modelUrl)
+            .optTranslator(new MyTranslator())
+            .optEngine("TensorFlow")
+            .optProgress(new ProgressBar())
+            .build()
+    try (var model = criteria.loadModel()
+         var predictor = model.newPredictor()) {
+        predictor.predict(inputs)
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Next, let&#8217;s define our input strings:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">String[] inputs = [
+    "Cycling is low impact and great for cardio",
+    "Swimming is low impact and good for fitness",
+    "Palates is good for fitness and flexibility",
+    "Weights are good for strength and fitness",
+    "Orchids can be tricky to grow",
+    "Sunflowers are fun to grow",
+    "Radishes are easy to grow",
+    "The taste of radishes grows on you after a while",
+]
+var k = inputs.size()</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Now, we&#8217;ll use our predictor method to calculate the embeddings for 
each sentence.
+We&#8217;ll print out the embeddings and also calculate the dot product of the 
embeddings.
+The dot product (the same as the inner product for this case) reveals how 
related
+the sentences are.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">var embeddings = 
predict(inputs)
+
+var z = new double[k][k]
+for (i in 0..&lt;k) {
+    println "Embedding for: ${inputs[i]}\n${embeddings[i]}"
+    for (j in 0..&lt;k) {
+        z[i][j] = dot(embeddings[i], embeddings[j])
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Finally, we&#8217;ll use the <code>Heatmap</code> class from Smile to 
present a nice display
+highlighting what the data reveals:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy">new 
Heatmap(inputs, inputs, z, Palette.heat(20).reverse()).canvas().with {
+    title = 'Semantic textual similarity'
+    setAxisLabels('', '')
+    window()
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The output shows us the embeddings:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>Loading:     100% |========================================|
+<span class="maroon">2022-08-07 17:10:43.212697: ... This TensorFlow binary is 
optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following 
CPU instructions in performance-critical operations:  AVX2
+...
+2022-08-07 17:10:52.589396: ... SavedModel load for tags { serve }; Status: 
success: OK...
+...</span>
+Embedding for: Cycling is low impact and great for cardio
+[-0.02865048497915268, 0.02069241739809513, 0.010843578726053238, 
-0.04450441896915436, ...]
+...
+Embedding for: The taste of radishes grows on you after a while
+[0.015841705724596977, -0.03129228577017784, 0.01183396577835083, 
0.022753292694687843, ...]</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The embeddings are an indication of similarity.
+Two sentences with similar meaning typically have similar embeddings.</p>
+</div>
+<div class="paragraph">
+<p>The displayed graphic is shown below:</p>
+</div>
+<div class="paragraph">
+<p><span class="image"><img src="img/sentence_encodings_smile_heatmap.png" 
alt="Heatmap plot of sentence encodings"></span></p>
+</div>
+<div class="paragraph">
+<p>This graphic shows that our first four sentences are somewhat related, as 
are
+the last four sentences, but that there is minimal relationship between those
+two groups.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_more_information">More information</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Further examples can be found in the related repos:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a 
href="https://github.com/paulk-asert/groovy-data-science/blob/master/subprojects/LanguageProcessing";
 
class="bare">https://github.com/paulk-asert/groovy-data-science/blob/master/subprojects/LanguageProcessing</a></p>
+</li>
+<li>
+<p><a 
href="https://github.com/paulk-asert/groovy-data-science/tree/master/subprojects/LanguageProcessingSparkNLP";
 
class="bare">https://github.com/paulk-asert/groovy-data-science/tree/master/subprojects/LanguageProcessingSparkNLP</a></p>
+</li>
+<li>
+<p><a 
href="https://github.com/paulk-asert/groovy-data-science/tree/master/subprojects/LanguageProcessingDjl";
 
class="bare">https://github.com/paulk-asert/groovy-data-science/tree/master/subprojects/LanguageProcessingDjl</a></p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_conclusion">Conclusion</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>We have look at a range of NLP examples using various NLP libraries.
+Hopefully you can see some cases where you could use additional
+NLP technologies in some of your own applications.</p>
+</div>
+</div>
+</div></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a 
href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a 
href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a 
href='/download.html'>Download</a></li><li><a 
href='http://groovy-lang.org/support.html'>Support</a></li><li><a 
href='/'>Contribute</a></li><li><a 
href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li><a 
href='https://groovy.apache.org/events.html'></a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a 
href='https://github.com/apache/groovy'>Source code</a></li><li><a 
href='http://groovy-lang.org/security.html'>Security</a></li><li><a 
href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a 
href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a 
href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a
 href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a 
href='http://groovy-lang.org/sea [...]
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a 
href='http://groovy-lang.org/mailing-lists.html'>Discuss on the 
mailing-list</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on 
Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and 
conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code 
on GitHub</a></li><li><a 
href='http://groovy-lang.org/reporting-issues.html'>Report issues in 
Jira</a></li><li><a href='http://stackoverflow.com [...]
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is 
supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> 
and the Groovy community.
+                                        </p><div text-align='right'>
+                                            <img src='../img/asf_logo.png' 
title='The Apache Software Foundation' alt='The Apache Software Foundation' 
style='width:60%'/>
+                                        </div><p>Apache&reg; and the Apache 
feather logo are either registered trademarks or trademarks of The Apache 
Software Foundation.</p>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2023 
the Apache Groovy project &mdash; Groovy is Open Source: <a 
href='http://www.apache.org/licenses/LICENSE-2.0.html' alt='Apache 2 
License'>license</a>, <a 
href='https://privacy.apache.org/policies/privacy-policy-public.html'>privacy 
policy</a>.</div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='../js/vendor/jquery-1.10.2.min.js' 
defer></script><script src='../js/vendor/classie.js' defer></script><script 
src='../js/vendor/bootstrap.js' defer></script><script 
src='../js/vendor/sidebarEffects.js' defer></script><script 
src='../js/vendor/modernizr-2.6.2.min.js' defer></script><script 
src='../js/plugins.js' defer></script><script 
src='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js'></script><script>document.addEventListener('DOMContentLoa
 [...]
+          
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new 
Date();a=s.createElement(o),
+          
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file
diff --git a/blog/parsing-json-with-groovy.html 
b/blog/parsing-json-with-groovy.html
index 17e5da5..b8ab55a 100644
--- a/blog/parsing-json-with-groovy.html
+++ b/blog/parsing-json-with-groovy.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Parsing JSON with Groovy</a></li><li><a 
href='#_batteries_included_experience' class='anchor-link'>Batteries included 
experience</a></li><li><a href='#_gradle' 
class='anchor-link'>Gradle</a></li><li><a href='#_maven' 
class='anchor-link'>Maven</a></li><li><a href='#_advance [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Parsing JSON with Groovy</a></li><li><a 
href='#_batteries_included_experience' class='anchor-link'>Batteries included 
experience</a></li><li><a href='#_gradle' 
class='anchor-link'>Gradle</a></li><li><a href='#_maven' 
class='anchor-link'>Maven</a></li><li><a href='#_advance [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p><span class="image right"><img src="img/json_logo.gif" alt="json logo" 
width="120"></span>
diff --git a/blog/reading-and-writing-csv-files.html 
b/blog/reading-and-writing-csv-files.html
index 907c7f7..f250ac2 100644
--- a/blog/reading-and-writing-csv-files.html
+++ b/blog/reading-and-writing-csv-files.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Reading and Writing CSV files with Groovy</a></li><li><a 
href='#_introduction' class='anchor-link'>Introduction</a></li><li><a 
href='#_commons_csv' class='anchor-link'>Commons CSV</a></li><li><a 
href='#_opencsv' class='anchor-link'>OpenCSV</a></li><li><a href='#_jackson_da 
[...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Reading and Writing CSV files with Groovy</a></li><li><a 
href='#_introduction' class='anchor-link'>Introduction</a></li><li><a 
href='#_commons_csv' class='anchor-link'>Commons CSV</a></li><li><a 
href='#_opencsv' class='anchor-link'>OpenCSV</a></li><li><a href='#_jackson_da 
[...]
 <h2 id="_introduction">Introduction</h2>
 <div class="sectionbody">
 <div class="paragraph">
diff --git a/blog/using-groovy-with-apache-wayang.html 
b/blog/using-groovy-with-apache-wayang.html
index 487c146..0cab414 100644
--- a/blog/using-groovy-with-apache-wayang.html
+++ b/blog/using-groovy-with-apache-wayang.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Using Groovy with Apache Wayang and Apache Spark</a></li><li><a 
href='#_whiskey_clustering' class='anchor-link'>Whiskey 
Clustering</a></li><li><a href='#_implementation_details' 
class='anchor-link'>Implementation Details</a></li><li><a 
href='#_running_with_the_java_streams [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Using Groovy with Apache Wayang and Apache Spark</a></li><li><a 
href='#_whiskey_clustering' class='anchor-link'>Whiskey 
Clustering</a></li><li><a href='#_implementation_details' 
class='anchor-link'>Implementation Details</a></li><li><a 
href='#_running_with_the_java_streams [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p><span class="image right"><img 
src="https://www.apache.org/logos/res/wayang/default.png"; alt="wayang logo" 
width="100"></span>
diff --git a/blog/whiskey-clustering-with-groovy-and.html 
b/blog/whiskey-clustering-with-groovy-and.html
index 3489060..5405c0f 100644
--- a/blog/whiskey-clustering-with-groovy-and.html
+++ b/blog/whiskey-clustering-with-groovy-and.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Whiskey Clustering with Groovy and Apache Ignite</a></li><li><a 
href='#_whiskey_clustering' class='anchor-link'>Whiskey 
Clustering</a></li><li><a href='#_apache_ignite' class='anchor-link'>Apache 
Ignite</a></li><li><a href='#_implementation_details' class='anchor-link'>Imp 
[...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Whiskey Clustering with Groovy and Apache Ignite</a></li><li><a 
href='#_whiskey_clustering' class='anchor-link'>Whiskey 
Clustering</a></li><li><a href='#_apache_ignite' class='anchor-link'>Apache 
Ignite</a></li><li><a href='#_implementation_details' class='anchor-link'>Imp 
[...]
 <div class="sectionbody">
 <div class="paragraph">
 <p>In a previous <a 
href="https://groovy.apache.org/blog/using-groovy-with-apache-wayang";>blog 
post</a>,
diff --git a/blog/wordle-checker.html b/blog/wordle-checker.html
index 47b7598..d10d37e 100644
--- a/blog/wordle-checker.html
+++ b/blog/wordle-checker.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Checking Wordle with Groovy</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a 
href='./groovy-null-processing'>Groovy Processing Nulls In Lists</a></li><li><a 
href='./groovy-list-proce [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Checking Wordle with Groovy</a></li></ul><br/><ul 
class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: 
#eee'><span>Related posts</span></li><li><a 
href='./groovy-null-processing'>Groovy Processing Nulls In Lists</a></li><li><a 
href='./zipping-collectio [...]
 <p>This <a 
href="https://donraab.medium.com/comparing-my-smalltalk-and-eclipse-collections-wordle-kata-solutions-4058ac7d8ca0";>article</a>
 by <a href="https://twitter.com/TheDonRaab";>Donald Raab</a>
 looks at writing a Wordle checker in Smalltalk and Java using <a 
href="https://github.com/eclipse/eclipse-collections";>Eclipse Collections</a>. 
Let&#8217;s look at doing the same in Groovy.
 We could easily use Eclipse Collections with Groovy
diff --git a/blog/zipping-collections-with-groovy.html 
b/blog/zipping-collections-with-groovy.html
index a453e6f..94ee20f 100644
--- a/blog/zipping-collections-with-groovy.html
+++ b/blog/zipping-collections-with-groovy.html
@@ -53,7 +53,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Zipping Collections with Groovy</a></li><li><a 
href='#_what_is_zipping' class='anchor-link'>What is zipping?</a></li><li><a 
href='#_groovy' class='anchor-link'>Groovy</a></li><li><a 
href='#_eclipse_collections' class='anchor-link'>Eclipse 
Collections</a></li><li><a href='# [...]
+                        </div><div id='content' class='page-1'><div 
class='row'><div class='row-fluid'><div class='col-lg-3'><ul 
class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a 
href='#doc'>Zipping Collections with Groovy</a></li><li><a 
href='#_what_is_zipping' class='anchor-link'>What is zipping?</a></li><li><a 
href='#_groovy' class='anchor-link'>Groovy</a></li><li><a 
href='#_eclipse_collections' class='anchor-link'>Eclipse 
Collections</a></li><li><a href='# [...]
 <h2 id="_what_is_zipping">What is zipping?</h2>
 <div class="sectionbody">
 <div class="paragraph">


Reply via email to