* mecab-ko, mecab-ko-dic 환경에서 사용자 사전 추가 과정을 정리
* 사용자 사전 추가 과정에서 LEFT-ID, RIGHT-ID 검색 문제 해결 과정 정리
1. mecab-ko-dic
2. 사용자 사전 반영 과정
3. 사용자 사전 반영 중 발생 문제 정리
4. 최종 사전 반영 과정
4. MeCab
• MeCab
• 일본어를 토큰화하고 품사를 부착하기 위한 오픈 소스 라이브러리
• Conditional Random Fields(CRFs) 알고리즘을 통해 학습
• mecab-ko
• MeCab 엔진에 한국어 특성에 맞는 기능을 추가한 은전한닢 프로젝트의 결과물
• 일본어는 없으나 한국어에는 존재하는 띄어쓰기의 비용 처리가 포함되어 있음
• mecab-ko-dic
• 세종 말뭉치를 사용하여 학습한 형태소 목록과 단어/연접 비용이 정의된 사전
• mecab-ko에서 참조하여 형태소 분석을 진행
• MeCab: https://taku910.github.io/mecab
• 은전한닢 프로젝트: http://eunjeon.blogspot.com/
• mecab-ko: https://bitbucket.org/eunjeon/mecab-ko
• mecab-ko-dic: https://bitbucket.org/eunjeon/mecab-ko-dic
5. mecab-ko-dic 사용자 사전
• 시스템 사전과 사용자 사전의 형식이 동일
• 사용자 사전 작성 시 작성이 힘든 연접 비용과 단어 비용 산출은
관련된 부분은 제공하는 쉘 스크립트가 (./tools/add-userdic.sh) 처리해 줌
• 사용자 사전으로 등록된 단어라도 강제로 출력되는 것은 아님
시스템 사전의 단어들과 비용 경쟁을 통해 결과로 출력됨
• 연접 비용: 형태소가 결합할 때 발생하는 비용
• 단어 비용: 단어 자체가 가지고 있는 비용
• 연접 비용과 단어 비용을 통해 입력받은 문자열에 최소 비용을 가진 경로로 형태소 분석을 진행
6. mecab-ko-dic 사전 형식
• mecab-ko-dic 품사 태그 설명: https://docs.google.com/spreadsheets/d/1-9blXKjtjeKZqsf4NzHeYJCrr49-nXeRF6D80udfcwY/edit#gid=1718487366
표층형 사전 내용이 연결될 문자열
품사 태그 표층형을 구성하는 형태소의 품사 (여러 형태소가 합쳐진 문자열이면 '+' 기호로 구분)
의미 부류 개체명과 유사 (mecab-ko-dic 학습 과정에서 의미 부류 목록이 정의)
종성 유무 표층형의 마지막 글자의 종성 존재 여부
읽기 한글의 경우에만 존재하고 표층형과 동일
7. mecab-ko-dic 사전 형식
• mecab-ko-dic 품사 태그 설명: https://docs.google.com/spreadsheets/d/1-9blXKjtjeKZqsf4NzHeYJCrr49-nXeRF6D80udfcwY/edit#gid=1718487366
타입 *(없음) / Inflect(활용) / Compound(복합 명사) / Preanalysis(기분석)의 네 가지 타입을 지정할 수 있음
첫번째 품사
/ 마지막 품사
Inflect, Preanalysis 타입인 경우 작성되며, 구성하는 첫 번째 형태소와 마지막 형태소의 품사를 작성
(Compound 타입이나 타입이 없는 경우에는 내부 비용 산출 과정에서 영향이 없음)
표현 타입이 지정 시(=복합 형태소일 때) 작성하며 표층형을 구성하는 형태소들의 (표층형/품사/의미 부류)를 작성
8. mecab-ko-dic 사전 형식
• mecab-ko-dic 품사 태그 설명: https://docs.google.com/spreadsheets/d/1-9blXKjtjeKZqsf4NzHeYJCrr49-nXeRF6D80udfcwY/edit#gid=1718487366
LEFT-ID / RIGHT-ID 해당 형태소의 전/후 연접 비용 계산을 위해 사용되는 ID
단어 비용 단어 자체의 비용
- LEFT-ID, RIGHT-ID, 단어 비용은 mecab-ko-dic 프로젝트에서 제공하는 사용자 사전 반영 쉘 스크립트에 의해 자동으로 부착
LEFT-ID
RIGHT-ID
단어 비용
10. 사용자 사전 반영 과정
• 사전 추가
• 사전 컴파일
• 설치
• mecab-ko-dic/user-dic/README.md: https://bitbucket.org/eunjeon/mecab-ko-dic/src/master/final/user-dic/
11. 사전 컴파일
• 사용자 사전 검색
• LEFT/RIGHT-ID 부착, 단어 비용 부착
• 컴파일
• ./tools/add-userdic.sh 소스: https://bitbucket.org/eunjeon/mecab-ko-dic/src/df15a487444d88565ea18f8250330276497cc9b9/final/tools/add-userdic.sh
./tools/add-userdic.sh 소스 중 일부
사용자 사전 검색
LEFT/RIGHT-ID 부착,
단어 비용 할당
컴파일
12. LEFT/RIGHT-ID 부착, 단어 비용 할당
• LEFT/RIGHT-ID는 left-id.def, right-id.def 파일을 검색하여 할당
• 단어 비용은 수동으로 할당할 수 있는 방법이 마땅치 않음
• 은전한닢 프로젝트 - 기분석 데이터에 대한 질문:
https://groups.google.com/forum/#!searchin/eunjeon/%EB%82%B1%EB%A7%90%7Csort:date/eunjeon/nSIjKkhSRTU/K5ecLWU4CgAJ
Q. 말씀해주신 대로 ID와 비용을 수동으로 입력해
보려고 합니다. 그런데 id는 right-id.def와 left-
id.def에서 검색하지만 단어비용은 어느 파일에서
참조해야 하는지 모르겠습니다.
A. 이미 정의 되어 있는 사전의 단어들을 보시고
유사한 단어의 비용을 참고하시어 정의하는
방법이 있을 것 같습니다. (깔끔한 방법은 없네요)
left-id.def
right-id.def
ID 키
단어 비용 부착 관련 Q&A
'*'는 Wildcard로
모든 값에 대해 매칭됨
13. LEFT/RIGHT-ID 부착 과정 (단일 형태소)
ID 검색 키 생성
키 기준 left-id.def,
right-id.def 파일 검색
LEFT-ID,
RIGHT-ID 부착
단일 형태소의 경우, LEFT-ID 검색 키 = <품사 태그>,<의미 부류>,*,<읽기>
RIGHT-ID 검색 키 = <품사 태그>,<의미 부류>,<종성 유무>,<읽기>
'제당,,,,NNG,행위,T,제당,*,*,*,*'의 경우
• LEFT-ID 검색 키: 'NNG,행위,*,제당'
• RIGHT-ID 검색 키: 'NNG,행위,T,제당'
• LEFT-ID: 1785
• RIGHT-ID: 3544
14. LEFT/RIGHT-ID 부착 과정 (복합, Compound)
복합 형태소 + Compound 타입의 경우, LEFT-ID 검색 키 = <품사 태그>,<의미 부류>,*,*
RIGHT-ID 검색 키 = <품사 태그>,<의미 부류>,<종성 유무>,*
'제일제당,,,,NNP,인명,T,*,Compound,
NNG,NNG,제일/NNG/*+제당/NNG/행위'
의 경우
• LEFT-ID 검색 키: 'NNP,인명,*,*'
• RIGHT-ID 검색 키: 'NNP,인명,T,*'
• LEFT-ID: 1786
• RIGHT-ID: 3546
ID 검색 키 생성
키 기준 left-id.def,
right-id.def 파일 검색
LEFT-ID,
RIGHT-ID 부착
15. LEFT/RIGHT-ID 부착 과정 (복합, Preanalysis)
복합 형태소 + Preanalysis 타입의 경우, LEFT-ID 검색 키 = <첫번째 품사>,<의미 부류>,*,*
RIGHT-ID 검색 키 = <마지막 품사>,<의미 부류>,<종성 유무>,*
'CJ제일제당,,,,NNP,인명,T,*,
Preanalysis,SL,NNG,
CJ/SL/*+제일/NNG/*+제당/NNG/행위'
의 경우
• LEFT-ID 검색 키: 'SL,인명,*,*'
• RIGHT-ID 검색 키: 'NNG,인명,T,*'
ID 검색 키 생성
키 기준 left-id.def,
right-id.def 파일 검색
LEFT-ID,
RIGHT-ID 부착
16. LEFT/RIGHT-ID 부착 과정 중 에러
복합 형태소 + Preanalysis 타입의 경우, LEFT-ID 검색 키 = <첫번째 품사>,<의미 부류>,*,*
RIGHT-ID 검색 키 = <마지막 품사>,<의미 부류>,<종성 유무>,*
'CJ제일제당,,,,NNP,인명,T,*,
Preanalysis,SL,NNG,
CJ/SL/*+제일/NNG/*+제당/NNG/행위'
의 경우
• LEFT-ID 검색 키: 'SL,인명,*,*'
• RIGHT-ID 검색 키: 'NNG,인명,T,*'
• LEFT-ID: <검색 불가>
• RIGHT-ID: <검색 불가>
ID 검색 키 생성
키 기준 left-id.def,
right-id.def 파일 검색
LEFT-ID,
RIGHT-ID 부착
Preanalysis 타입 항목 LEFT/RIGHT-ID 부착 중 에러 발생
18. LEFT/RIGHT-ID 부착 과정 중 에러
- 잘못된 '의미 부류'로 검색
복합 형태소 + Preanalysis 타입의 경우, LEFT-ID 검색 키 = <첫번째 품사>,<의미 부류>,*,*
RIGHT-ID 검색 키 = <마지막 품사>,<의미 부류>,<종성 유무>,*
'CJ제일제당,,,,NNP,인명,T,*,
Preanalysis,SL,NNG,
CJ/SL/*+제일/NNG/*+제당/NNG/행위'
의 경우
• LEFT-ID 검색 키: 'SL,인명,*,*'
• RIGHT-ID 검색 키: 'NNG,인명,T,*'
• LEFT-ID: <검색 불가>
• RIGHT-ID: <검색 불가>
ID 검색 키 생성
키 기준 left-id.def,
right-id.def 파일 검색
LEFT-ID,
RIGHT-ID 부착
Preanalysis 타입 항목 LEFT/RIGHT-ID 부착 중 에러 발생
19. LEFT/RIGHT-ID 부착 과정 중 에러
- 잘못된 '의미 부류'로 검색
복합 형태소 + Preanalysis 타입의 경우, LEFT-ID 검색 키 = <첫번째 품사>,<의미 부류>,*,*
RIGHT-ID 검색 키 = <마지막 품사>,<의미 부류>,<종성 유무>,*
'CJ제일제당,,,,NNP,인명,T,*,
Preanalysis,SL,NNG,
CJ/SL/*+제일/NNG/*+제당/NNG/행위'
의 경우
• LEFT-ID 검색 키: 'SL,인명,*,*'
• RIGHT-ID 검색 키: 'NNG,인명,T,*'
• LEFT-ID: <검색 불가>
• RIGHT-ID: <검색 불가>
ID 검색 키 생성
키 기준 left-id.def,
right-id.def 파일 검색
LEFT-ID,
RIGHT-ID 부착
실제 첫 번째, 마지막 형태소의 의미 부류가 아님
LEFT-ID 검색 키: 'SL,*,*,*'
RIGHT-ID 검색 키: 'NNG,행위,T,*'
실제 첫 번째, 마지막 형태소의
의미 부류로 키 생성 시
20. LEFT/RIGHT-ID 부착 과정 중 에러
- 잘못된 '읽기'로 검색
• 품사 중 조사, 접사 등의 경우 형태소 개수가 한정되어 있기 때문에 left-id.def, right-id.def
파일에 '읽기' 컬럼에 대한 Wildcard '*'가 존재하지 않음
• Preanalysis 타입은 '읽기' 컬럼을 Wildcard 처리하고 키 검색을 하기 때문에 오류가 발생
'읽기' 컬럼에 Wildcard가 없어 에러 발생 left-id.def, right-id.def 파일에
'읽기' 컬럼 Wildcard가 없음
21. • 복합 형태소 중 Preanalysis 타입은 LEFT/RIGHT-ID 검색 키가 잘못 생성되고 있었음
• 정확한 검색을 위해 '표현' 컬럼에 작성된 '의미 부류', '읽기' 정보를 사용하여 검색 키를
생성해야 에러 없이 좀 더 정확한 값을 찾을 수 있음
• '의미 부류'는 첫 번째, 마지막 형태소의 '의미 부류' 정보를 가지고 키를 생성해야 함
• left-id.def, right-id.def 파일에서 특정 품사에 대한 Wildcard를 제공하지 않기 때문에,
단순히 '읽기' 정보를 Wildcard '*'로 처리하면 에러가 발생
• 변경한 LEFT-ID 키 값 = <품사 태그>,<첫번째 품사>,<첫번째 형태소 의미 부류>,
<첫번째 품사의 표층형>
• 변경한 RIGHT-ID 키 값 = <품사 태그>,<마지막 품사>,<마지막 형태소 의미 부류>,
<마지막 품사의 표층형>
• 해당 키 값을 가지고 left-id.def, right-id.def 파일을 직접 검색하여 ID 부착
LEFT/RIGHT-ID 부착 에러 정리 및 해결
22. LEFT/RIGHT-ID 부착 에러 처리 전후 예시
기존 구분 변경
CJ제일제당,,,, NNP, 인명, T, *, Preanalysis, SL, NNG, CJ/SL/*+제일/NNG/*+제당/NNG/행위
SL,인명,*,* LEFT-ID 검색 키 SL,*,*,*
NNG,인명,T,* RIGHT-ID 검색 키 NNG,행위,T,제당
검색 불가 LEFT-ID 1796 (SL,*,*,*)
검색 불가 RIGHT-ID 3544 (NNG,행위,T,*)
현재가,,,, NNG+XSN, *, F, *, Preanalysis, NNG, XSN, 현재/NNG/*+가/XSN/*
NNG,*,*,* LEFT-ID 검색 키 NNG,*,*,현재
XSN,*,F,* RIGHT-ID 검색 키 XSN,*,F,가
(NNG,*,*,*) 1780 LEFT-ID 1780 (NNG,*,*,*)
검색 불가 RIGHT-ID 3588 (XSN,*,F,가)
24. 단어 비용 부착
• 단어 비용은 직접 붙일 방법이 없어 기존 쉡 스크립트 처리를 이용
• 기존 과정 이용 시 첫번째 품사, 마지막 품사를 임의로 변경하면 오류를 피할 수 있음
• 첫번째 품사, 마지막 품사를 임의로 변경하고 뒤에 원래 품사를 둔 상태로 단어 비용 부착
• 다만, 위의 변경이 비용 산출에 영향을 주진 않는지 확인이 필요했음
단어 비용 부착 시 에러를 회피하기 위한 변경 예시 ■: 임의로 생성한 품사, ■: 원래 품사
25. 단어 비용 부착 변수 추적
테스트 후 자동 부착되는 단어 비용은 '품사 태그'에만 영향 받음을 확인 (정확하지 않음)
의미 부류, 읽기, 종성 유무,
첫번째/마지막 품사를 변경 시:
단어 비용이 달라지지 않음
품사 태그 변경 시: 단어 비용 차이 존재
26. 시스템/사용자 사전 동일 항목 비용 조정
• 시스템 사전에 등록된 (표층형, 품사) 조합에 대해 사용자 사전에서 정의한 결과로 대체하여
출력하기 위함
• 사용자 사전의 중복된 항목은 시스템 사전의 단어 비용을 사용하도록 변경
(자동으로 부착되는 단어 비용과 시스템 사전의 학습에 의해 부착되는 비용은 다름)
• 시스템 사전의 단어 비용은 임의로 증가 (기존 단어 비용에 +10000으로 진행)
중복된 ('삼성전자', 'NNP') 조합에 대해 사용자 사전을 사용하도록 비용 조정한 결과
(위는 원래 시스템 사전, 아래는 변경 후 시스템 사전과 사용자 사전)
27. 최종 사전 반영 과정
• 사전 추가
• LEFT/RIGHT-ID 부착, 단어 비용 할당
• 사전의 첫번째 품사, 마지막 품사 컬럼 임의로 조정 (LEFT-ID, RIGHT-ID 검색 에러 회피)
• 단어 비용 할당
• 사전 LEFT, RIGHT-ID 수정
• 시스템 사전과 중복된 항목 비용 수정
• 사용자 사전의 단어 비용은 시스템 사전과 같게,
• 시스템 사전의 단어 비용은 증가
• 설치