한글채점 개선버전 1-13문항까지 적용

This commit is contained in:
2025-04-24 18:02:32 +09:00
parent 82fe47a2ff
commit 5d3ff211ea
3 changed files with 180 additions and 4 deletions

164
DIW_2504A_test.json Normal file
View File

@@ -0,0 +1,164 @@
{
"0": {
"0": {
"path": "",
"path2": "",
"points": 0,
"category": "파일저장",
"item": "파일명 (수검번호.hwp/hwpx)"
},
"1": {
"path": "//PAGEMARGIN",
"value": {
"Bottom": 5669,
"Footer": 2834,
"Gutter": 0,
"Header": 2834,
"Left": 5669,
"Right": 5669,
"Top": 5669
},
"tolerance": 1,
"points": 4,
"category": "PageSetting",
"item": "A4용지, 왼쪽/오른쪽/위쪽/아래쪽 (각20mm), 머리말/꼬리말 (10mm), 제본(0mm)"
},
"2": {
"path": "//STYLE[@Name='바탕글']",
"value": {
"FontName": "바탕",
"FontSize": "1000",
"Alignment": "Justify",
"LineSpacing": "160"
},
"points": 4,
"category": "BasicSetting",
"item": "글꼴 (바탕, 10pt), 양쪽정렬, 줄간격 (160%)"
},
"3": {
"path": "",
"searchValue": null,
"value": null,
"points": 40,
"category": "오타감점",
"item": "오타 1개 -1점 / 2503회부터 오타 1개 -1점으로 변경"
}
},
"1": {
"1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "한옥마을사생대회안내",
"value": "궁서",
"points": 1,
"category": "SingleAnswer",
"item": "문구 (한옥마을사생대회안내)/① 글씨체 (궁서)"
},
"2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "한옥마을사생대회안내",
"value": "100,170,92",
"points": 2,
"category": "Color",
"item": "문구 (한옥마을사생대회안내)/② 채우기 : 색상(RGB:100,170,92)"
},
"3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "한옥마을사생대회안내",
"value": "28346",
"points": 2,
"category": "SingleAnswer",
"item": "문구 (한옥마을사생대회안내)/③ 크기-너비 (100mm)"
},
"4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "한옥마을사생대회안내",
"value": "5669",
"points": 2,
"category": "SingleAnswer",
"item": "문구 (한옥마을사생대회안내)/④ 크기-높이 (20mm)"
},
"5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "한옥마을사생대회안내",
"value": "true",
"points": 2,
"category": "SingleAnswer",
"item": "문구 (한옥마을사생대회안내)/⑤ 위치 (글자처럼 취급)"
},
"6": {
"path": "//PARASHAPE[@Id=//TEXTART[@Text='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "한옥마을사생대회안내",
"value": "Center",
"points": 2,
"category": "SingleAnswer",
"item": "문구 (한옥마을사생대회안내)/⑥ 정렬 (가운데 정렬)"
},
"7": {
"path": "//TEXTART[@Text='{searchValue}']",
"path2": null,
"searchValue": "한옥마을사생대회안내",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (한옥마을사생대회안내)/⑦ 글맵시모양 (육안확인)"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
"path2": null,
"searchValue": "자",
"value": {
"Height": 2800,
"Width": 2800
},
"tolerance": 200,
"points": 1,
"category": "TwoLineSize",
"item": "자/① 모양 (2줄)"
},
"9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"path2": null,
"searchValue": "자",
"value": "맑은 고딕",
"points": 1,
"category": "FontName",
"item": "자/② 글씨체 (맑은 고딕)"
},
"10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"path2": null,
"searchValue": "자",
"value": "53,135,145",
"points": 2,
"category": "Color",
"item": "자/③ 면색 : 색상(RGB:53,135,145)"
},
"11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
"path2": null,
"searchValue": "자",
"value": "850",
"points": 2,
"category": "SingleAnswer",
"item": "자/④ 본문과의 간격 : 3.0mm"
},
"12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"path2": null,
"searchValue": "한옥에 대한 체험과 교육이 준비된 사생대회",
"value": "BOLD",
"points": 2,
"category": "FontAttribute",
"item": "문구 (한옥에 대한 체험과 교육이 준비된 사생대회)/① 진하게"
},
"13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"path2": null,
"searchValue": "한옥에 대한 체험과 교육이 준비된 사생대회",
"value": "UNDERLINE",
"points": 2,
"category": "FontAttribute",
"item": "문구 (한옥에 대한 체험과 교육이 준비된 사생대회)/② 밑줄"
}
}
}

View File

@@ -313,14 +313,26 @@ class XMLScorer:
charshape_id = root.xpath(xpath)
if not charshape_id:
charshape_id = None
user_answer = None
else:
font_id = root.xpath(f"//CHARSHAPE[@Id='{charshape_id[0]}']/FONTID/@Hangul")
font_name = root.xpath(f"//FONTFACE[@Lang='Hangul']/FONT[@Id='{font_id[0]}']/@Name")
user_answer = font_name[0]
self.evaluate_answer(scoring, user_answer, right_answer, points, method="equal")
elif "FontAttribute" in (category or ""):
charshape = root.xpath(xpath)
if not charshape:
charshape = None
user_answer = None
else:
font_attribute = charshape[0].find(right_answer)
if font_attribute is not None:
user_answer = font_attribute.tag
self.evaluate_answer(scoring, user_answer, right_answer, points, method="equal")
onePersonResult['score_results'].append(scoring)
print(f'scoring: {scoring}')
onePersonResult['partial_scores'].append({
@@ -609,7 +621,7 @@ class XMLScorer:
def main():
# 시험회차 및 유형
exam_round = '2503'
exam_round = '2504'
exam_types = [
'A',
# 'B',

View File

@@ -1 +1 @@
[{"kind":2,"language":"xpath","value":"boolean(//PARASHAPE[@Id=//CHAR[contains(text(),'기타')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN/@Left=3000 and //PARASHAPE[@Id=//CHAR[contains(text(),'기타')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN/@Indent=-2400)"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul][@Name='바탕']"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Name='바탕']/@Id"},{"kind":2,"language":"xpath","value":"//CHARSHAPE[@Id='6']/FONTID/@Hangul"},{"kind":2,"language":"xpath","value":"//PARASHAPE[@Id='0']/@Align"},{"kind":2,"language":"xpath","value":"boolean(//RECTANGLE[.//CHAR[text()='지']][.//SIZE[(@Height >= 2600 and @Height <= 2800)and(@Width >= 2600 and @Width <= 2800)]])"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TEXT[CHAR[text()='지']]/@CharShape]/FONTID/@Hangul]/@Name"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id={charshape_id}]/FONTID/@Hangul]/@Name"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Id={font_id}]/@Name"},{"kind":2,"language":"xpath","value":"//CHARSHAPE[@Id=//CHAR[contains(text()[1],'전 세계적으로 차량의 수는 약 13억 대가 있고 국내는 약 2,500만 대')]/parent::TEXT/@CharShape][ITALIC]"},{"kind":2,"language":"xpath","value":"//CHAR[contains(text(),'전 세계적으로 차량의 수는 약 13억 대가 있고 국내는 약 2,500만 대')]/parent::TEXT/@CharShape"},{"kind":2,"language":"xpath","value":"//TABLE[1]/ROW[last()]/CELL[last()-1]//FIELDBEGIN[starts-with(@Command, '=AVG') and //TABLE[1]/ROW[last()]/CELL[last()]//FIELDBEGIN[starts-with(@Command, '=AVG')]]"}]
[{"kind":2,"language":"xpath","value":"boolean(//PARASHAPE[@Id=//CHAR[contains(text(),'기타')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN/@Left=3000 and //PARASHAPE[@Id=//CHAR[contains(text(),'기타')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN/@Indent=-2400)"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul][@Name='바탕']"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Name='바탕']/@Id"},{"kind":2,"language":"xpath","value":"//CHARSHAPE[@Id='6']/FONTID/@Hangul"},{"kind":2,"language":"xpath","value":"//PARASHAPE[@Id='0']/@Align"},{"kind":2,"language":"xpath","value":"boolean(//RECTANGLE[.//CHAR[text()='지']][.//SIZE[(@Height >= 2600 and @Height <= 2800)and(@Width >= 2600 and @Width <= 2800)]])"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TEXT[CHAR[text()='지']]/@CharShape]/FONTID/@Hangul]/@Name"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id={charshape_id}]/FONTID/@Hangul]/@Name"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Id={font_id}]/@Name"},{"kind":2,"language":"xpath","value":"//CHARSHAPE[@Id=//CHAR[contains(text()[1],'전 세계적으로 차량의 수는 약 13억 대가 있고 국내는 약 2,500만 대')]/parent::TEXT/@CharShape][ITALIC]"},{"kind":2,"language":"xpath","value":"//CHAR[contains(text(),'전 세계적으로 차량의 수는 약 13억 대가 있고 국내는 약 2,500만 대')]/parent::TEXT/@CharShape"},{"kind":2,"language":"xpath","value":"//CHARSHAPE[@Id=//CHAR[contains(text(),'한옥에 대한 체험과 교육이 준비된 사생대회')]/parent::TEXT/@CharShape]"}]