質問編集履歴
1
コードの追加
    
        title	
    CHANGED
    
    | 
            File without changes
         | 
    
        body	
    CHANGED
    
    | @@ -11,6 +11,82 @@ | |
| 11 11 | 
             
            Internal Server Error
         | 
| 12 12 | 
             
            The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
         | 
| 13 13 |  | 
| 14 | 
            +
            コードは以下になります。
         | 
| 15 | 
            +
            ```python
         | 
| 16 | 
            +
            from flask import Flask, render_template, request
         | 
| 17 | 
            +
            from wtforms import Form, TextAreaField, validators
         | 
| 18 | 
            +
            import pickle
         | 
| 19 | 
            +
            import sqlite3
         | 
| 20 | 
            +
            import os
         | 
| 21 | 
            +
            import numpy as np
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            from vectorizer import vect
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            app = Flask(__name__)
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            cur_dir = os.path.dirname(__file__)
         | 
| 28 | 
            +
            clf = pickle.load(open(os.path.join(cur_dir, 'pkl_objects', 'classifier.pkl'),
         | 
| 29 | 
            +
                                   'rb'))
         | 
| 30 | 
            +
            db = os.path.join(cur_dir, 'reviews.sqlite')
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            def classify(document):
         | 
| 33 | 
            +
                label = {0: 'negative', 1: 'positive'}
         | 
| 34 | 
            +
                X = vect.transform([document])
         | 
| 35 | 
            +
                y = clf.predict(X)[0]
         | 
| 36 | 
            +
                proba = clf.predict_proba(X).max()
         | 
| 37 | 
            +
                return label[y], proba
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            def train(document, y):
         | 
| 40 | 
            +
                X = vect.transform([document])
         | 
| 41 | 
            +
                clf.partial_fit(X, [y])
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            def sqlite_entry(path, document, y):
         | 
| 44 | 
            +
                conn = sqlite3.connect(path)
         | 
| 45 | 
            +
                c = conn.cursor()
         | 
| 46 | 
            +
                c.execute("INSERT INTO review_db (review, sentiment, date)"\
         | 
| 47 | 
            +
                          " VALUES (?, ?, DATETIME('now'))", (document, y))
         | 
| 48 | 
            +
                conn.commit()
         | 
| 49 | 
            +
                conn.close()
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            class ReviewForm(Form):
         | 
| 52 | 
            +
                moviereview = TextAreaField('',
         | 
| 53 | 
            +
                                            [validators.DataRequired(),
         | 
| 54 | 
            +
                                             validators.length(min=15)])
         | 
| 55 | 
            +
            @app.route('/')
         | 
| 56 | 
            +
            def index():
         | 
| 57 | 
            +
                form = ReviewForm(request.form)
         | 
| 58 | 
            +
                return render_template('reviewform.html', form=form)
         | 
| 59 | 
            +
             | 
| 60 | 
            +
            @app.route('/results', methods=['POST'])
         | 
| 61 | 
            +
            def results():
         | 
| 62 | 
            +
                form = ReviewForm(request.form)
         | 
| 63 | 
            +
                if request.method == 'POST' and form.validate():
         | 
| 64 | 
            +
                    review = request.form['moviereview']
         | 
| 65 | 
            +
                    y, proba = classify(review)
         | 
| 66 | 
            +
                    return render_template('results.html',
         | 
| 67 | 
            +
                                           content=review,
         | 
| 68 | 
            +
                                           prediction=y,
         | 
| 69 | 
            +
                                           probability=round(proba*100, 2))
         | 
| 70 | 
            +
                return render_template('reviewform.html', form=form)
         | 
| 71 | 
            +
             | 
| 72 | 
            +
            @app.route('/thanks', methods=['POST'])
         | 
| 73 | 
            +
            def feedback():
         | 
| 74 | 
            +
                feedback = request.form['feedback_button']
         | 
| 75 | 
            +
                review = request.form['review']
         | 
| 76 | 
            +
                prediction = request.form['prediction']
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                inv_label = {'negative': 0, 'positive': 1}
         | 
| 79 | 
            +
                y = inv_label[prediction]
         | 
| 80 | 
            +
                if feedback == 'Incorrect':
         | 
| 81 | 
            +
                    y = int(not(y))
         | 
| 82 | 
            +
                train(review, y)
         | 
| 83 | 
            +
                sqlite_entry(db, review, y)
         | 
| 84 | 
            +
                return render_template('thanks.html')
         | 
| 85 | 
            +
             | 
| 86 | 
            +
            if __name__ == '__main__':
         | 
| 87 | 
            +
                app.run()
         | 
| 88 | 
            +
            ```
         | 
| 89 | 
            +
             | 
| 14 90 | 
             
            エラーログは以下です。
         | 
| 15 91 | 
             
            2018-09-28 14:56:46,612: Exception on /thanks [POST]#012Traceback (most recent call last):#012  File "/usr/lib/python3.5/site-packages/flask/app.py", line 2292, in wsgi_app#012    response = self.full_dispatch_request()#012  File "/usr/lib/python3.5/site-packages/flask/app.py", line 1815, in full_dispatch_request#012    rv = self.handle_user_exception(e)#012  File "/usr/lib/python3.5/site-packages/flask/app.py", line 1718, in handle_user_exception#012    reraise(exc_type, exc_value, tb)#012  File "/usr/lib/python3.5/site-packages/flask/_compat.py", line 35, in reraise#012    raise value#012  File "/usr/lib/python3.5/site-packages/flask/app.py", line 1813, in full_dispatch_request#012    rv = self.dispatch_request()#012  File "/usr/lib/python3.5/site-packages/flask/app.py", line 1799, in dispatch_request#012    return self.view_functions[rule.endpoint](**req.view_args)#012  File "/home/1976kaca/movieclassifier/app.py", line 67, in feedback#012    train(review, y)#012  File "/home/1976kaca/movieclassifier/app.py", line 26, in train#012    clf.partial_fit(X, [y])#012  File "/usr/lib/python3.5/site-packages/sklearn/linear_model/stochastic_gradient.py", line 540, in partial_fit#012    self._validate_params()#012  File "/usr/lib/python3.5/site-packages/sklearn/linear_model/stochastic_gradient.py", line 89, in _validate_params#012    if self.max_iter is not None and self.max_iter <= 0:#012AttributeError: 'SGDClassifier' object has no attribute 'max_iter'
         | 
| 16 92 |  | 
