Buenas,
Es correcto lo que decís sobre los conjuntos de train y test. Las métricas sobre el conjunto de train pueden ser útiles para checkear que el entrenamiento funcionó, pero lo importante es reportar las métricas sobre el conjunto de test. El código sobre train se da como ejemplo simplemente.
También es correcto que la lista de palabras en train/test difiere. Es por eso que que el `fit` o `fit_transform` de los encoders sólo se debe correr sobre el conjunto de train. Luego se corre sólamente `encoder.transform` en test para convertir el texto a features, pero utilizando el encoder ajustado ("fitteado") a train. Si hubiera palabras nuevas en test (cosa habitual) se van a ignorar.
Está buena la pregunta porque esto es muy importante en general, cuando se usa un encoder que necesita ser ajustado: no cambiarlo luego de entrenar el modelo (nunca usar `fit` o `fit_transform` aquí). Por suerte en este caso el error salta a la vista porque las dimensiones quedan distintas, si no sería un típico "bug silencioso" que puede hacer que las predicciones del modelo sean básicamente aleatorias.