ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • mecab에 사용자사전/기분석 추가하기
    프로그래밍/자연어처리 2017. 2. 20. 16:28
    728x90
    반응형




    형태소 분석으로 띄어쓰기를 하다보면 

    간혹 붙어야 할 것 같은애들이 띄어서 나오는 현상들을 발견할 수 있다. (주로 외래어) 

    또는 떨어져 줬으면 하는 애들이 붙어서 나올 수도 있을 것이다. 


    이럴 경우 자신이 원하는 방식으로 띄어쓰기가 되도록 수정하려면

    사용자 사전에 해당 단어들을 추가하면 된다. 


    뉴스 분석을 하면서 회사 이름을 붙여서 분석을 하고 싶어 

    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# ls
    aclocal.m4  CoinedWord.csv  EC.csv       Group.csv    left-id.def  matrix.def  NNB.csv           Person.csv         rewrite.def   user-dic       XPN.csv
    AUTHORS     config.log      EF.csv       Hanja.csv    MAG.csv      missing     NNG.csv           Place-address.csv  right-id.def  VA.csv         XR.csv
    autogen.sh  config.status   EP.csv       IC.csv       MAJ.csv      MM.csv      NNP.csv           Place.csv          Symbol.csv    VCN.csv        XSA.csv
    ChangeLog   configure       ETM.csv      Inflect.csv  Makefile     model.bin   NorthKorea.csv    Place-station.csv  sys.dic       VCP.csv        XSN.csv
    char.bin    configure.ac    ETN.csv      INSTALL      Makefile.am  model.def   NP.csv            pos-id.def         tools         VV.csv         XSV.csv
    char.def    COPYING         feature.def  install-sh   Makefile.in  NEWS        NR.csv            Preanalysis.csv    unk.def       VX.csv
    clean       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# ls
    aclocal.m4      config.log     EP.csv       Inflect.csv  Makefile.am  NEWS            Person-actor.csv   rewrite.def       user-dic         VX.csv
    AUTHORS         config.status  ETM.csv      INSTALL      Makefile.in  NNBC.csv        Person.csv         right-id.def      user-nnp.csv     Wikipedia.csv
    autogen.sh      configure      ETN.csv      install-sh   matrix.bin   NNB.csv         Place-address.csv  Symbol.csv        user-person.csv  XPN.csv
    ChangeLog       configure.ac   feature.def  J.csv        matrix.def   NNG.csv         Place.csv          sys.dic           user-place.csv   XR.csv
    char.bin        COPYING        Foreign.csv  left-id.def  missing      NNP.csv         Place-station.csv  tools             VA.csv           XSA.csv
    char.def        dicrc          Group.csv    MAG.csv      MM.csv       NorthKorea.csv  pos-id.def         unk.def           VCN.csv          XSN.csv
    clean           EC.csv         Hanja.csv    MAJ.csv      model.bin    NP.csv          Preanalysis.csv    unk.dic           VCP.csv          XSV.csv
    CoinedWord.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 install
    make[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/jNgNwNGb7w0J 
    https://groups.google.com/forum/#!searchin/eunjeon/%EA%B8%B0%EB%B6%84%EC%84%9D%7Csort:relevance/eunjeon/NSRm3juDnCg/ruwjV7xMBgAJ




    728x90
    반응형

    댓글 1

    • 김범중 2018.04.13 14:45

      안녕하세요. mecab에 user-dic 추가하다가 문제가 생겨서 혹시 같은 문제가 있으셨는지 궁금해서 글 남깁니다.
      Inflect type을 추가할 때, RIGHT-ID를 찾을 수 없다고 나옵니다. (e.g. <그녈,,,,NP+JKO,*,T,그녈,Inflect,NP,JKO,그녀/NP/*+ᆯ/JKO/* > 에서 'ㄹ'을 찾지 못하는 것 같습니다.)
      감사합니다.

Designed by Tistory.