SlideShare a Scribd company logo
1 of 27
mecab-ko-dic 사용자 사전
이찬희
2020. 02. 25.
1. mecab-ko-dic
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
mecab-ko-dic 사용자 사전
• 시스템 사전과 사용자 사전의 형식이 동일
• 사용자 사전 작성 시 작성이 힘든 연접 비용과 단어 비용 산출은
관련된 부분은 제공하는 쉘 스크립트가 (./tools/add-userdic.sh) 처리해 줌
• 사용자 사전으로 등록된 단어라도 강제로 출력되는 것은 아님
시스템 사전의 단어들과 비용 경쟁을 통해 결과로 출력됨
• 연접 비용: 형태소가 결합할 때 발생하는 비용
• 단어 비용: 단어 자체가 가지고 있는 비용
• 연접 비용과 단어 비용을 통해 입력받은 문자열에 최소 비용을 가진 경로로 형태소 분석을 진행
mecab-ko-dic 사전 형식
• mecab-ko-dic 품사 태그 설명: https://docs.google.com/spreadsheets/d/1-9blXKjtjeKZqsf4NzHeYJCrr49-nXeRF6D80udfcwY/edit#gid=1718487366
표층형 사전 내용이 연결될 문자열
품사 태그 표층형을 구성하는 형태소의 품사 (여러 형태소가 합쳐진 문자열이면 '+' 기호로 구분)
의미 부류 개체명과 유사 (mecab-ko-dic 학습 과정에서 의미 부류 목록이 정의)
종성 유무 표층형의 마지막 글자의 종성 존재 여부
읽기 한글의 경우에만 존재하고 표층형과 동일
mecab-ko-dic 사전 형식
• mecab-ko-dic 품사 태그 설명: https://docs.google.com/spreadsheets/d/1-9blXKjtjeKZqsf4NzHeYJCrr49-nXeRF6D80udfcwY/edit#gid=1718487366
타입 *(없음) / Inflect(활용) / Compound(복합 명사) / Preanalysis(기분석)의 네 가지 타입을 지정할 수 있음
첫번째 품사
/ 마지막 품사
Inflect, Preanalysis 타입인 경우 작성되며, 구성하는 첫 번째 형태소와 마지막 형태소의 품사를 작성
(Compound 타입이나 타입이 없는 경우에는 내부 비용 산출 과정에서 영향이 없음)
표현 타입이 지정 시(=복합 형태소일 때) 작성하며 표층형을 구성하는 형태소들의 (표층형/품사/의미 부류)를 작성
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
단어 비용
2. 사용자 사전 반영 과정
사용자 사전 반영 과정
• 사전 추가
• 사전 컴파일
• 설치
• mecab-ko-dic/user-dic/README.md: https://bitbucket.org/eunjeon/mecab-ko-dic/src/master/final/user-dic/
사전 컴파일
• 사용자 사전 검색
• 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 부착,
단어 비용 할당
컴파일
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로
모든 값에 대해 매칭됨
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
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 부착
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 부착
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 부착 중 에러 발생
3. 사용자 사전 반영 중 발생 문제 정리
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 부착 중 에러 발생
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,*'
실제 첫 번째, 마지막 형태소의
의미 부류로 키 생성 시
LEFT/RIGHT-ID 부착 과정 중 에러
- 잘못된 '읽기'로 검색
• 품사 중 조사, 접사 등의 경우 형태소 개수가 한정되어 있기 때문에 left-id.def, right-id.def
파일에 '읽기' 컬럼에 대한 Wildcard '*'가 존재하지 않음
• Preanalysis 타입은 '읽기' 컬럼을 Wildcard 처리하고 키 검색을 하기 때문에 오류가 발생
'읽기' 컬럼에 Wildcard가 없어 에러 발생 left-id.def, right-id.def 파일에
'읽기' 컬럼 Wildcard가 없음
• 복합 형태소 중 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 부착 에러 정리 및 해결
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,가)
4. 최종 사전 반영 과정
단어 비용 부착
• 단어 비용은 직접 붙일 방법이 없어 기존 쉡 스크립트 처리를 이용
• 기존 과정 이용 시 첫번째 품사, 마지막 품사를 임의로 변경하면 오류를 피할 수 있음
• 첫번째 품사, 마지막 품사를 임의로 변경하고 뒤에 원래 품사를 둔 상태로 단어 비용 부착
• 다만, 위의 변경이 비용 산출에 영향을 주진 않는지 확인이 필요했음
단어 비용 부착 시 에러를 회피하기 위한 변경 예시 ■: 임의로 생성한 품사, ■: 원래 품사
단어 비용 부착 변수 추적
테스트 후 자동 부착되는 단어 비용은 '품사 태그'에만 영향 받음을 확인 (정확하지 않음)
의미 부류, 읽기, 종성 유무,
첫번째/마지막 품사를 변경 시:
단어 비용이 달라지지 않음
품사 태그 변경 시: 단어 비용 차이 존재
시스템/사용자 사전 동일 항목 비용 조정
• 시스템 사전에 등록된 (표층형, 품사) 조합에 대해 사용자 사전에서 정의한 결과로 대체하여
출력하기 위함
• 사용자 사전의 중복된 항목은 시스템 사전의 단어 비용을 사용하도록 변경
(자동으로 부착되는 단어 비용과 시스템 사전의 학습에 의해 부착되는 비용은 다름)
• 시스템 사전의 단어 비용은 임의로 증가 (기존 단어 비용에 +10000으로 진행)
중복된 ('삼성전자', 'NNP') 조합에 대해 사용자 사전을 사용하도록 비용 조정한 결과
(위는 원래 시스템 사전, 아래는 변경 후 시스템 사전과 사용자 사전)
최종 사전 반영 과정
• 사전 추가
• LEFT/RIGHT-ID 부착, 단어 비용 할당
• 사전의 첫번째 품사, 마지막 품사 컬럼 임의로 조정 (LEFT-ID, RIGHT-ID 검색 에러 회피)
• 단어 비용 할당
• 사전 LEFT, RIGHT-ID 수정
• 시스템 사전과 중복된 항목 비용 수정
• 사용자 사전의 단어 비용은 시스템 사전과 같게,
• 시스템 사전의 단어 비용은 증가
• 설치

More Related Content

Similar to mecab-ko-dic 사용자 사전

레거시 시스템에 Django 들이밀기
레거시 시스템에 Django 들이밀기레거시 시스템에 Django 들이밀기
레거시 시스템에 Django 들이밀기Jiyong Jung
 
Intro to JavaScript - Week 1: Value, Type, Operator
Intro to JavaScript - Week 1: Value, Type, OperatorIntro to JavaScript - Week 1: Value, Type, Operator
Intro to JavaScript - Week 1: Value, Type, OperatorJeongbae Oh
 
반복적인 코드 작업 자동화, Codebone으로 손쉽게
반복적인 코드 작업 자동화, Codebone으로 손쉽게반복적인 코드 작업 자동화, Codebone으로 손쉽게
반복적인 코드 작업 자동화, Codebone으로 손쉽게Sungju Jin
 
[Apex Trigger 연재강의 6회차] 트리거를 실무에서 어디에 어떻게 사용 하는가?
[Apex Trigger 연재강의 6회차] 트리거를 실무에서 어디에 어떻게 사용 하는가?[Apex Trigger 연재강의 6회차] 트리거를 실무에서 어디에 어떻게 사용 하는가?
[Apex Trigger 연재강의 6회차] 트리거를 실무에서 어디에 어떻게 사용 하는가?JaewonLee153
 
코드잇-타스-특강.pdf
코드잇-타스-특강.pdf코드잇-타스-특강.pdf
코드잇-타스-특강.pdf이정환
 
VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리Gyuwon Yi
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java유리 하
 
ASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdf
ASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdfASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdf
ASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdfSangHoon Han
 
Daejeon IT Developer Conference Hibernate3
Daejeon IT Developer Conference Hibernate3Daejeon IT Developer Conference Hibernate3
Daejeon IT Developer Conference Hibernate3plusperson
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Javajigi Jaesung
 
Rails style-guide-2
Rails style-guide-2Rails style-guide-2
Rails style-guide-2Yunho Jo
 
HTML Form과 배열
HTML Form과 배열HTML Form과 배열
HTML Form과 배열Yoonwhan Lee
 
분석과 설계
분석과 설계분석과 설계
분석과 설계Haeil Yi
 

Similar to mecab-ko-dic 사용자 사전 (20)

레거시 시스템에 Django 들이밀기
레거시 시스템에 Django 들이밀기레거시 시스템에 Django 들이밀기
레거시 시스템에 Django 들이밀기
 
Intro to JavaScript - Week 1: Value, Type, Operator
Intro to JavaScript - Week 1: Value, Type, OperatorIntro to JavaScript - Week 1: Value, Type, Operator
Intro to JavaScript - Week 1: Value, Type, Operator
 
메이크챗봇 자연어기초
메이크챗봇 자연어기초메이크챗봇 자연어기초
메이크챗봇 자연어기초
 
반복적인 코드 작업 자동화, Codebone으로 손쉽게
반복적인 코드 작업 자동화, Codebone으로 손쉽게반복적인 코드 작업 자동화, Codebone으로 손쉽게
반복적인 코드 작업 자동화, Codebone으로 손쉽게
 
[Apex Trigger 연재강의 6회차] 트리거를 실무에서 어디에 어떻게 사용 하는가?
[Apex Trigger 연재강의 6회차] 트리거를 실무에서 어디에 어떻게 사용 하는가?[Apex Trigger 연재강의 6회차] 트리거를 실무에서 어디에 어떻게 사용 하는가?
[Apex Trigger 연재강의 6회차] 트리거를 실무에서 어디에 어떻게 사용 하는가?
 
코드잇-타스-특강.pdf
코드잇-타스-특강.pdf코드잇-타스-특강.pdf
코드잇-타스-특강.pdf
 
VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java
 
Java script
Java scriptJava script
Java script
 
Html5
Html5 Html5
Html5
 
Hibernate 기초
Hibernate 기초Hibernate 기초
Hibernate 기초
 
ASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdf
ASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdfASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdf
ASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdf
 
Daejeon IT Developer Conference Hibernate3
Daejeon IT Developer Conference Hibernate3Daejeon IT Developer Conference Hibernate3
Daejeon IT Developer Conference Hibernate3
 
딥러닝이 바꾸는 애자일 테스팅
딥러닝이 바꾸는 애자일 테스팅딥러닝이 바꾸는 애자일 테스팅
딥러닝이 바꾸는 애자일 테스팅
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
 
Rails style-guide-2
Rails style-guide-2Rails style-guide-2
Rails style-guide-2
 
HTML Form과 배열
HTML Form과 배열HTML Form과 배열
HTML Form과 배열
 
분석과 설계
분석과 설계분석과 설계
분석과 설계
 
Asp.net Razor
Asp.net Razor Asp.net Razor
Asp.net Razor
 
Hibernate5.x
Hibernate5.xHibernate5.x
Hibernate5.x
 

More from 찬희 이

Context2Vec 기반 단어 의미 중의성 해소, Word Sense Disambiguation
Context2Vec 기반 단어 의미 중의성 해소, Word Sense DisambiguationContext2Vec 기반 단어 의미 중의성 해소, Word Sense Disambiguation
Context2Vec 기반 단어 의미 중의성 해소, Word Sense Disambiguation찬희 이
 
의존 구조 분석기, Dependency parser
의존 구조 분석기, Dependency parser의존 구조 분석기, Dependency parser
의존 구조 분석기, Dependency parser찬희 이
 
Word2Vec 개요 및 활용
Word2Vec 개요 및 활용Word2Vec 개요 및 활용
Word2Vec 개요 및 활용찬희 이
 
PySpark 배우기 Ch 06. ML 패키지 소개하기
PySpark 배우기 Ch 06. ML 패키지 소개하기PySpark 배우기 Ch 06. ML 패키지 소개하기
PySpark 배우기 Ch 06. ML 패키지 소개하기찬희 이
 
파이썬을 활용한 금융 분석 Ch 14. The FXCM Trading Platform
파이썬을 활용한 금융 분석 Ch 14. The FXCM Trading Platform파이썬을 활용한 금융 분석 Ch 14. The FXCM Trading Platform
파이썬을 활용한 금융 분석 Ch 14. The FXCM Trading Platform찬희 이
 
파이썬을 활용한 금융 분석 Ch 9. Input Output Operation
파이썬을 활용한 금융 분석 Ch 9. Input Output Operation파이썬을 활용한 금융 분석 Ch 9. Input Output Operation
파이썬을 활용한 금융 분석 Ch 9. Input Output Operation찬희 이
 
은닉 마르코프 모델, Hidden Markov Model(HMM)
은닉 마르코프 모델, Hidden Markov Model(HMM)은닉 마르코프 모델, Hidden Markov Model(HMM)
은닉 마르코프 모델, Hidden Markov Model(HMM)찬희 이
 
단어 의미 중의성 해소, Word Sense Disambiguation(WSD)
단어 의미 중의성 해소, Word Sense Disambiguation(WSD)단어 의미 중의성 해소, Word Sense Disambiguation(WSD)
단어 의미 중의성 해소, Word Sense Disambiguation(WSD)찬희 이
 
Dependency Parser, 의존 구조 분석기
Dependency Parser, 의존 구조 분석기Dependency Parser, 의존 구조 분석기
Dependency Parser, 의존 구조 분석기찬희 이
 
Phrase Tagger, 구문 태거
Phrase Tagger, 구문 태거Phrase Tagger, 구문 태거
Phrase Tagger, 구문 태거찬희 이
 
프로젝트용 PC 환경구성 이찬희
프로젝트용 PC 환경구성   이찬희프로젝트용 PC 환경구성   이찬희
프로젝트용 PC 환경구성 이찬희찬희 이
 

More from 찬희 이 (11)

Context2Vec 기반 단어 의미 중의성 해소, Word Sense Disambiguation
Context2Vec 기반 단어 의미 중의성 해소, Word Sense DisambiguationContext2Vec 기반 단어 의미 중의성 해소, Word Sense Disambiguation
Context2Vec 기반 단어 의미 중의성 해소, Word Sense Disambiguation
 
의존 구조 분석기, Dependency parser
의존 구조 분석기, Dependency parser의존 구조 분석기, Dependency parser
의존 구조 분석기, Dependency parser
 
Word2Vec 개요 및 활용
Word2Vec 개요 및 활용Word2Vec 개요 및 활용
Word2Vec 개요 및 활용
 
PySpark 배우기 Ch 06. ML 패키지 소개하기
PySpark 배우기 Ch 06. ML 패키지 소개하기PySpark 배우기 Ch 06. ML 패키지 소개하기
PySpark 배우기 Ch 06. ML 패키지 소개하기
 
파이썬을 활용한 금융 분석 Ch 14. The FXCM Trading Platform
파이썬을 활용한 금융 분석 Ch 14. The FXCM Trading Platform파이썬을 활용한 금융 분석 Ch 14. The FXCM Trading Platform
파이썬을 활용한 금융 분석 Ch 14. The FXCM Trading Platform
 
파이썬을 활용한 금융 분석 Ch 9. Input Output Operation
파이썬을 활용한 금융 분석 Ch 9. Input Output Operation파이썬을 활용한 금융 분석 Ch 9. Input Output Operation
파이썬을 활용한 금융 분석 Ch 9. Input Output Operation
 
은닉 마르코프 모델, Hidden Markov Model(HMM)
은닉 마르코프 모델, Hidden Markov Model(HMM)은닉 마르코프 모델, Hidden Markov Model(HMM)
은닉 마르코프 모델, Hidden Markov Model(HMM)
 
단어 의미 중의성 해소, Word Sense Disambiguation(WSD)
단어 의미 중의성 해소, Word Sense Disambiguation(WSD)단어 의미 중의성 해소, Word Sense Disambiguation(WSD)
단어 의미 중의성 해소, Word Sense Disambiguation(WSD)
 
Dependency Parser, 의존 구조 분석기
Dependency Parser, 의존 구조 분석기Dependency Parser, 의존 구조 분석기
Dependency Parser, 의존 구조 분석기
 
Phrase Tagger, 구문 태거
Phrase Tagger, 구문 태거Phrase Tagger, 구문 태거
Phrase Tagger, 구문 태거
 
프로젝트용 PC 환경구성 이찬희
프로젝트용 PC 환경구성   이찬희프로젝트용 PC 환경구성   이찬희
프로젝트용 PC 환경구성 이찬희
 

mecab-ko-dic 사용자 사전

  • 2.
  • 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 단어 비용
  • 9. 2. 사용자 사전 반영 과정
  • 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 부착 중 에러 발생
  • 17. 3. 사용자 사전 반영 중 발생 문제 정리
  • 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,가)
  • 23. 4. 최종 사전 반영 과정
  • 24. 단어 비용 부착 • 단어 비용은 직접 붙일 방법이 없어 기존 쉡 스크립트 처리를 이용 • 기존 과정 이용 시 첫번째 품사, 마지막 품사를 임의로 변경하면 오류를 피할 수 있음 • 첫번째 품사, 마지막 품사를 임의로 변경하고 뒤에 원래 품사를 둔 상태로 단어 비용 부착 • 다만, 위의 변경이 비용 산출에 영향을 주진 않는지 확인이 필요했음 단어 비용 부착 시 에러를 회피하기 위한 변경 예시 ■: 임의로 생성한 품사, ■: 원래 품사
  • 25. 단어 비용 부착 변수 추적 테스트 후 자동 부착되는 단어 비용은 '품사 태그'에만 영향 받음을 확인 (정확하지 않음) 의미 부류, 읽기, 종성 유무, 첫번째/마지막 품사를 변경 시: 단어 비용이 달라지지 않음 품사 태그 변경 시: 단어 비용 차이 존재
  • 26. 시스템/사용자 사전 동일 항목 비용 조정 • 시스템 사전에 등록된 (표층형, 품사) 조합에 대해 사용자 사전에서 정의한 결과로 대체하여 출력하기 위함 • 사용자 사전의 중복된 항목은 시스템 사전의 단어 비용을 사용하도록 변경 (자동으로 부착되는 단어 비용과 시스템 사전의 학습에 의해 부착되는 비용은 다름) • 시스템 사전의 단어 비용은 임의로 증가 (기존 단어 비용에 +10000으로 진행) 중복된 ('삼성전자', 'NNP') 조합에 대해 사용자 사전을 사용하도록 비용 조정한 결과 (위는 원래 시스템 사전, 아래는 변경 후 시스템 사전과 사용자 사전)
  • 27. 최종 사전 반영 과정 • 사전 추가 • LEFT/RIGHT-ID 부착, 단어 비용 할당 • 사전의 첫번째 품사, 마지막 품사 컬럼 임의로 조정 (LEFT-ID, RIGHT-ID 검색 에러 회피) • 단어 비용 할당 • 사전 LEFT, RIGHT-ID 수정 • 시스템 사전과 중복된 항목 비용 수정 • 사용자 사전의 단어 비용은 시스템 사전과 같게, • 시스템 사전의 단어 비용은 증가 • 설치