diff --git a/250709_DIW_2506B_TEST.xlsx b/250709_DIW_2506B_TEST.xlsx new file mode 100644 index 0000000..bcf2807 Binary files /dev/null and b/250709_DIW_2506B_TEST.xlsx differ diff --git a/250709_DIW_2506B_채점결과.xlsx b/250709_DIW_2506B_채점결과.xlsx new file mode 100644 index 0000000..83b6a9e Binary files /dev/null and b/250709_DIW_2506B_채점결과.xlsx differ diff --git a/250709_DIW_2506C_TEST.xlsx b/250709_DIW_2506C_TEST.xlsx new file mode 100644 index 0000000..62c6372 Binary files /dev/null and b/250709_DIW_2506C_TEST.xlsx differ diff --git a/250709_DIW_2506C_채점결과.xlsx b/250709_DIW_2506C_채점결과.xlsx new file mode 100644 index 0000000..073ea9b Binary files /dev/null and b/250709_DIW_2506C_채점결과.xlsx differ diff --git a/DIW_2506A.json b/DIW_2506A.json index e1dea04..a72ac94 100644 --- a/DIW_2506A.json +++ b/DIW_2506A.json @@ -176,11 +176,11 @@ "item": "문구 (● 홍보안내 ●)/① 글씨체 (돋움)" }, "16": { - "path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align", - "searchValue": "홍보안내", + "path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{match_str}')]/ancestor::P/@ParaShape]/@Align", + "match_str": "홍보안내", "value": "Center", "points": 1, - "category": "OneAnswer", + "category": "Align", "item": "문구 (● 홍보안내 ●)/② 정렬 (가운데 정렬)" }, "17": { diff --git a/DIW_2506B.json b/DIW_2506B.json index a44bcb6..578cded 100644 --- a/DIW_2506B.json +++ b/DIW_2506B.json @@ -169,18 +169,18 @@ }, "15": { "path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape", - "searchValue": "★ 사업안내 ★", + "searchValue": "사업안내", "value": "돋움", "points": 1, "category": "FontName", "item": "문구 (★ 사업안내 ★)/① 글씨체 (돋움)" }, "16": { - "path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align", - "searchValue": "★ 사업안내 ★", + "path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{match_str}')]/ancestor::P/@ParaShape]/@Align", + "match_str": "사업안내", "value": "Center", "points": 1, - "category": "OneAnswer", + "category": "Align", "item": "문구 (★ 사업안내 ★)/② 정렬 (가운데 정렬)" }, "17": { diff --git a/DIW_2506C.json b/DIW_2506C.json index e83b913..d3b2a3b 100644 --- a/DIW_2506C.json +++ b/DIW_2506C.json @@ -176,11 +176,11 @@ "item": "문구 (◈ 행사안내 ◈)/① 글씨체 (돋움)" }, "16": { - "path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align", - "searchValue": "행사안내", + "path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{match_str}')]/ancestor::P/@ParaShape]/@Align", + "match_str": "행사안내", "value": "Center", "points": 1, - "category": "OneAnswer", + "category": "Align", "item": "문구 (◈ 행사안내 ◈)/② 정렬 (가운데 정렬)" }, "17": { diff --git a/DIW_2506D.json b/DIW_2506D.json index 8c890fb..b17c167 100644 --- a/DIW_2506D.json +++ b/DIW_2506D.json @@ -176,11 +176,11 @@ "item": "문구 (◇ 행사안내 ◇)/① 글씨체 (돋움)" }, "16": { - "path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align", - "searchValue": "행사안내", + "path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{match_str}')]/ancestor::P/@ParaShape]/@Align", + "match_str": "행사안내", "value": "Center", "points": 1, - "category": "OneAnswer", + "category": "Align", "item": "문구 (◇ 행사안내 ◇)/② 정렬 (가운데 정렬)" }, "17": { diff --git a/diwScoring2.py b/diwScoring2.py index 12cd408..1b5a09b 100644 --- a/diwScoring2.py +++ b/diwScoring2.py @@ -73,9 +73,12 @@ class XMLScorer: if xml_type == "hml": all_text = root.xpath(f"//BODY//text() | //TEXTART/@Text") if root is not None else [] - if xml_type == "chart": + elif xml_type == "chart": all_text = root.xpath(f"//c:chart//text()", namespaces=namespaces) if root is not None else [] + else: + all_text = [] + # 유사도 비교 max_score = 0 similar_text = '' @@ -368,7 +371,23 @@ class XMLScorer: self.evaluate_answer(scoring, user_answer, right_answer, points) - + # [1-16] ◈ 행사안내 ◈ + # 특수문자와 글자의 속성이 같고 문서 내부에 '행사안내'와 같은 문자가 있을 경우 + # 유사도 문제로 의도치 않은 부분의 속성이 채점되는것을 방지하고자 + # 해당 문자를 포함하는 모든 문단의 속성을 판단해 + # 정렬값이 정답과 일치하는 경우 정답으로 채점 + elif (category or "") == "Align": + match_str = criterion.get('match_str', None) + + xpath = xpath.replace('{match_str}', match_str) + items = root.xpath(xpath) + + for item in items: + user_answer = item + self.evaluate_answer(scoring, user_answer, right_answer, points) + if scoring['points'] > 0: + break + # 정답이 하나인 경우 # elif (category or "") == "OneAnswer": elif (category or "") in ["OneAnswer", "ChartOneAnswer"]: @@ -1230,10 +1249,10 @@ def main(): # 채점하고자 하는 유형은 주석 해제 exam_types = [ - 'A', - 'B', + # 'A', + # 'B', 'C', - 'D', + # 'D', ] test_mode = False diff --git a/zzz.xbook b/zzz.xbook index 8331867..b786044 100644 --- a/zzz.xbook +++ b/zzz.xbook @@ -1 +1 @@ -[{"kind":2,"language":"xpath","value":"//a:t[text()='클라우드 보안투자']/ancestor::a:r//a:ea/@typeface"},{"kind":2,"language":"xpath","value":"boolean(//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕' and //CHARSHAPE/@Height='1000' and //PARASHAPE/PARAMARGIN/@LineSpacing='160' and //PARASHAPE/@Align='Justify')"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕'"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕' and //CHARSHAPE/@Height='1000' and //PARASHAPE/PARAMARGIN/@LineSpacing='160' and //PARASHAPE/@Align='Justify')"},{"kind":2,"language":"xpath","value":"//TEXT[CHAR[text()='태']]/@CharShape"},{"kind":2,"language":"xpath","value":"//PICTURE/IMAGE/@BinItem"},{"kind":2,"language":"xpath","value":"//BINITEM[@BinData=//PICTURE/IMAGE/@BinItem][@Format=\"JPG\"]"},{"kind":2,"language":"xpath","value":"//P[.//FIELDBEGIN[@Type='Hyperlink'] and .//CHAR[contains(., 'http')]]"},{"kind":2,"language":"xpath","value":"//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true')]/@HorzOffset"},{"kind":2,"language":"xpath","value":"//CHAR[contains(string(.), '※')]/descendant-or-self::text()"},{"kind":2,"language":"xpath","value":"//P[@ParaShape=\"17\"]/TEXT[@CharShape='7']//CHAR[string(.)]"},{"kind":2,"language":"xpath","value":"//CHAR[contains(string(.), '기타')]/text()"}] \ No newline at end of file +[{"kind":2,"language":"xpath","value":"//a:t[text()='클라우드 보안투자']/ancestor::a:r//a:ea/@typeface"},{"kind":2,"language":"xpath","value":"boolean(//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕' and //CHARSHAPE/@Height='1000' and //PARASHAPE/PARAMARGIN/@LineSpacing='160' and //PARASHAPE/@Align='Justify')"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕'"},{"kind":2,"language":"xpath","value":"//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE/FONTID/@Hangul]/@Name='바탕' and //CHARSHAPE/@Height='1000' and //PARASHAPE/PARAMARGIN/@LineSpacing='160' and //PARASHAPE/@Align='Justify')"},{"kind":2,"language":"xpath","value":"//PARASHAPE[@Id=//CHAR[contains(text(),'사업안내')]/ancestor::P/@ParaShape]/@Align"},{"kind":2,"language":"xpath","value":"//CHAR[contains(text(),'행사안내')]"},{"kind":2,"language":"xpath","value":"//BINITEM[@BinData=//PICTURE/IMAGE/@BinItem][@Format=\"JPG\"]"},{"kind":2,"language":"xpath","value":"//P[.//FIELDBEGIN[@Type='Hyperlink'] and .//CHAR[contains(., 'http')]]"},{"kind":2,"language":"xpath","value":"//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true')]/@HorzOffset"},{"kind":2,"language":"xpath","value":"//CHAR[contains(string(.), '※')]/descendant-or-self::text()"},{"kind":2,"language":"xpath","value":"//P[@ParaShape=\"17\"]/TEXT[@CharShape='7']//CHAR[string(.)]"},{"kind":2,"language":"xpath","value":"//CHAR[contains(string(.), '기타')]/text()"}] \ No newline at end of file