2023. 6. 23. 10:28ใPython
vscode ๊ธฐ๋ณธ
ํ์ด์ฌ_ํ๋ก์ ํธ ํด๋ ํ๋ ์์ฑํ์ฌ vscode์์ ์ด๊ธฐ
ํ์ผ ์์ฑ test.py
์ ์ฉํ ํ์ฅํฉ ์ค์น
Snippet
Trailing Spaces
Prettier - Code formatter
Tabnine AI Autocomplete for Javascript, Python, Typesc
Todo Tree
์ ์ฉํ ๊ธฐ๋ฅ setting
์ ์ฅํ ๋ ๋์์ฐ๊ธฐ ๊ฐ์ ๊ฒ๋ค ์ ๋๋ก ๋ณํํ์ฌ ์ ์ฅํด์ฃผ๋ ๊ธฐ๋ฅ
๋ฆฌํ๋ ์ฌ ๊ธฐ๋ฅ
ctrl + p
๊ฒ์์ฐฝ ๋จ๋ฉด
'>' ์น๊ณ ๋ช ๋ น์ด(? ์น๋ฉด vscode ํ๊ฒฝ ์ค์ ๊ฐ๋ฅ
developer restart ~ : vscode ๋ฉ์ถ๊ฑฐ๋ ์คํ ์ ์ ๋ ๋ ์ฌ์ฉ
ํฐ๋ฏธ๋ ์ผ๊ธฐ
์ ๋ชฉ์ค์ Terminal > new Terminal ํด๋ฆญ
+ ์์ด์ฝ ๋๋ฌ์ git bash ํด๋ฆญ
๊ฐ์ ํ๊ฒฝ ์ค์
ํฐ๋ฏธ๋์ ์๋ ๋ช ๋ น์ด ์น๊ธฐ
python -m venv venv(๊ฐ์ ํ๊ฒฝ ์ด๋ฆ)
ํด๋ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ฉด ๊ฐ์ ํ๊ฒฝ ํด๋ ์์ฑ๋ ๊ฒ ํ์ธ ๊ฐ๋ฅ!
๊ฐ์ ํ๊ฒฝ ์ง์ ๋ช ๋ น์ด
source ./venv/Scripts/activate
๊ฐ์ ํ๊ฒฝ์ ์ง์ ์ฑ๊ณตํ๋ฉด ์๋ ์ด๋ฏธ์ง์ฒ๋ผ ๊ฐ์ํ๊ฒฝ์ด๋ฆ์ด ๋ธ!
*์ฐธ๊ณ ๊ฐ์ ํ๊ฒฝ์์ ๋ฒ์ด๋๋ ๋ช ๋ น์ด
deactivate
ํด๋์ค ์์ฑ ๋ฐ ๊ฐ์ฒด ์์ฑ ๋ฐฉ๋ฒ
#ํด๋์ค ์์ฑ
class TestClass:
var1 = 1
#๊ฐ์ฒด ์์ฑ ->์ ์๋ฏธ : None - ํจ์ ์๋ฌด๊ฒ๋ ๋ฐํ x, int - ์ ์ํ์ ๋ฐํ
# __init__ : java์์์ ์์ฑ์
def __init__(self) -> None:
pass #์์ผ๋ฉด error
def func1(self): #self ๋งค๊ฐ๋ณ์๋ก ๋ฃ์ด์ฃผ๋ฉด java์ this์ ๋์ผ ๊ธฐ๋ฅ
self.var1 = 2
return self.var1
๋ฆฌ๋ทฐ ์์ธก ํ๋ก์ ํธ
์ ํ์ผ ์์ฑ
review_project.py
colab์์ ๋ฆฌ๋ทฐ ์์ธกํ ์ฝ๋ ์ฐจ๋ก๋๋ก ๊ฐ์ ธ์ค๊ธฐ
*์ฐธ๊ณ
๋งค๋ฒ ํ๋ก์ ํธ ํ ๋๋ง๋ค import ๋ฐ install ํด์ผ ํจ
ํฐ๋ฏธ๋์์ ๋ช ๋ น์ด ์คํ
pip install konlpy
import ์ฝ๋ ๊ฐ์ ธ์์ review_project.py ์ฒ์์ ๋ถ์ฌ ๋ฃ์ ํ
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import re
import urllib.request
from konlpy.tag import Okt
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.models import load_model
from keras.preprocessing.text import tokenizer_from_json
print(1)
class ReviewPredict():
review_model
def __init__(self) -> None:
pass
ํฐ๋ฏธ๋์์ ๋ช ๋ น์ด ์คํํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
pip install pandas numpy matplotlib
pip install tensorflow
ํฐ๋ฏธ๋์์ ๋ช ๋ น์ด ์คํํ์ฌ 1 ์ถ๋ ฅ๋๋์ง ํ์ธ
python review_predict.py
๋ง์ฝ ์๋์ ๊ฐ์ ์ค๋ฅ ๋จ๋ ๊ฒฝ์ฐ
๋งจ ์๋์ชฝ url๋ก ์ ์
์ํคํ ์ฒ ๋ค์ด๋ก๋ ํ ๋ช ๋ น์ด ๋ค์ ์คํ
*tip
vscode์์ ํด๋น ๋ณ์๋ช ๋ชจ๋ ๋ฐ๊พธ๊ณ ์ถ์ ๋ f2 ๋๋ฅด๊ณ ๋ณ์๋ช ์ค์ ํ๋ฉด ๋์ผ ๋ณ์๋ช ํ๋ฒ์ ๋ฐ๋.
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ์์
#๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
class ReviewPredict():
data = pd.DataFrame
loaded_model = load_model("best_model.h5")
#์์ฑ์
def __init__(self, data:pd.DataFrame, model_name) -> None:
self.data = data
# self.loaded_model = load_model(model_name)
def process_data(self): #type: ignore
tmp_data = self.data.dropna(how = 'any') #null ๊ฐ์ด ์กด์ฌํ๋ ํ ์ ๊ฑฐ
# ํ๊ธ๊ณผ ๊ณต๋ฐฑ์ ์ ์ธํ๊ณ ๋ชจ๋ ์ ๊ฑฐ, \s : ๊ณต๋ฐฑ(๋น ์นธ)์๋ฏธ
tmp_data['document'] = tmp_data['document'].str.replace("[^ใฑ-ใ
ใ
-ใ
ฃ๊ฐ-ํฃ\s]", "")
#๊ณต๋ฐฑ์ผ๋ก ์์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋น ๊ฐ์ผ๋ก
tmp_data['document'] = tmp_data['document'].str.replace('^ +', "")
#๋น ๊ฐ์ null ๊ฐ์ผ๋ก
tmp_data['document'].replace('', np.nan, inplace=True)
return tmp_data
def sentiment_predict(self, new_sentence):
okt = Okt()
tokenizer = Tokenizer()
stopwords = ['์','๊ฐ','์ด','์','๋ค',
'๋','์ข','์','๊ฑ','๊ณผ','๋',
'๋ฅผ','์ผ๋ก','์','์','์','ํ','ํ๋ค']
max_len = 30
new_sentence = re.sub(r'[^ใฑ-ใ
ใ
-ใ
ฃ๊ฐ-ํฃ ]', '', new_sentence)
new_sentence = okt.morphs(new_sentence, stem=True) #ํ ํฐํ
new_sentence = [word for word in new_sentence if not word in stopwords] #๋ถ์ฉ์ด ์ ๊ฑฐ
encoded = tokenizer.texts_to_sequences([new_sentence]) #์ ์ ์ธ์ฝ๋ฉ
pad_new = pad_sequences(encoded, maxlen = max_len) #ํจ๋ฉ
score = float(self.loaded_model.predict(pad_new)) #์์ธก
if(score > 0.5):
print("{:.2f}% ํ๋ฅ ๋ก ๊ธ์ ๋ฆฌ๋ทฐ์
๋๋ค.\n".format(score * 100))
else :
print("{:.2f}% ํ๋ฅ ๋ก ๋ถ์ ๋ฆฌ๋ทฐ์
๋๋ค.\n".format((1-score) *100 ))
๋ชจ๋ธ ๋ถ๋ฌ์ค๊ธฐ
best_model.h5 ํ์ผ ํ๋ก์ ํธ์ ๊ฐ์ ๊ฒฝ๋ก์ ์ถ๊ฐ
app.py ํ์ผ ์์ฑ
from flask import Flask
app = Flask(__name__)
@app.route('/test1')
def test():
return "Hello"
if __name__ == '__main__':
app.run(debug=True, port=5000)
flask ์ค์น
ํฐ๋ฏธ๋์ ๋ช ๋ น์ด
pip install Flask
์ค์น ํ
pip freeze > requirements.txt ๋ช ๋ น์ด
> ์๋ก์ด ํ์ผ ํ๋ ์์ฑ๋จ.
> ์ค์น๋ ํจํค์ง ๋ชฉ๋ก์ ๋ํ ์ ๋ณด ๋ง๋๋ ๊ฒ
๋ค๋ฅธ ํ๋ก์ ํธ ์์ ์ requirements.txt ์์ ์๋ ํจํค์ง๋ค์ ๋ชจ๋ ์ค์นํ๊ธฐ ์ํด์๋ ์๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅ
pip install -r requirements.txt
๋ช ๋ น์ด ์น๋ฉด ์ด์ ์ ํ๋ install ์์ ์ ํด๋ ํ๋ฒ์ ์ค์น ๊ฐ๋ฅ
- flask์์ get method๋ฅผ ํตํด querystring ๋ฐ์์ค๊ธฐ
from flask import Flask, request
import review_predict as rp
import os
os.environ['JAVA_HOME'] = r'C:\Program Files\Java\jdk-17\bin\server'
app = Flask(__name__)
@app.route("/test")
def test():
sentence = request.args.get("sentence")
return sentence
@app.route("/predict")
def predict_review_good_or_bad():
sentence = request.args.get("sentence")
if sentence == None: return "sentence๋ฅผ ์
๋ ฅํด์ฃผ์ธ์." #์์ธ ์ฒ๋ฆฌ ๋ฌธ์ฅ ์
๋ ฅํ๋ผ๋ return
reviewPredict = rp.ReviewPredict()
result = reviewPredict.sentiment_predict(sentence)
return result
if __name__ == '__main__':
app.run(debug=True, port=5000)
jvm ์ค๋ฅ ๋ฐ์ ์
ํ๊ฒฝ ๋ณ์ ์ค์ ์๋ ๊ฒฝ๋ก ๋ณต์ฌ
์์คํ ์์ฑ์์ ํ๊ฒฝ ๋ณ์ ์ค์
์์คํ ๋ณ์์์ ์๋ก ๋ง๋ค๊ธฐํด์ ๊ฒฝ๋ก ์ถ๊ฐ ํ vscode ์ฌ์คํ
์ ์ค์ ํด๋ ์ ๋ ๊ฒฝ์ฐ ์๋ ์ฝ๋ ์ถ๊ฐ
import os
os.environ['JAVA_HOME'] = r'C:\Program Files\Java\jdk-17\bin\server'
tokenizer.json ํ์ผ vscode์ ์ถ๊ฐ
json ํ์ฅํฉ ์ค์น
์ค์น ํ ์ค์ ์ฐฝ์์ json-zain ๊ฒ์ ํ ์๋ ํญ๋ชฉ ์ฒดํฌ
์ฝ๋ ์์
#๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
class ReviewPredict():
data:pd.DataFrame
loaded_model = load_model("best_model.h5")
tokenizer = None
#์์ฑ์
def __init__(self) -> None:
with open('tokenizer.json') as f:
data = json.load(f)
self.tokenizer = tokenizer_from_json(data)
pass
# self.data = data
# self.loaded_model = load_model(model_name)
def process_data(self): #type: ignore
tmp_data = self.data.dropna(how = 'any') #null ๊ฐ์ด ์กด์ฌํ๋ ํ ์ ๊ฑฐ
# ํ๊ธ๊ณผ ๊ณต๋ฐฑ์ ์ ์ธํ๊ณ ๋ชจ๋ ์ ๊ฑฐ, \s : ๊ณต๋ฐฑ(๋น ์นธ)์๋ฏธ
tmp_data['document'] = tmp_data['document'].str.replace("[^ใฑ-ใ
ใ
-ใ
ฃ๊ฐ-ํฃ\s]", "")
#๊ณต๋ฐฑ์ผ๋ก ์์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋น ๊ฐ์ผ๋ก
tmp_data['document'] = tmp_data['document'].str.replace('^ +', "")
#๋น ๊ฐ์ null ๊ฐ์ผ๋ก
tmp_data['document'].replace('', np.nan, inplace=True)
return tmp_data
def sentiment_predict(self, new_sentence):
okt = Okt()
# tokenizer = Tokenizer()
stopwords = ['์','๊ฐ','์ด','์','๋ค',
'๋','์ข','์','๊ฑ','๊ณผ','๋',
'๋ฅผ','์ผ๋ก','์','์','์','ํ','ํ๋ค']
max_len = 30
new_sentence = re.sub(r'[^ใฑ-ใ
ใ
-ใ
ฃ๊ฐ-ํฃ ]', '', new_sentence)
new_sentence = okt.morphs(new_sentence, stem=True) #ํ ํฐํ
new_sentence = [word for word in new_sentence if not word in stopwords] #๋ถ์ฉ์ด ์ ๊ฑฐ
encoded = self.tokenizer.texts_to_sequences([new_sentence]) #์ ์ ์ธ์ฝ๋ฉ
pad_new = pad_sequences(encoded, maxlen = max_len) #ํจ๋ฉ
score = float(self.loaded_model.predict(pad_new)) #์์ธก
if(score > 0.5):
return "{:.2f}% ํ๋ฅ ๋ก ๊ธ์ ๋ฆฌ๋ทฐ์
๋๋ค.\n".format(score * 100)
else :
return "{:.2f}% ํ๋ฅ ๋ก ๋ถ์ ๋ฆฌ๋ทฐ์
๋๋ค.\n".format((1-score) *100 )
git bash๋ก ๋ค์ด์์ ํฐ๋ฏธ๋์
python app.py ์คํ
ํด๋น ํฌํธ๋ก ์ ์
url+/๊ฒฝ๋ก?sentence=๊ธ/๋ถ์ ํ์ธํ ๋ฌธ์ฅ์น๋ฉด ์๋์ฒ๋ผ ๋์ด!
'Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐ์ดํฐ ๋ถ์ (4) ์ปฌ๋ผ์ ํ์ฉํ ๋ฐ์ดํฐ ํ์ธ (0) | 2023.07.07 |
---|---|
ํ์ด์ฌ ์๋ฐ๋ก ๊ฐ์ ธ์ค๋ ๋ฒ (0) | 2023.06.19 |
๋์๋ณด๋ ์๊ฐํ - vscode๋ก html ์์ฑ (0) | 2023.06.12 |
์น๋ฐ์ดํฐ ํฌ๋กค๋งํ์ฌ csv ์์ฑํ๊ธฐ (0) | 2023.06.07 |
์น ํฌ๋กค๋ง (4) ์คํ๋ฒ ์ค ๋งค์ฅ ์ ๋ณด ํฌ๋กค๋ง (0) | 2023.06.01 |