Sec 21.4.3 the table comparing the 3 models performance says "test error" but it should be "test accuracy".
It might be useful to do a little exploratory analysis on the td-idf transformed data before fitting :)
You say the model has "23,804 features" but there are 23812 unique tokens.
Maybe explain how to handle "out of vocabulary" words (like new names of politicians) so model can actually be used on new data?