質問編集履歴
1
コードの追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -24,6 +24,158 @@
|
|
24
24
|
|
25
25
|
|
26
26
|
|
27
|
+
コードは以下になります。
|
28
|
+
|
29
|
+
```python
|
30
|
+
|
31
|
+
from flask import Flask, render_template, request
|
32
|
+
|
33
|
+
from wtforms import Form, TextAreaField, validators
|
34
|
+
|
35
|
+
import pickle
|
36
|
+
|
37
|
+
import sqlite3
|
38
|
+
|
39
|
+
import os
|
40
|
+
|
41
|
+
import numpy as np
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
from vectorizer import vect
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
app = Flask(__name__)
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
cur_dir = os.path.dirname(__file__)
|
54
|
+
|
55
|
+
clf = pickle.load(open(os.path.join(cur_dir, 'pkl_objects', 'classifier.pkl'),
|
56
|
+
|
57
|
+
'rb'))
|
58
|
+
|
59
|
+
db = os.path.join(cur_dir, 'reviews.sqlite')
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
def classify(document):
|
64
|
+
|
65
|
+
label = {0: 'negative', 1: 'positive'}
|
66
|
+
|
67
|
+
X = vect.transform([document])
|
68
|
+
|
69
|
+
y = clf.predict(X)[0]
|
70
|
+
|
71
|
+
proba = clf.predict_proba(X).max()
|
72
|
+
|
73
|
+
return label[y], proba
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
def train(document, y):
|
78
|
+
|
79
|
+
X = vect.transform([document])
|
80
|
+
|
81
|
+
clf.partial_fit(X, [y])
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
def sqlite_entry(path, document, y):
|
86
|
+
|
87
|
+
conn = sqlite3.connect(path)
|
88
|
+
|
89
|
+
c = conn.cursor()
|
90
|
+
|
91
|
+
c.execute("INSERT INTO review_db (review, sentiment, date)"\
|
92
|
+
|
93
|
+
" VALUES (?, ?, DATETIME('now'))", (document, y))
|
94
|
+
|
95
|
+
conn.commit()
|
96
|
+
|
97
|
+
conn.close()
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
class ReviewForm(Form):
|
102
|
+
|
103
|
+
moviereview = TextAreaField('',
|
104
|
+
|
105
|
+
[validators.DataRequired(),
|
106
|
+
|
107
|
+
validators.length(min=15)])
|
108
|
+
|
109
|
+
@app.route('/')
|
110
|
+
|
111
|
+
def index():
|
112
|
+
|
113
|
+
form = ReviewForm(request.form)
|
114
|
+
|
115
|
+
return render_template('reviewform.html', form=form)
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
@app.route('/results', methods=['POST'])
|
120
|
+
|
121
|
+
def results():
|
122
|
+
|
123
|
+
form = ReviewForm(request.form)
|
124
|
+
|
125
|
+
if request.method == 'POST' and form.validate():
|
126
|
+
|
127
|
+
review = request.form['moviereview']
|
128
|
+
|
129
|
+
y, proba = classify(review)
|
130
|
+
|
131
|
+
return render_template('results.html',
|
132
|
+
|
133
|
+
content=review,
|
134
|
+
|
135
|
+
prediction=y,
|
136
|
+
|
137
|
+
probability=round(proba*100, 2))
|
138
|
+
|
139
|
+
return render_template('reviewform.html', form=form)
|
140
|
+
|
141
|
+
|
142
|
+
|
143
|
+
@app.route('/thanks', methods=['POST'])
|
144
|
+
|
145
|
+
def feedback():
|
146
|
+
|
147
|
+
feedback = request.form['feedback_button']
|
148
|
+
|
149
|
+
review = request.form['review']
|
150
|
+
|
151
|
+
prediction = request.form['prediction']
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
inv_label = {'negative': 0, 'positive': 1}
|
156
|
+
|
157
|
+
y = inv_label[prediction]
|
158
|
+
|
159
|
+
if feedback == 'Incorrect':
|
160
|
+
|
161
|
+
y = int(not(y))
|
162
|
+
|
163
|
+
train(review, y)
|
164
|
+
|
165
|
+
sqlite_entry(db, review, y)
|
166
|
+
|
167
|
+
return render_template('thanks.html')
|
168
|
+
|
169
|
+
|
170
|
+
|
171
|
+
if __name__ == '__main__':
|
172
|
+
|
173
|
+
app.run()
|
174
|
+
|
175
|
+
```
|
176
|
+
|
177
|
+
|
178
|
+
|
27
179
|
エラーログは以下です。
|
28
180
|
|
29
181
|
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'
|