Word Sense Disambiguation (WSD) is an important but challenging technique in the area of natural language processing (NLP). Hundreds of WSD algorithms and systems are available, but less work has been done in regard to choosing the optimal WSD algorithms. This paper summarizes the various knowledge sources used for WSD and classifies existing WSD algorithms according to their techniques. The rationale, tasks, performance, knowledge sources used, computational complexity, assumptions, and suitable applications for each class of WSD algorithms are also discussed. This paper will provide users with general knowledge for choosing WSD algorithms for their specific applications or for further adaptation.