Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Testing branch Merge End #9

Merged
merged 6 commits into from
Nov 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 25 additions & 15 deletions Model/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import json
import re
from gpt_response import gpt_response
from lsa_Similar import lsa_Similar
from flask_cors import CORS
app = Flask(__name__) #상태 알아보기2
cors = CORS(app, resources={r"*": {"origins": "https://port-0-docker-essay-score-jvvy2blm7ipnj3.sel5.cloudtype.app"}})
Expand Down Expand Up @@ -76,9 +77,9 @@ def check_distance(X, new_post_vec, contents):
if d < best_dist:
best_dist = d
best_i = i
result = [contents[i]]
result = [contents[0]]
elif d == best_dist:
result.append(contents[i])
result.append(contents[0])

return best_i, best_dist, result

Expand Down Expand Up @@ -159,16 +160,23 @@ def countCheck(quest_num, answer):
if len(answer) > int(max_length):
#print('글자 수가 초과되었습니다.')
result = str(len(answer))+ '자. 글자 수가 초과되었습니다.'
score = 1
if quest_num == 53:
score = 1
else:
score = 2.5
elif len(answer) < int(min_length):
#print('글자 수가 부족합니다.')
result = str(len(answer))+ '자. 글자 수가 부족합니다.'
score = 0
else:
#print('글자 수가 적당합니다')
result = str(len(answer))+ '자. 글자 수가 적당합니다'
score = 2
if quest_num == 53:
score = 2
else:
score = 5
response = {'글자 수 검사' : result, '점수' : score}
print('확인', score)
return response

#53번 표현 가점, 감점
Expand All @@ -187,7 +195,9 @@ def Express(sentence):
pattern = re.compile(r'지만|는데 반해|와 달리|과 달리')
matches = re.findall(pattern, sentence[0])
result = '문장 끝 표현 ' + str(cnt) + '회, 대조표현 사용 ' + str(len(matches)) + '회 사용함.'
result_cnt = cnt*0.5 + len(matches)
result_cnt = -1 * cnt + len(matches)
if result_cnt < 0:
result_cnt = 0
response = {"표현 검사" : result , "점수" : result_cnt}
return response

Expand Down Expand Up @@ -225,20 +235,19 @@ def ExpressShort(sentence, answer):
#점수 계산 함수
def calculate_score53(sim, sp, le, ex):
#53번 기준 30점
#유사도 20점, 맞춤법 5점, 글자 수 2점, 표현 점수 3점
#유사도 22점, 맞춤법 5점, 글자 수 2점, 표현 점수 1점
if sim > 1:
sim = 1
if sp == 0:
sp_score = 5
else:
sp_score = round(5/sp,2)
sp_score = 5 - (0.2 * sp)
if sp_score < 0:
sp_score = 0
if ex >= 3:
ex_score = 3
elif ex> 0:
ex_score = 1
elif ex> 0:
ex_score = 0.5
else:
ex_score = 0
result = round(20 - sim*20,2) + sp_score + le + ex_score
result = round(22*(1-sim),2) + sp_score + le + ex_score
return result
def calculate_score(num, sim, sp, ex):
if sim > 1:
Expand Down Expand Up @@ -277,19 +286,19 @@ def get_score():
response = {'result_score': 0, 's_message': '빈 문자열이라 유사도 검사가 되지 않았습니다.', 'sp_message': '빈 문자열이라 맞춤법 검사가 되지 않았습니다.', 'len_message': '빈 문자열이라 글자 수 검사가 되지 않았습니다.', 'ex_message': '빈 문자열이라 표현 검사가 되지 않았습니다.'}
return jsonify(response)
else:
#사용자 답안과 , 실제 답안 content, answer
similar = similarity(contents, answer)
#사용자 답안 content
spell = pusan_univ_spell(contents)

if quest_num == 53:
#문제와 사용자 답안 question
similar = lsa_Similar(contents, answer)
length = countCheck(quest_num, contents)
#사용자 답안 content
expressto = Express(contents)
len_score = length['점수']#글자수
len_message = length['글자 수 검사']
elif quest_num <= 52:
similar = similarity(contents, answer)
expressto = ExpressShort(contents, answer)
#similar_data = similar.json()
if '에러' in similar:
Expand Down Expand Up @@ -336,6 +345,7 @@ def get_score():
#print(question, quest_con, contents)
length = countCheck(quest_num, contents)
gpt_result = gpt_response(question[0], quest_con[0], contents[0], answer[0], length['글자 수 검사'])
gpt_result['score'] += length['점수']
response = gpt_result
return jsonify(response)

Expand Down
2 changes: 1 addition & 1 deletion Model/gpt_response.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ def gpt_response(question, quest_content, user_answer, answer, length):
user_content = "문제: " + updated_question +"\n" + '제시문: ' + quest_content + "\n\n" + '사용자 답안: ' + user_answer +"\n"+ '예시 답안' + answer
message_info = [{
"role": "system",
"content": "너는 TOPIK(외국인 및 재외국민을 대상으로 하는 한국어 능력 시험)을 가르치는 선생님이야. 문제와 제시문, 그리고 예시 답안이 주어질거야. 사용자 답안이 문제와 제시문의 내용에 맞게 잘 작성되었는지 채점해줘. 글자 수에 대한 지적은 하지마. 예시 답안은 문제와 제시문에 대한 답변 예시라고 생각해줘. 답안은 JSON 형태로 구성되어야하고 점수(45점이 최고점), Good Points, Weak Point로 구성되어야 해."
"content": "너는 TOPIK(외국인 및 재외국민을 대상으로 하는 한국어 능력 시험)을 가르치는 선생님이야. 문제와 제시문, 그리고 예시 답안이 주어질거야. 사용자 답안이 문제와 제시문의 내용에 맞게 잘 작성되었는지 채점해줘. 글자 수에 대한 지적은 하지마. 예시 답안은 문제와 제시문에 대한 답변 예시라고 생각해줘. 답안은 JSON 형태로 구성되어야하고 45점이 최고점인 score, Good Points, Weak Point로 구성되어야 해."
}]
message_info.append({"role":"user","content":user_content})

Expand Down
32 changes: 32 additions & 0 deletions Model/lsa_Similar.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
from sklearn.metrics.pairwise import cosine_similarity
from PyKomoran import * #형태소 분석기 변경

tfidf_vectorizer = TfidfVectorizer()
komoran = Komoran('STABLE')

def preprocess_text(text):
tokens = (komoran.get_plain_text(text)).split(' ')
words = [token.split('/')[0] for token in tokens]
return ' '.join(words)

def lsa_Similar(contents, answer):
contents_preprocessed = preprocess_text(contents[0])
answer_preprocessed = preprocess_text(answer[0])

tfidf_matrix = tfidf_vectorizer.fit_transform([contents_preprocessed, answer_preprocessed])

lsa = TruncatedSVD(n_components=2)
lsa_matrix = lsa.fit_transform(tfidf_matrix)

similarity_matrix = cosine_similarity(lsa_matrix)

response = {
'best_i': 0,
'best_dist': 1 - similarity_matrix[1][0],
'result': contents
}

return response
Loading