-
mecab에 사용자사전/기분석 추가하기프로그래밍/자연어처리 2017. 2. 20. 16:28728x90반응형
형태소 분석으로 띄어쓰기를 하다보면
간혹 붙어야 할 것 같은애들이 띄어서 나오는 현상들을 발견할 수 있다. (주로 외래어)
또는 떨어져 줬으면 하는 애들이 붙어서 나올 수도 있을 것이다.
이럴 경우 자신이 원하는 방식으로 띄어쓰기가 되도록 수정하려면
사용자 사전에 해당 단어들을 추가하면 된다.
뉴스 분석을 하면서 회사 이름을 붙여서 분석을 하고 싶어
mecab 사전에 회사 이름 사용자 사전을 추가하려고 한다.
사전에 들어가는 단어 형식 확인하기
https://docs.google.com/spreadsheets/d/1-9blXKjtjeKZqsf4NzHeYJCrr49-nXeRF6D80udfcwY/edit#gid=6
사용자 사전의 위치는 mecab-ko-dic 압축파일을 푼 디렉토리에 있다.
(mecab을 돌릴때 -d 옵션으로 지정하는 디렉토리가 아니다! 처음에 이 디렉토리 확인했는데 없어서 멘붕올뻔)
/home/wiki/mecab/mecab-ko-dic-2.0.1-20150920/user-dic# ll
total 24
drwxrwxr-x 2 stock stock 4096 2월 16 18:58 ./
drwxrwxr-x 4 stock stock 4096 2월 16 18:50 ../
-rw-rw-r-- 1 stock stock 70 3월 1 2015 nnp.csv
-rw-rw-r-- 1 stock stock 40 3월 1 2015 person.csv
-rw-rw-r-- 1 stock stock 166 3월 1 2015 place.csv
-rw-rw-r-- 1 stock stock 1593 5월 17 2015 README.md
사전의 내용을 살펴보자
/home/wiki/mecab/mecab-ko-dic-2.0.1-20150920/user-dic# cat nnp.csv
대우,,,,NNP,*,F,대우,*,*,*,*,*
구글,,,,NNP,*,T,구글,*,*,*,*,*
액시즈,,,,NNP,*,F,액시스,*,*,*,*,*
사전의 엔트리의 형식은 아래와 같다
표층형/0/0/0/품사태그/의미분류/종성유무/읽기/타입/첫번째품사/마지막품사/표현
사전형식 v2.0사전형식 v1.6
예전 사전 형식에서는 lucence에서의 인덱스 표현도 지정할 수 있었다.
표층형/0/0/0/품사태그/의미분류/종성유무/읽기/타입/첫번째품사/마지막품사/표현
- 표층형 : 단어명
- 1785,3543,4267 : 좌문맥ID, 우문맥ID, 단어비용 (자동 생성 처리로 입력)
- 품사태그 : 품사 입력 (mecab-ko-dic 품사 태그를 참조하여 입력)
- 의미분류 : 인명 또는 지명 또는 *
- F : 받침유무 (원 단어의 끝 글자 받침 유무로 T, F 입력)
- 읽기 : 발음 (원 단어의 발음을 입력)
- 타입 : inflected, compound, Preanalysis, *
- 첫번째 품사, 마지막 품사 : 기분석으로 나눠지는 토큰에 대한 각 품사 입력 (mecab-ko-dic 품사 태그를 참조하여 입력)
- 원형 : 토큰 들로 나눠지는 부분 +로 입력 ( 각 토큰 : 표층형/품사태그/의미분류 )
- 인덱스표현 : 토큰 들로 나눠지는 부분 +로 입력 ( 각 토큰: 표층형/품사태그/의미부류/PositionIncrementAttribute/PositionLengthAttribute)
type에서 Compound나 Preanalysis 같은 타입은 mecab-ko-lucene-analyzer에서 인덱스 생성에 정답을 제공하기위해 사용된다. 따라서 가능한 명확한 필드 타입을 주는 것이 좋다. Preanalysis의 경우는 기분석 느낌으로 사용하는 타입이다. 예를들어, '은전한닢' 같은 경우, 복합명사는 아니지만 오분석으로 다음과 같이 Preanalysis 타입으로 등록하여, 인덱스 생성시에 오분석을 방지하는 용도로 사용된다.
은전한닢,0,0,0,NNG+NR+NNG,*,T,은전한닢,Preanalysis,NNG,NNG,은전/NNG/*+한/NR/*+닢/NNG/*
즉 검색엔진 용도로 사용할 거면 타입과 원형을 자세하게 표시해 주는 것이 좋고 그냥 형태소 분석만 사용하면 * 로 표시해주면 되는 것 같다.
가나자와마사오,1788,3544,4111,NNP,인명,F,가나자와마사오,Preanalysis,NNP,NNP,가나자와/NNP/인명+마사오/NNP/인명가나지,1788,3544,4112,NNP,인명,F,가나지,*,*,*,*가나코키시,1788,3544,4111,NNP,인명,F,가나코키시,Preanalysis,NNP,NNP,가나코/NNP/인명+키시/NNP/인명가나파티,1788,3544,4111,NNP,인명,F,가나파티,*,*,*,*가나파티바라트,1788,3544,4111,NNP,인명,F,가나파티바라트,Preanalysis,NNP,NNP,가나파티/NNP/인명+바라트/NNP/인명가나하시,1788,3544,4111,NNP,인명,F,가나하시,*,*,*,*위 인명사전의 엔트리 예시를 참조해서 회사이름 사용자 사전을 생성하였다 (company.csv)AJ네트웍스,,,,NNP,*,F,AJ네트웍스,*,*,*,*AJ렌터카,,,,NNP,*,F,AJ렌터카,*,*,*,*AK홀딩스,,,,NNP,*,F,AK홀딩스,*,*,*,*AP시스템,,,,NNP,*,T,AP시스템,*,*,*,*제이스텍,,,,NNP,*,F,제이스텍,*,*,*,*BGF리테일,,,,NNP,*,F,BGF리테일,*,*,*,*BNK금융지주,,,,NNP,*,F,BNK금융지주,*,*,*,*BYC,,,,NNP,*,F,BYC,*,*,*,*C&S자산관리,,,,NNP,*,F,C&S자산관리,*,*,*,*CJ,,,,NNP,*,F,CJ,*,*,*,*CGV,,,,NNP,*,F,CGV,*,*,*,*E&M,,,,NNP,*,F,E&M,*,*,*,*이제 사용자 사전을 작성하였으니 사전을 다시 빌드해보자.# 사용자 사전 추가 전/home/wiki/mecab/mecab-ko-dic-2.0.1-20150920# lsaclocal.m4 CoinedWord.csv EC.csv Group.csv left-id.def matrix.def NNB.csv Person.csv rewrite.def user-dic XPN.csvAUTHORS config.log EF.csv Hanja.csv MAG.csv missing NNG.csv Place-address.csv right-id.def VA.csv XR.csvautogen.sh config.status EP.csv IC.csv MAJ.csv MM.csv NNP.csv Place.csv Symbol.csv VCN.csv XSA.csvChangeLog configure ETM.csv Inflect.csv Makefile model.bin NorthKorea.csv Place-station.csv sys.dic VCP.csv XSN.csvchar.bin configure.ac ETN.csv INSTALL Makefile.am model.def NP.csv pos-id.def tools VV.csv XSV.csvchar.def COPYING feature.def install-sh Makefile.in NEWS NR.csv Preanalysis.csv unk.def VX.csvclean dicrc Foreign.csv J.csv matrix.bin NNBC.csv Person-actor.csv README unk.dic Wikipedia.csv# 사용자 사전 추가/home/wiki/mecab/mecab-ko-dic-2.0.1-20150920#./tools/add-userdic.sh# 스크립트 실행후 user-dic 폴더에 있던 csv 파일들이 user-nnp.csv, user-place.csv, user-person.csv, user-company.csv 파일로 추가된 것을 볼 수 있다./home/wiki/mecab/mecab-ko-dic-2.0.1-20150920# lsaclocal.m4 config.log EP.csv Inflect.csv Makefile.am NEWS Person-actor.csv rewrite.def user-dic VX.csvAUTHORS config.status ETM.csv INSTALL Makefile.in NNBC.csv Person.csv right-id.def user-nnp.csv Wikipedia.csvautogen.sh configure ETN.csv install-sh matrix.bin NNB.csv Place-address.csv Symbol.csv user-person.csv XPN.csvChangeLog configure.ac feature.def J.csv matrix.def NNG.csv Place.csv sys.dic user-place.csv XR.csvchar.bin COPYING Foreign.csv left-id.def missing NNP.csv Place-station.csv tools VA.csv XSA.csvchar.def dicrc Group.csv MAG.csv MM.csv NorthKorea.csv pos-id.def unk.def VCN.csv XSN.csvclean EC.csv Hanja.csv MAJ.csv model.bin NP.csv Preanalysis.csv unk.dic VCP.csv XSV.csvCoinedWord.csv EF.csv IC.csv Makefile model.def NR.csv README user-company.csv VV.csv# 새로 추가된 파일들 사전으로 컴파일 하기/home/wiki/mecab/mecab-ko-dic-2.0.1-20150920# make installmake[1]: Entering directory `/home/wiki/mecab/mecab-ko-dic-2.0.1-20150920'make[1]: Nothing to be done for `install-exec-am'./bin/mkdir -p '/usr/local/lib/mecab/dic/mecab-ko-dic'/usr/bin/install -c -m 644 model.bin matrix.bin char.bin sys.dic unk.dic left-id.def right-id.def rewrite.def pos-id.def dicrc '/usr/local/lib/mecab/dic/mecab-ko-dic'make[1]: Leaving directory `/home/wiki/mecab/mecab-ko-dic-2.0.1-20150920'# 다시 mecab을 실행시켜 회사 이름으로 테스트/home/wiki/mecab/mecab-ko-dic-2.0.1-20150920# mecab -d /usr/local/lib/mecab/dic/mecab-ko-dic팍스넷팍스넷 NNP,*,T,팍스넷,*,*,*,*EOS에코마케팅에코마케팅 NNP,*,T,에코마케팅,*,*,*,*EOS뉴트리바이오텍뉴트리바이오텍 NNP,*,T,뉴트리바이오텍,*,*,*,*EOS삼성전자삼성전자 NNP,*,F,삼성전자,*,*,*,*EOS네이버네이버 NNP,*,F,네이버,*,*,*,*EOS이제 원하던대로 회사 이름이 붙어서 나오는 것을 확인할 수 있다!참조: https://groups.google.com/forum/#!searchin/eunjeon/%EA%B8%B0%EB%B6%84%EC%84%9D%7Csort:relevance/eunjeon/aOVOlvxbSs0/jNgNwNGb7w0Jhttps://groups.google.com/forum/#!searchin/eunjeon/%EA%B8%B0%EB%B6%84%EC%84%9D%7Csort:relevance/eunjeon/NSRm3juDnCg/ruwjV7xMBgAJ728x90반응형'프로그래밍 > 자연어처리' 카테고리의 다른 글
한국어 뉴스 데이터로 딥러닝 시작하기 - 4. doc2vec 모델 훈련하기 (3) 2017.03.03 word2vec/doc2vec 언어별 데모 사이트 모음 (2) 2017.03.03 sklearn CountVectorizer 클래스 사용법 (0) 2017.02.09 sklearn TF-IDF vectorizer 사용 예시 (0) 2017.02.08 한국어 뉴스 데이터로 딥러닝 시작하기 - 3. 위키 데이터 한국어 형태소 태깅하기 (0) 2016.12.11