Wednesday, July 23, 2014

New Version Available

I bungled the patch somehow, but I fixed what was wrong and updated again.

Tuesday, July 22, 2014


There was a small glitch in IM3's JSB interface with passing arrays to User Defined Functions. It has been corrected.

Friday, July 18, 2014

Infinite Monkeys 3.4.0 Now Available

Hi All!

I have updated IM3 (finally) with the new scripting language (JSB) I have been developing over the past couple of months. I think it's a major upgrade for multiple different reasons.

#1. It has a more JavaScript-like syntax than SMUP which was more Lisp-like.
#2. It's base variable type is uses JavaScript Object Notation (JSON) for handling all variables and that makes it easier to port or import data from IM3 to other programs.

Documentation has been updated.

Examples of IM3 + JSB are notably sparse. There is only one example although the documentation is thorough. I will be updating this blog with better examples soon, so please stay tuned.


Friday, May 23, 2014

Wednesday, May 21, 2014


-Gnoetry style interface
-Adjoined dictionary editor to im3 and added pulldown menus replacing buttons
-lots of other awesome functionality
-watch video demos

Saturday, May 17, 2014

Coming Soon! (im3.2.0)

A Gnoetry-style interface. Currently works on templates (not n-grams like Gnoetry-proper). Allows for semantic, phonic, and syllable filters, with part of speech drop down. In the future I will add n-grams, hopefully before next release.

I am currently mired in testing every feature for bugs (of which I'm sure there are many). So that is something to consider before a new release. When the dictionary is updated with accent information it will be possible to do scansion on texts. This will be awesome. But there's a lot of work in between the possibility and the reality.

At any rate, stay tuned. There will be a demo of course, and that will be fun.


Wednesday, May 14, 2014


I know I'm adding updates at breakneck speed, but these are pretty sweet so bear with me. I added tagging and accents though I haven't added many tags or implemented anything regarding accents. You can no search by syllable count and build dictionaries accordingly. I added a new function to SMUP.

(tags( "hello" ))

Would return the tags of the word hello, if it had any (which it doesn't). None the less, you can search by tags and add your own if you please. Due to the addition of new data old dictionaries no longer work. I can help you if you are really attached to an old dictionary. e-mail me at dtolkacz at gmail dot com.

This is pretty much the first attempt I've made to add a semantic component to im3. This will improve as time goes on and additionally, more semantic components will be added. Assonance will be reworked. Words assonate on the accent of other words (according to me) and this is how (in the future) assonance will be implemented. There are plans to expand the dictionary. The dictionary contains about 60k words so far, but is by no means complete. The search algorithm is really fast so the only thing that would be affected by expanding it is load time which has been vastly reduced. Word maxes have been eradicated. You can add as many words as your memory allows (soon).

The new system may be slightly temperamental. Please notify me of any crashes/bugs. I will fix and update ASAP.

Thanks and enjoy.


Tuesday, May 13, 2014


I added a new dictionary editor which I think we can all agree is superior to the old dictionary editor.

1. It allows you to add or edit entries.

2. Automatically alphabetizes additions. (This helps speed up searches by creating an alphabetic hash.)

3. Has a text box where you can dump a text file. Text box will automatically highlight words that are not in the dictionary.

4. Informative Video:

Monday, May 12, 2014

SMUP + Ngrams (im3.1.3)

There is a currently undocumented feature for the SMUP function:
(ngrams( ctxNum, numNgrams ))

You can inject a word so instead of being selected at random, it uses that specific word as a sort of trigger in the bias on which to call other words. Like so:

(ngrams(1,300, "the")) 

Have fun!

Sunday, May 11, 2014

Saturday, May 10, 2014

bug fix

There was a bug in the tagger causing a crash. It's fixed now. You can fix it yourself by adding an extra line to master.dictionary.txt at the very end of the document. Apologies!!



Dictionary is fixed. Haven't tested to see if template output is any better. Tweaks to SMUP functions.

phoneTag & tagTokens can now also take strings.



Next up. I may attempt to convert the dictionary to a JSON object. I will add an enhanced dictionary editor. I will add a gnoetry-like interface to create from.

Take care, be well, and I will see you soon.


Wednesday, April 23, 2014

Quick Note

I've been doing extensive editing to the dictionary. I inherited a lexicon that was ostensibly tagged by a third party and utilized it in Infinite Monkeys 3. This lexicon is tagged abominably and I realize that it makes im3's template system more difficult to work with and the output shoddier. I apologize (personally) for this. Please be aware that I'm working daily to resolve this issue.

Editing a lexicon with 85000 words is tedious, difficult, and potentially harmful to the well-being of myself and those around me. Nonetheless it must be done.

Thank you for your patience.



Bugfix to "Correct" / POS Tagging
Edits to master.dictionary.txt

Monday, April 21, 2014

im3.1.1 Now available


Several mistakes corrected. Optimized tag routine (now 12x faster.. literally). Please note that any edits to old versions of the MASTER dictionary must be discarded. Optimization works with an alphabetized dictionary and I have not yet added any routine within im3 to sort. I will in future updates add an enhanced dictionary editor which allows additions to be made. In the meantime, no edits to master.dictionary.txt!


Thursday, April 17, 2014


#1. tweaks to dictionary to remove redundant entries
#2. added stylebuffer to SMUP.exe & im3 SMUP tab (see pic)

Wednesday, April 16, 2014

Attatching endings to words, with SMUP

(w1#(NN)) (w1#(w1 & "ing")) (eval(w1)) 

This tiny piece of code shows you how you can turn a NOUN (NN) into a GERUND (VBG).

The first line: (w1#(NN))

w1 is our variable. We assign with the # operator. NN is the function which generates a random noun from the dictionary.

Then we reassign w1 = w1 + "ing" which in SMUP is..

(w1#(w1 & "ing"))

POST Trainer Demo

Sunday, April 13, 2014

im3.0.1: BUG FIX

Fixed a glitch where changes to dictionary were over-written on save.

Haiku With im3 (part 1)


    (eval(w1)) (eval(w2)) (eval(w3))

    (eval(w1)) (eval(w2)) (eval(w3)) (eval(w4))

    (eval(w1)) (eval(w2)) (eval(w3))

Saturday, April 12, 2014

Video Tute! Diddling with the Dictionary~

Scripting with im3: Parsing a list...

(scriptStr#"DT NN NN VBZ DT JJ NN")
(splitOver(scriptStr, " ",scriptList))

    (if(c=nWords)) { (goto(::UNLOOP::)) }

Let's take a run through of this im3 script, since it is doing something fairly complicated. First, we define a string which has several part of speech tags in it. We take this string, and using the splitOver routine, separate the words into a list, every time we hit a space. We then use the (len(list)) command to determine how many individual words are in the list. We create a variable called c which will act as a counter.

(scriptStr#"DT NN NN VBZ DT JJ NN")
(splitOver(scriptStr, " ",scriptList))

Then we define a label, (::LOOP::).


We create a string to read in the first element in our list scriptList, and hold it's contents in the variable inScr.


We create another variable called inTxt which holds the contents of a randomly generated word with the first part of speech in the list scriptList. inTxt now holds a random word of the first part of speech read in from scriptStr; in this case DT, a determiner.


We use the find to command to look up inTxt and save the word's record to inWord.


We create another string to hold the phonetic data.


And we call LEFT to cut 4 characters from the left hand side of the variable inPhone. So left("1234567890", 2) would = "12".

Then we generate another random word with the new phonetic data:


And we increment our counter:


Note the double brackets. This prevents SMUP from returning data to our output window. It Eats data that is double brackets. Try running this code without the double brackets!

    (if(c=nWords)) { (goto(::UNLOOP::)) }

Here we have our exit condition. If our counter is equal to the number of words in our list, then we go to (::UNLOOP::) or else we just go back to (::LOOP::).

And there you have it.

Try copying this into SMUP and giving it a run.

im3 Ready for Download!


You can report any bugs, issues to

We are live! YAY!

Friday, April 11, 2014

Infinite Monkeys 3: Wise Monkeys Edition

I am within a couple days of the first release of im3, and unlike im2, im3 has a fairly steep, front loaded learning curve. The advantage of course, is that it is a million times better than its predecessor. In contrast, im3 will have:

  • Part of Speech tagging! Annoyed by having to translate poems into parts of speech? Me too. im3 will give it go at doing it for you. Accuracy-wise, it is hovering at about 85-90%. But it's a learning AI, so the more times you use the training module and correct its mistakes, the better im3 will get at tagging parts of speech. This will make generating from a template a million times faster and better.
  • A scripting language! im3 comes with SMUP scripting language which allows you to save generated text to variables and call them redundantly. It allows you to make function calls and generate words from parts of speech, pronunciation keys, or the number of syllables. This will make generating metered verse possible.
  • Vastly improved dictionary interface. The new dictionary interface operates off a master dictionary which will allow you to copy words in bulk, & search by text, part of speech, or phoneme. You can of course load and save dictionaries, and set which dictionary a template generates from. The master dictionary contains around 130,000 words and can hold as many as 200,000.
  • Improved n-gram biasing. It will be much easier to load and save n-gram biases due to improvements on the way IM saves n-gram information. Load times have been vastly reduced and optimizations have been made to the EAT function which makes eating in text less time consuming.
  • im3 still includes an option to speak back the poem in a computer voice, but this time, you will be able to control the rate at which the computer reads back the poem.
  • HTML docs included and can be referenced from im3's GUI.
  • Video tutorials by yours truly will help shorten the learning curve. 

What's missing?

  • Semantic tagging. This will be introduced in later updates, but for right now, you can make your own dictionaries any way you please.
  • im3 uses Carnegie Melon's pronouncing dictionary, which is superior to im2's. 
End of list.

Release should be live within the next couple of days.  This is a pleasant demonstration of a very early incarnation of im3. Enjoy, & be well.