N-gram Language Models Understanding N-Gram Models: Perplexity and Smoothing Techniques in Natural Language Processing