erro de incompatibilidade de dimensão no CountVectorizer MultinomialNB

Antes de fazer essa pergunta, devo dizer que li exaustivamente mais de 15 tópicos semelhantes neste quadro, cada um com recomendações de alguma forma diferentes, mas todos eles simplesmente não conseguiram me acertar.

Ok, então eu divido meus dados de texto 'spam email' (originalmente no formato csv) em conjuntos de treinamento e teste, usando o CountVectorizer e sua função 'fit_transform' para ajustar o vocabulário do corpus e extrai os recursos de contagem de palavras do texto. E então apliquei o MultinomialNB () para aprender com o conjunto de treinamento e prever no conjunto de teste. Aqui está o meu 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

As sugestões que recolhi dos tópicos de perguntas anteriores são (1) usar apenas .transform () no X_test, ou (2) verificar se cada linha nos dados de spam originais está no formato de string (sim, eles são) ou (3) não faça nada no X_test. Mas todos eles não tocaram a campainha e o Python continuou me dando o erro de 'incompatibilidade de dimensão'. Depois de lutar por 4 horas, tive que sucumbir ao Stackoverflow. Será realmente apreciado se alguém puder me esclarecer sobre isso. Só quero saber o que está errado com meu código e como obter a dimensão correta.

Obrigado.

Aliás, as entradas de dados originais têm esta aparência

_

                                         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

questionAnswers(1)

yourAnswerToTheQuestion