Skip to content

오분석 패치

krikit edited this page Jul 23, 2020 · 5 revisions

기계학습 모델에 의해 분석한 결과는 오류가 있을 수 있습니다. 모든 입력에 대해 100% 정확한 형태소 분석기는 현실적으로 불가능합니다. 오분석 패치는 기계학습 모델의 결과로 출력된 오분석을 정분석으로 바로잡기 위한 사용자 사전입니다.

기분석 사전 vs 오분석 패치

기분석 사전과 오분석 패치는 아래와 같은 차이점이 있습니다.

기분석 사전 오분석 패치
기계학습 모델 실행 전에 적용 기계학습 모델의 결과에 적용
분석 속도를 빠르게 함 분석 속도가 느려짐
단일 어절에 한해 적용 가능 어절과 형태소 개수에 제한이 없음

사전 파일

rsc/src 디렉터리 아래에는 네 개의 파일이 존재합니다.

  • base.errpatch.auto: 코퍼스로부터 base 모델의 오분석 패치를 자동으로 추출한 엔트리가 있는 파일
  • base.errpatch.manual: 사용자가 base 모델의 오분석을 수정하기 위해 엔트리를 넣을 파일
  • large.errpatch.auto: 코퍼스로부터 large 모델의 오분석 패치를 자동으로 추출한 엔트리가 있는 파일
  • large.errpatch.manual: 사용자가 large 모델의 오분석을 수정하기 위해 엔트리를 넣을 파일

오분석 패치는 기계학습 모델의 결과에 적용하는 것이므로, base, large 모델에 대해 각각 한쌍씩 존재합니다. 기분석 사전과 마찬가지로 base.errpatch.로 시작하는 모든 파일을 이용하여 빌드합니다. 또한 사전에 엔트리를 추가하여 변경된 경우 반드시 make resource 명령을 통해 사전을 다시 빌드해 줘야 합니다.

사전 포맷

오분석 패치의 포맷은 한 행에 탭으로 구분된 3개의 열이 있는 형태입니다. 아래는 사전 내용 예시입니다.

원문 오분석 정분석
중증급성호흡기증후군 중증급/NNG + 성호흡기/NNG + 증후군/NNG 중증/NNG + 급성/NNG + 호흡기/NNG + 증후군/NNG
된다는 것 되/XSV + ㄴ다/EF + 는/ETM + _ + 것/NNB 되/XSV + ㄴ다는/ETM + _ + 것/NNB
하지만, | + 하지/MAJ + 만/EC + ,/SP | + 하지만/MAJ + ,/SP
# 아래는 설명을 위한 가상의 엔트리입니다.
 복잡하다. _ + 복잡/XR + 하/XSV + 다/EC + ./SF + | _ + 복잡/XR + 하/XSA + 다/EF + ./SF + |
검색질의 | + 검색/NNG + 질/XSN + 의/JKG + | | + 검색/NNG + 질의/NNG + |

원문에 공백을 쓸 수 있으며 이는 어절의 경계를 의미합니다. 만약 원문에 공백이 있다면 오분석 및 정분석에는 그에 대응하는 특수한 형태소인 '_'를 맞춰서 써줘야 합니다. 원문에서 공백을 맨 앞이나 맨 뒤에 넣을 수도 있으므로 지워지지 않게 주의하여 작성하시기 바랍니다.

또 하나 특수한 형태소인 '|'는 입력된 전체의 처음과 끝을 의미합니다. 위 예에서 두 번째 엔트리는 "하지만,"이란 원문이 입력의 맨 앞에 있을 경우에 한해 적용되며, 네 번째 엔트리는 "복잡하다."란 원문이 입력의 맨 뒤에 있을 경우에 한해 적용됩니다. 쉽게 말해 문장의 처음(begin of sentence)과 끝(end of sentence)을 나타내는 것이라 생각하면 됩니다.

마지막 엔트리와 같이 문장의 처음과 끝에 동시에 '|'를 사용하면 문장 내에서 일부가 아니라 정확한 전체 문장에 한해 적용이 가능하므로 부작용을 방지할 수 있습니다. 또한 검색 질의나 짧은 대화문으로 구축한 코퍼스로부터 기계학습 모델이 오분석을 발생하는 경우 자동으로 패치를 생성할 수 있습니다.

사전 빌드

build 디렉터리에서 make resource 명령으로 전체 리소스를 빌드할 수 있지만, 오분석 패치만 별도로 빌드가 가능합니다. 아래 명령을 통해 오분석 패치만 빌드합니다.

cd rsc
mkdir -p ../build/share/khaiii
PYTHONPATH=$(pwd)/lib ./bin/compile_errpatch.py --model-size=base --rsc-src ./src --rsc-dir=../build/share/khaiii

--model-size 옵션은 "base" 혹은 "large" 중 하나로 선택합니다. --rsc-src 옵션은 rsc/src 디렉터리, 즉 base.errpatch.autobase.errpatch.manual 파일이 있는 디렉터리입니다. --rsc-dir 옵션은 ../build/share/khaiii 디렉터리로 바이너리 사전을 출력할 곳입니다. 빌드가 성공하면 아래 세 파일이 생성됩니다.

errpatch.tri
errpatch.len
errpatch.val

사전 로딩

기분석 사전과 마찬가지로 오분석 패치에 새로운 엔트리를 추가하여 빌드한 경우 기존에 배포한 경로, 예를 들여 /usr/local/share/khaiii 혹은 python site-packages 경로에 전체 사전을 다시 복사해 줘야 합니다. 사전의 설치 경로에 관해서는 설치 위치에 관하여 문서를 참고하시기 바랍니다.

아니면, 아래와 같이 사전의 경로를 직접 API의 인자로 전달하여 로딩하여야 합니다.

from khaiii import KhaiiiApi

api = KhaiiiApi(rsc_dir='/path/to/custom/khaiii/dictionary')

음절 단위 정렬

기분석 사전과 마찬가지로 원문의 음절과 분석 결과를 정렬하는 것이 필요합니다. 음절 단위 정렬에 관한 자세한 내용은 CNN 모델 문서기분석 사전 문서를 참고하시기 바랍니다.

알려진 문제

오분석 패치는 하나의 엔트리에서 두 번의 정렬을 수행합니다. 하나는 원문과 오분석의 정렬이고, 또 하나는 원문과 정분석의 정렬입니다. 원문과 정분석의 정렬에서 오류가 나면 기분석 사전 문서에서 설명한 방법대로 rsc/src/char_align.map 파일에 규칙을 추가하여 처리하면 됩니다.

그러나 음절 기반 시스템의 구조적인 이유와 속도 향상을 위해 원문과 오분석도 정렬이 필요합니다. 오분석의 정렬을 위해 rsc/src/char_align.map 파일에 오분석에 관한 규칙을 추가하면 정분석의 정렬에도 영향을 미치게 되므로 하지 말아야 합니다. 따라서 현재로는 원문과 오분석 사이의 정렬에서 오류가 발생할 경우 엔트리를 추가할 수 없습니다. 이 부분은 해결해야 할 과제로, 추후 업데이트될 때까지 기다려 주시길 부탁드립니다. (이 부분에 대해 기여해 주실 분도 적극 환영합니다.)