For the most part, Jeff Mercado's comment on your question is correct; not everything in the diff will always make the most sense to a human in all edge cases.
For example, if you fix a typo to turn "wheather" into "weather", you're just removing a single letter – however, the diff will show that you removed one word and added another. While in that case, to a human it may actually be more obvious to just show a single removed letter, in many cases doing a character-by-character diff would just make things worse:
So that's why we're doing word-by-word diff. Not only that; we're also considering trailing spaces part of the word; otherwise, you'd have this:
But in most cases, the most readable diff is actually this:
– and the "most cases" thing is obviously what we're optimizing for.
That said, I've made some improvements to the whitespace handling in the diffs. One thing you noticed was even an actual bug: The reason that you seemed to be inserting one space and removing five was the fact that under certain circumstances, breaking the text into tokens for diffing created empty tokens, causing a a "nothing" was removed here, and a "nothing" was added there diff.
Since a "nothing" is invisible, and we're replacing invisible changes by a space (saying "you can't see it, but something changed here), this caused the 5/1 instead of 4/0 diff you observed.
Both this bugfix and the whitespace improvements will be in the next build.