ValueError at /result X имеет 118990 признаков на образец; ожидается 103815
Я пытаюсь сделать детектор фальшивых новостей с помощью scikit learn и развернул его на Django. Я сделал front-end для ввода описания новостей от пользователя и отображения результата в соответствии с предсказанием, и я использовал pickle для сохранения модели. Когда я ввожу данные, он показывает вышеуказанную ошибку.
Код для удаления стоп-слов и разделения тренировочного теста
def word_drop(text):
text = text.lower()
text = re.sub('\[.*?\]','',text)
text = re.sub("\\W"," ",text)
text = re.sub('https?://\S+www\.\S+','',text)
text = re.sub('<.*?>+','',text)
text = re.sub('[%s]' % re.escape(string.punctuation),'',text)
text = re.sub('\n','',text)
text = re.sub('\w*\d\w*','',text)
return text
news_total['text'] = news_total['text'].apply(word_drop)
X = news_total['text'] # independent variable
y = news_total['flag'] # dependent variable
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.1,random_state=0)
"флаг" определяет, является ли новость фальшивой или нет, а "текст" - это описание новости в наборе данных.
Код вектора и классификатора
vectorizer = TfidfVectorizer(stop_words="english",max_df= 0.7 )
X_train_vector = vectorizer.fit_transform(X_train)
X_test_vector = vectorizer.transform(X_test)
psa_classifier = PassiveAggressiveClassifier(max_iter = 100)
psa_classifier.fit(X_train_vector,y_train)
y_predict = psa_classifier.predict(X_test_vector)
pickle.dump(psa_classifier,open('model_pickle.sav','wb'))
Передняя концевая часть
Код файла views.py приложения проекта. Также model_pickle.sav находится в той же директории, что и приложение.
loaded_model = pickle.load(open("model_pickle.sav", "rb"))
news_total = pd.read_csv("final_dataset.csv")
X = news_total['text'] # independent variable
y = news_total['flag'] # dependent variable
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.1,random_state=0)
vectorizer = TfidfVectorizer(stop_words="english",max_df=0.7)
def transform_fake_news(news):
X_train_vector = vectorizer.fit_transform(X_train)
X_test_vector = vectorizer.transform(X_test)
check_news = {"text": [news]}
test_news = pd.DataFrame(check_news)
test_news["text"] = test_news["text"].apply(word_drop)
new_x_test = test_news["text"]
new_x_test_vector = vectorizer.transform(new_x_test)
return new_x_test_vector
def getPredictions(desc):
news_vector = transform_fake_news(desc)
return loaded_model.predict(news_vector)
def result(request):
if request.method=="POST":
description = request.POST.get("desc")
result = getPredictions(description)
return render(request, "result.html",{'result':result})
Вот полный код. В views.py функция word_drop также присутствует, я просто не стал включать ее снова.