error de discordancia de dimensión en CountVectorizer MultinomialNB

Antes de presentar esta pregunta, debo decir que he leído a fondo más de 15 temas similares en este foro, cada uno con recomendaciones diferentes, pero todos ellos simplemente no pudieron entenderme.

Ok, entonces dividí mis datos de texto de 'correo electrónico no deseado' (originalmente en formato csv) en conjuntos de entrenamiento y prueba, usando CountVectorizer y su función 'fit_transform' para ajustar el vocabulario del corpus y extrae las características de conteo de palabras del texto. Y luego apliqué MultinomialNB () para aprender del conjunto de entrenamiento y predecir en el conjunto de prueba. Aquí está mi código (simplificado):

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.cross_validation import train_test_split
from sklearn.naive_bayes import MultinomialNB

# loading data 
# data contains two columns ('text', 'target')

spam = pd.read_csv('spam.csv')
spam['target'] = np.where(spam_data['target']=='spam',1,0)

# split data
X_train, X_test, y_train, y_test = train_test_split(spam_data['text'], spam_data['target'], random_state=0) 

# fit vocabulary and extract word count features
cv = CountVectorizer()
X_traincv = cv.fit_transform(X_train)  
X_testcv = cv.fit_transform(X_test)

# learn and predict using MultinomialNB
clfNB = MultinomialNB(alpha=0.1)
clfNB.fit(X_traincv, y_train)

# so far so good, but when I predict on X_testcv
y_pred = algo.predict(X_testcv)

# Python throws me an error: dimension mismatch

Las sugerencias que obtuve de los hilos de preguntas anteriores son: (1) usar solo .transform () en X_test, o (2) determinar si cada fila en los datos de spam originales está en formato de cadena (sí, lo están), o (3) no hacer nada en X_test. Pero todos ellos no tocaron el timbre y Python siguió dándome un error de "falta de coincidencia de dimensiones". Después de luchar durante 4 horas, tuve que sucumbir a Stackoverflow. Sería realmente apreciado si alguien pudiera iluminarme sobre esto. Solo quiero saber qué falla con mi código y cómo obtener la dimensión correcta.

Gracias.

Por cierto, las entradas de datos originales se ven así

_

                                         test   target
0 Go until jurong point, crazy.. Available only    0
1 Ok lar... Joking wif u oni...                    0
2 Free entry in 2 a wkly comp to win FA Cup fina   1
3 U dun say so early hor... U c already then say   0
4 Nah I don't think he goes to usf, he lives aro   0
5 FreeMsg Hey there darling it's been 3 week's n   1
6 WINNER!! As a valued network customer you have   1