Skip to content

문종 프로젝트

krikit edited this page Jan 31, 2019 · 1 revision

문종 코퍼스는 세종 코퍼스의 오류를 수정한 버전을 일컫는 명칭으로 이러한 일련의 작업을 문종 프로젝트라 명명했습니다. 그 결과물의 공개를 제안하는 논문을 발표한 적도 있고, 회사 내부적으로 법률팀에 검토도 해봤으며, 국립국어원에 문의도 해봤지만, 원 저작물인 뉴스 기사나 문학 작품이 저작권을 갖는 창작물이라 아쉽게도 재배포는 불가능하다는 결론에 이른 상황입니다.

그럼에도 논문에서 제안한 패치 방법을 구현한 프로그램이나, 저희가 코퍼스에 오류를 수정하기 위해 적용한 스크립트의 일부는 공개가 가능하므로 이렇게 소개를 드립니다.

본 글에서 소개하는 스크립트들은 khaiii 저장소 아래 munjong 디렉터리에 있습니다.

패치 스크립트

패치 생성

세종 코퍼스 원본이 있고, 이를 수정한 수정본이 있다면 이 두 코퍼스를 비교하여 다른 부분만 추출하여 저장한 것을 패치라 하며, 다음과 같이 실행하여 패치를 생성합니다.

./make_patch.py -o sejong_original -m sejong_modified -p sejong_patch

-o sejong_original 옵션은 세종 형태분석 코퍼스가 있는 디렉터리를 말합니다. 세종 원본 코퍼스는 UTF-16으로 인코딩 되어 있으며, 만약 다른 인코딩으로 저장하셨다면, --org-enc UTF-8과 같이 올바른 옵션으로 지정해 줘야 합니다.

-m sejong_modified 옵션은 수정한 세종 코퍼스가 있는 디렉터리를 말합니다. 파일의 인코딩은 기본적으로 UTF-8로 간주하며, 마찬가지로 --mod-enc EUC-KR 옵션으로 지정해 줄 수 있습니다.

-p sejong_patch 옵션은 생성된 패치를 저장할 디렉터리입니다.

원본의 sejong_original/BTAA0001.txt 파일은 수정본의 sejong_modified/BTAA0001.txt 파일과 비교하게 되고 그 결과 패치는 sejong_patch/BTAA0001.patch 파일로 저장됩니다. 아래는 생성된 패치 내용의 예시입니다.

M	BTAA0001-00000487	BTAA0001-00000488
S	BTAE0200-00042670	BTAE0200-00042671
=	BTAA0001-00000013	세계적인    세계/NNG + 적/XSN + 이/VCP + ㄴ/ETM
+	BTAA0001-00002544-1	적십자의료센터  적십자/NNG + 의료/NNG + 센터/NNG
-	BTBZ0074-00028385

각각의 패치 타입에 대한 간단한 설명은 아래와 같습니다.

타입 설명
M 두 문장을 하나의 문장으로 합침
S 하나의 문장을 두 문장으로 분리
= 해당 어절을 패치 내용으로 대체
+ 해당 어절을 삽입
- 해당 어절을 삭제

패치 적용

세종 코퍼스 원본에 생성한 패치를 적용하여 수정본을 아래와 같이 생성할 수 있습니다.

./apply_patch.py -o sejong_original -p sejong_patch -m sejong_modified

옵션은 패치 생성 스크립트와 동일한 의미입니다. 다만 적용 과정에서는 패치가 입력이고, 수정된 코퍼스가 출력이라는 점이 다릅니다.

기타 스크립트

전처리

  • 인코딩 변환
    • 우선 아래와 같은 명령으로 UTF-16 인코딩으로 저장된 세종 코퍼스를 UTF-8 인코딩으로 변환합니다. (iconv 프로그램의 설치 및 사용법은 생략합니다.)
for i in $(ls sejong_original/*.txt); do iconv -f UTF-16 -t UTF-8 ${i} > sejong_modified/$(basename ${i}); done
  • 개행 문자 변환
    • 그 다음 아래와 같은 명령으로 윈도우 스타일의 개행 문자를 유닉스 스타일로 변환합니다. (dos2unix 프로그램의 설치 및 사용법은 생략합니다.)
for i in $(ls sejong_modified/*.txt); do dos2unix ${i}; done
  • NA 태그 치환
    • 마지막으로 아래와 같은 명령으로 NA 태그를 khaiii에서 사용하는 ZZ 태그로 치환합니다.
for i in $(ls sejong_modified/*.txt); do sed "s/\\/NA/\\/ZZ/g" ${i} > output/$(basename ${i}); done

convert_jamo_to_compat.py

세종 코퍼스에 포함된 한글 자모 영역의 자소 'ㄴ', 'ㄹ', 'ㅁ', 'ㅂ' 등을 호환 영역으로 변환하는 스크립트입니다.

fix_final_symbol_error.py

어절의 마지막에 나타난 기호들(. , ")이 분석 결과에 빠져있는 오류를 자동으로 수정하는 스크립트입니다.

recover_english_case.py

어절의 원문과 분석 결과에 나타난 영어 문자의 대소문자가 다른 경우 원문의 값으로 복원하는 스크립트입니다.

recover_raw_morph_mismatch.py

어절의 원문과 형태소 분석 결과의 문자가 정규화하면 같지만 코드가 다른 경우 원문의 문자로 복원하는 스크립트입니다.

recover_wide_quotation.py

어절 원문의 전각 따옴표들이 분석 결과에서 반각 ascii 문자로 기술된 경우 원문의 문자로 복원하는 스크립트입니다. 만약 따옴표의 개수가 서로 다를 경우 오류를 표시합니다.

remove_sejong_period_error.py

특정한 패턴의 알려진 마침표 오류가 있는 어절 다음에 문장 분리가 나타난 경우 잘못된 문장 분리로 보고 이를 수정하는 스크립트입니다.

detect_sejong_period_error.py

세종 코퍼스에 나타난 마침표 오류가 의심되는 부분을 출력하는 스크립트입니다. 이 스크립트는 자동으로 변환하는 것이 아니라 출력된 결과를 사람이 보고 확인하여 코퍼스를 수정하기위한 것입니다.