On Github Octo-Labs / markov_chains_for_fun_and_profit_java_version
Feature: Markov Chainer As chainer I need to take sentences for training And combine them randomly So that I can create comedy Scenario: Accept a sentence for training Given a MarkovChainer Then it should be trainable
public class MarkovChainerStepDefs { private MarkovChainer myChainer; @Given("^a MarkovChainer$") public void a_MarkovChainer() throws Throwable { myChainer = new MarkovChainer(); } @Then("^it should be trainable$") public void it_should_be_trainable() throws Throwable { String sentence = "Just a test sentence"; myChainer.train(sentence); } }
Scenario: Regurgitating a sentence Given a MarkovChainer When I train it with "Heloooo there!" Then it should generate "Heloooo there!"
@When("^I train it with \"([^\"]*)\"$") public void i_train_it_with(String arg1) throws Throwable { myChainer.train(arg1); } @Then("^it should generate \"([^\"]*)\"$") public void it_should_generate(String arg1) throws Throwable { String sentence = myChainer.generate(); assertThat(sentence, is(arg1)); }
Scenario: Mixing two sentences Given a MarkovChainer When I train it with "Ryan brews JAVA" When I train it with "Jeremy brews beer" And call generate 20 times Then it should generate "Ryan brews beer" at least once
private Hashtable<String, Integer> results = new Hashtable<String, Integer>(); @When("^call generate (\\d+) times$") public void call_generate_times(int arg1) throws Throwable { for(int i=1; i<arg1; i++){ String sentence = myChainer.generate(); Integer score = results.get(sentence); if(score == null){ score = 0; } score++; results.put(sentence,score); } }
@Then("^it should generate \"([^\"]*)\" at least once$") public void it_should_generate_at_least_once(String arg1) throws Throwable { Integer score = results.get(arg1); if(score == null){ score = 0; } boolean greaterThanZero = score > 0; assertThat("greaterThanZero",greaterThanZero); }
# results { "Ryan brews JAVA" => 7, "Jeremy brews beer" => 5, "Ryan brews beer" => 4, "Jeremy brews JAVA" => 4 }
public class MarkovChainer { public void train(String s) { } }
public class MarkovChainer { private String sentence; public void train(String s) { sentence = s; } public String generate() { return sentence; } }
private class Word { private Word nextWord; private String word; public Word(String word, Word nextWord){ this.word = w; this.nextWord = nextWord; } public Word nextWord(){ return nextWord; } public String toString(){ return word; } }
private ArrayList<Word> beginnings; public MarkovChainer(){ beginnings = new ArrayList<Word>(); }
public void train(String s) { String[] swords = s.split(" "); Word previousWord = null; for(int i = swords.length -1; i>=0; i--){ Word word = new Word(swords[i],previousWord); previousWord = word; } beginnings.add(previousWord); }
public String generate() { StringJoiner words = new StringJoiner(" "); Word word = beginnings.get(0); while(word != null){ words.add(word.toString()); word = word.nextWord(); } String sentence = words.toString(); return sentence; }
private class Word { private ArrayList<Word> nextWords; private String word; public Word(String w, Word nextWord){ word = w; nextWords = new ArrayList<Word>(); nextWords.add(nextWord); } public void addNextWord(Word w){ nextWords.add(w); } }
private class Word { public Word nextWord(){ if(nextWords.size() > 0){ Collections.shuffle(nextWords); return nextWords.get(0); }else{ return null; } } public String toString(){ return word; } }
private ArrayList<Word> beginnings; private Hashtable<String,Word> words; public MarkovChainer(){ beginnings = new ArrayList<Word>(); words = new Hashtable<String,Word>(); }
public void train(String s) { String[] swords = s.split(" "); Word previousWord = null; for(int i = swords.length -1; i>=0; i--){ Word word = words.get(swords[i]); if(word != null){ word.addNextWord(previousWord); }else{ word = new Word(swords[i],previousWord); words.put(swords[i],word); } previousWord = word; } beginnings.add(previousWord); }
public String generate() { StringJoiner words = new StringJoiner(" "); Collections.shuffle(beginnings); Word word = beginnings.get(0); while(word != null){ words.add(word.toString()); word = word.nextWord(); } String sentence = words.toString(); return sentence; }