尝试使用Django部署餐厅情感分析模型时陷入困境

时间:2019-08-01 05:48:00

标签: python django deploying

我正在尝试使用Django部署情感分析模型,但出现以下错误。

views.py文件

from django.shortcuts import render
from django.http import HttpResponse
from django.contrib.auth import authenticate
import pandas as pd
import matplotlib.pyplot as plt
import pickle
import re
import nltk
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer
from string import punctuation
from nltk.corpus import stopwords
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.preprocessing import LabelEncoder

# Create your views here.

badfood=pickle.load(open('mymodel/pkl/BadFood.pickle','rb'))


def index(request):
    return render(request,'mymodel/index.html')

def remove_non_ascii_1(text):

    return ''.join(i for i in text if ord(i)<128)

def clean_text(input_str):
    lemmatizer= WordNetLemmatizer()
    input_str=input_str.lower()
    remove_num=re.sub(r'\d+','',input_str)
    remove_punc=remove_num.translate(str.maketrans("","",punctuation))
    remove_white=remove_punc.strip()
    stop_words=set(stopwords.words('english'))
    tokens=word_tokenize(remove_white)
    result=[i for i in tokens if  not i in stop_words]
    lemmatized_words=[lemmatizer.lemmatize(word) for word in result]



    review=' '.join(lemmatized_words)
    return review

def predict(request):
    # Grabbing data from user

    if request.method=="POST":
        review=request.POST.get('review','')
        city=request.POST.get('city','')

        input_data=[{'review':review,'city':city}]
        dataset=pd.DataFrame(input_data)
        dataset = dataset.replace(r'\r',' ', regex=True)
        dataset['review']=dataset['review'].apply(lambda x:remove_non_ascii_1(x))
        dataset['review']=dataset['review'].apply(lambda x:clean_text(x))

    # Bag of words
        vectorizer=CountVectorizer()








features_data=
pd.DataFrame(vectorizer.fit_transform(dataset.review).toarray())



        features_data.columns=vectorizer.get_feature_names()

        features_data.insert(0,'city_x',dataset['city'])


    # Label Encoding the city column
        labelencoder=LabelEncoder()



      features_data['city_x']=labelencoder.fit_transform(features_data.city_x)
        features_data['city_x']=features_data['city_x'].astype('category')



        regressor=badfood.predict(features_data)

return render(request,'mymodel/result.html',{'res':regressor})

ValueError,位于/ predict / 模型的特征数量必须与输入匹配。型号n_features为7397,输入n_features为12

  

我设计了一个用户界面,其中提供了一个文本框字段   用户可以在其中输入评论和下拉列表,   用户可以选择城市。上面是我的views.py文件,它是   包含用于预测的所有必要代码。现在我该怎么做   我的输入数据框特征等于7397的模型特征   接受培训的原因是每次都会进行不同的审核   给定,单词分词后形成的所有列将是   不一样。我不知道这些单词会形成哪些列。   目的是根据用户输入的数据框创建完全相同的数据框   经过培训,以便可以做出正确的预测。在粘贴代码时,代码的缩进会受到干扰。请不要将其视为错误。

非常感谢

1 个答案:

答案 0 :(得分:0)

您得到了错误,因为您已经对7397功能进行了模型训练并进行了预测 在12个功能上

您还需要保存vectorizer,并且需要使用vectorizer.transform()(它将根据学习的vocab转换数据)而不是fit_transform

#example
from sklearn.feature_extraction.text import CountVectorizer
import pickle

vect = CountVectorizer() 
vect.fit(['how are you','have a nice day', 'good morning'])

#saving vectorizer
with open('vectorizer.pkl', 'wb') as file:
     pickle.dump(vect, file)

# loading vectorizer
with open('vectorizer.pkl', 'rb') as file:  #Now use vect to vectorize your new text  
    vect = pickle.load(file)

vect.transform(['new comment'])