http://experimentgarden.blogspot.com/2009/11/software-tool-f...
This is what happens when you are a self taught programmer who learned mostly from basic coding primers rather than from the internet. I ended up independently reinventing a lot of code and algorithms, including a basic Markov chain implementation such as the one described here.
For example, given the same corpus, if you have an n-gram model of english characters, obviously some[1] of the words will be erroneous. But if that model is over words, none of the words will be erroneous, but the grammar will still be broken in some cases. Extend that to an n-gram over collections of grammatical phrases where the words, grammar might be correct, but it may have a nonsensical meaning in some cases, etc.
[1] Obviously "some" is dependent on the amount and diversity of the training data, model detail, etc.