diff --git a/Model/app.py b/Model/app.py index d56e38a..63fafe1 100644 --- a/Model/app.py +++ b/Model/app.py @@ -16,7 +16,7 @@ def index(): return render_template('./index.html') #문장 유사도 -vectorizer = TfidfVectorizer(min_df = 1, decode_error = 'ignore') +vectorizer = TfidfVectorizer(min_df = 1, decode_error = 'ignore', analyzer='word', sublinear_tf=True) def sentence_token(contents): contents_tokens = list() @@ -68,20 +68,19 @@ def dist_raw(v1,v2): return sp.linalg.norm(delta.toarray()) def check_distance(X, new_post_vec, contents): - best_dist = 65535 - best_i = None - result = [] - for i, post_vec in enumerate(new_post_vec): - d = dist_raw(X, post_vec) - #print('== Post %i with dist = %.2f : %s' %(i,d, contents[0])) - if d < best_dist: - best_dist = d - best_i = i - result = [contents[0]] - elif d == best_dist: - result.append(contents[0]) + best_dist = 65535 + best_i = None + result = [] + for i, post_vec in enumerate(new_post_vec): + d = dist_raw(X, post_vec) + if d < best_dist: + best_dist = d + best_i = i + result = [contents[i]] + elif d == best_dist: + result.append(contents[i]) - return best_i, best_dist, result + return best_i, best_dist, result def similarity(contents, new_post): @@ -193,34 +192,32 @@ def Express(sentence): return response #51번, 52번 -def ExpressShort(q_num, sentence, answer): - cnt = 0 +def ExpressShort(sentence, answer): + cnt_Result = [] #print(sentence[:], answer[:]) - if q_num == 51: + for i in range(len(answer)): + cnt = 0 sen = (komoran.get_plain_text(sentence[0]).split(' ')) sen2 = (komoran.get_plain_text(answer[0]).split(' ')) + for i in range(len(sen)): - temp = sen[i].split('/') - sen[i] = temp + temp = sen[i].split('/') + sen[i] = temp for i in range(len(sen2)): - temp = sen2[i].split('/') - sen2[i] = temp - if sen[-1][1] == sen2[-1][1]: + temp = sen2[i].split('/') + sen2[i] = temp + if sen[-1][1] == sen2[-1][1] and sen[-1][0] == sen2[-1][0]: #모든 값이 같은 경우 #print('동일', sen[-1][1], sen2[-1][1]) - cnt+=1 + cnt=1 + elif sen[-1][1] == sen2[-1][1]: #문법 종류는 맞으나 완전히 답안이 같지 않은 경우 + cnt = 0.5 else: #print('비동일', sen[-1][1], sen2[-1][1]) - pass + cnt = 0 + cnt_Result.append(cnt) - elif q_num == 52: - check = (komoran.get_plain_text(sentence[0][:]).split(' ')) - for i in range(len(check)): - temp = check[i].split('/') - check[i] = temp - for i in range(len(check)): #-ㅂ/ 습니다, -아/-어요 - if check[i][0].endswith('ㄴ다') or check[i][0].endswith('다') or check[i][0].endswith('는다') : - cnt+=1 - result = '문장 끝 표현 ' + str(cnt) + '회 사용' + + result = '문장 끝 표현 ' + str(max(cnt_Result)) + '회 사용' response = {"표현 검사" : result , "점수" : cnt} return response @@ -229,6 +226,8 @@ def ExpressShort(q_num, sentence, answer): def calculate_score53(sim, sp, le, ex): #53번 기준 30점 #유사도 20점, 맞춤법 5점, 글자 수 2점, 표현 점수 3점 + if sim > 1: + sim = 1 if sp == 0: sp_score = 5 else: @@ -242,6 +241,8 @@ def calculate_score53(sim, sp, le, ex): result = round(20 - sim*20,2) + sp_score + le + ex_score return result def calculate_score(num, sim, sp, ex): + if sim > 1: + sim = 1 #51번 if num == 51: #print('51번 채점중') @@ -289,7 +290,7 @@ def get_score(): len_score = length['점수']#글자수 len_message = length['글자 수 검사'] elif quest_num <= 52: - expressto = ExpressShort(quest_num, contents, answer) + expressto = ExpressShort(contents, answer) #similar_data = similar.json() if '에러' in similar: s_score = 1 diff --git a/Model/gpt_response.py b/Model/gpt_response.py index 0dabec8..5fc6199 100644 --- a/Model/gpt_response.py +++ b/Model/gpt_response.py @@ -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": "문제와 제시문이 주어지면 사용자 답안을 예시 답안과 비교하여 잘한 점과 부족한 점에 대해 채점해주는 한국어 교사. 만점은 45점 기준이다. 글자 수 지적은 하지 않는다. 답변 형식은 JSON 형식으로 제공한다. Score, Good_Points, Weak_Points로 구성된다." + "content": "너는 TOPIK(외국인 및 재외국민을 대상으로 하는 한국어 능력 시험)을 가르치는 선생님이야. 문제와 제시문, 그리고 예시 답안이 주어질거야. 사용자 답안이 문제와 제시문의 내용에 맞게 잘 작성되었는지 채점해줘. 글자 수에 대한 지적은 하지마. 예시 답안은 문제와 제시문에 대한 답변 예시라고 생각해줘. 답안은 JSON 형태로 구성되어야하고 점수(45점이 최고점), Good Points, Weak Point로 구성되어야 해." }] message_info.append({"role":"user","content":user_content})