관리 메뉴

솜씨좋은장씨

Google Colab에서 mecab-ko-dic 사용자 사전 추가하기! 본문

머신러닝 | 딥러닝/자연어처리

Google Colab에서 mecab-ko-dic 사용자 사전 추가하기!

솜씨좋은장씨 2020. 11. 4. 21:21
728x90
반응형

from konlpy.tag import Mecab
mecab = Mecab()
print(mecab.pos("솜씨좋은장씨의 개발블로그"))

최근 Google Colab에서 mecab에 사용자 사전을 추가하는 방법에 대해서 문의 하시는 분이 많기도 하셨고

저도 mecab에서 사용자 사전을 추가하여 사용해야하는 경우가 생겨 작성해보았습니다.

 

현재 버전에서는 추가하는 단어의 순위나 Compound, Preanalysis 여부는 고려하지 않고 그저 추가만 하는 방법입니다.

 

Google Colaboratory

 

colab.research.google.com

Colab에서 바로 보시고 싶은 분은 위의 링크를 참고 바랍니다.

 

먼저 Colab에서 Mecab-ko-for-Google-Colab 쉘스크립트를 활용하여 Mecab을 설치합니다.

해당 방법은 아래의 링크를 참고 바랍니다.

 

Google Colab에서 Mecab-ko-dic 쉽게 사용하기

요즘 멀티캠퍼스에서 자연어처리에 대한 교육을 받으며 사용했던 은전한닢 프로젝트 라이브러리인 Mecab-ko-dic을 Google Colab에서 간단한 몇가지 명령어를 통하여 설치하고 사용할 수 있도록 Shell S

somjang.tistory.com

from konlpy.tag import Mecab
mecab = Mecab()
print(mecab.pos("솜씨좋은장씨의 개발블로그")

먼저 mecab 설치 후

사용자 사전을 추가하기 전에 솜씨좋은장씨의 개발블로그 라는 문자열을 mecab.pos를 통해 나온 결과를 보면

[('솜씨', 'NNG'), ('좋', 'VA'), ('은', 'ETM'), ('장', 'NNP'), ('씨', 'NNB'), ('의', 'JKG'), ('개발', 'NNG'), ('블로그', 'NNG')]
from konlpy.tag import Mecab

mecab = Mecab()

word_list = ['솜씨좋은장씨', '개발블로그']

for word in word_list:
  print(mecab.pos(word))
[('솜씨', 'NNG'), ('좋', 'VA'), ('은', 'ETM'), ('장', 'NNP'), ('씨', 'NNB')]
[('개발', 'NNG'), ('블로그', 'NNG')]

위와 같이

솜씨좋은장씨 라는 단어가 ('솜씨', 'NNG'), ('좋', 'VA'), ('은', 'ETM'), ('장', 'NNP'), ('씨', 'NNB')

개발블로그라는 단어가 ('개발', 'NNG'), ('블로그', 'NNG')

이렇게 나누어 지는 것을 볼 수 있습니다.

 

이번 글에서는 솜씨좋은장씨 라는 단어와 개발블로그 라는 단어를 추가하는 것을 예시로 적어보겠습니다.

 

먼저 mecab설치 후 생긴 mecab-ko-dic-2.1.1-2018720 디렉토리로 이동합니다.

 

저는 /content 위치에 존재하여 먼저 해당 위치의 mecab-ko-dic-2.1.1-2018720 디렉토리로 이동했습니다.

cd /content/mecab-ko-dic-2.1.1-20180720

여기에서 ls를 활용하여 user-dic 디렉토리가 존재하는지 확인합니다.

ls
aclocal.m4       feature.def  model.def          sys.dic
AUTHORS          Foreign.csv  NEWS               tools/
autogen.sh*      Group.csv    NNBC.csv           unk.def
autom4te.cache/  Hanja.csv    NNB.csv            unk.dic
ChangeLog        IC.csv       NNG.csv            user-dic/
char.bin         Inflect.csv  NNP.csv            user-nnp.csv
char.def         INSTALL      NorthKorea.csv     user-person.csv
clean*           install-sh*  NP.csv             user-place.csv
CoinedWord.csv   J.csv        NR.csv             VA.csv
config.log       left-id.def  Person-actor.csv   VCN.csv
config.status*   MAG.csv      Person.csv         VCP.csv
configure*       MAJ.csv      Place-address.csv  VV.csv
configure.ac     Makefile     Place.csv          VX.csv
COPYING          Makefile.am  Place-station.csv  Wikipedia.csv
dicrc            Makefile.in  pos-id.def         XPN.csv
EC.csv           matrix.bin   Preanalysis.csv    XR.csv
EF.csv           matrix.def   README             XSA.csv
EP.csv           missing*     rewrite.def        XSN.csv
ETM.csv          MM.csv       right-id.def       XSV.csv
ETN.csv          model.bin    Symbol.csv

user-dic 디렉토리가 존재하는 것을 확인하였으면 user-dic 안에 어떤 파일들이 있는지 확인해봅니다.

ls user-dic
nnp.csv  person.csv  place.csv  README.md

nnp.csv 는 명사, person.csv 는 인명, place.csv 는 등록되지 않은 장소에 대한 이름을 등록하는 파일입니다.

 

그럼 nnp.csv를 활용하여 솜씨좋은장씨 와 개발블로그 이 두 개의 단어를 등록해보겠습니다.

 

먼저 기존 nnp.csv를 with open을 활용하여 파일 데이터를 불러옵니다.

with open("./user-dic/nnp.csv", 'r', encoding='utf-8') as f:
  file_data = f.readlines()
file_data
['대우,,,,NNP,*,F,대우,*,*,*,*,*\n', 
 '구글,,,,NNP,*,T,구글,*,*,*,*,*\n']

불러온 데이터를 보면 위와 같이 대우와 구글이 적혀있는 것을 볼 수 있습니다.

 

먼저 대우와 구글 두개의 단어는 새로 등록하고자 하는 단어 그자체이고

NNP는 해당 단어의 형태소 종류,

그 다음 나오는 F와 T는 마지막 글자에 받침이 있는지 없는지 ( 종성여부 ) 를 나타내는 것으로

대우에서 마지막 단어인 우에 받침이 없으니 False의 F

구글에서 마지막 단어인 글에 받침이 있으니 True 의 T 

이렇게 적어주면 됩니다.

 

그 외에 , 나 *로 적혀있는 부분들과 자세한 설명은 아래의 링크를 참고 바랍니다.

 

Mecab-ko-dic 사전관리 방법

C언어, 빅데이터, 검색엔진, 인공지능, 데이터마이닝

openuiz.blogspot.com

 

이번 글에서는 nnp.csv 에 적혀있는 단어들과 같이 간단하게만 등록해보려합니다.

 

먼저 등록할 단어 목록을 list 형태로 만들어 주었습니다.

word_list = ["솜씨좋은장씨", "개발블로그"]

그리고 종성여부를 판단하기 위한 라이브러리 설치와 판단하는 함수를 만들어줍니다.

 

jamo 라이브러리 설치

!pip install jamo

종성 여부를 판단하는 함수

from jamo import h2j, j2hcj


def get_jongsung_TF(sample_text):
    sample_text_list = list(sample_text)
    last_word = sample_text_list[-1]
    last_word_jamo_list = list(j2hcj(h2j(last_word)))
    last_jamo = last_word_jamo_list[-1]

    jongsung_TF = "T"

    if last_jamo in ['ㅏ', 'ㅑ', 'ㅓ', 'ㅕ', 'ㅗ', 'ㅛ', 'ㅜ', 'ㅠ', 'ㅡ', 'ㅣ', 'ㅘ', 'ㅚ', 'ㅙ', 'ㅝ', 'ㅞ', 'ㅢ', 'ㅐ,ㅔ', 'ㅟ', 'ㅖ', 'ㅒ']:
        jongsung_TF = "F"

    return jongsung_TF

 

이렇게 만들었다면 이제 nnp.csv에 단어를 추가합니다.

with open("./user-dic/nnp.csv", 'r', encoding='utf-8') as f:
  file_data = f.readlines()

word_list = ['솜씨좋은장씨', '개발블로그']

for word in word_list:
  jongsung_TF = get_jongsung_TF(word)

  line = '{},,,,NNP,*,{},{},*,*,*,*,*\n'.format(word, jongsung_TF, word)

  file_data.append(line)
with open("./user-dic/nnp.csv", 'w', encoding='utf-8') as f:
  for line in file_data:
    f.write(line)

새롭게 단어를 추가한 리스트를 다시 파일에 작성하고 다시 파일을 열어 확인해보면!

with open("./user-dic/nnp.csv", 'r', encoding='utf-8') as f:
  file_new = f.readlines()
file_new
['대우,,,,NNP,*,F,대우,*,*,*,*,*\n',
 '구글,,,,NNP,*,T,구글,*,*,*,*,*\n',
 '솜씨좋은장씨,,,,NNP,*,F,솜씨좋은장씨,*,*,*,*,*\n',
 '개발블로그,,,,NNP,*,F,개발블로그,*,*,*,*,*\n']

제대로 추가가 된 것을 확인할 수 있습니다.

 

자 이제 거의 다 완료되었습니다.

이번엔 tools 디렉토리가 있는지 확인합니다.

ls
aclocal.m4       feature.def  model.def          sys.dic
AUTHORS          Foreign.csv  NEWS               tools/
autogen.sh*      Group.csv    NNBC.csv           unk.def
autom4te.cache/  Hanja.csv    NNB.csv            unk.dic
ChangeLog        IC.csv       NNG.csv            user-dic/
char.bin         Inflect.csv  NNP.csv            user-nnp.csv
char.def         INSTALL      NorthKorea.csv     user-person.csv
clean*           install-sh*  NP.csv             user-place.csv
CoinedWord.csv   J.csv        NR.csv             VA.csv
config.log       left-id.def  Person-actor.csv   VCN.csv
config.status*   MAG.csv      Person.csv         VCP.csv
configure*       MAJ.csv      Place-address.csv  VV.csv
configure.ac     Makefile     Place.csv          VX.csv
COPYING          Makefile.am  Place-station.csv  Wikipedia.csv
dicrc            Makefile.in  pos-id.def         XPN.csv
EC.csv           matrix.bin   Preanalysis.csv    XR.csv
EF.csv           matrix.def   README             XSA.csv
EP.csv           missing*     rewrite.def        XSN.csv
ETM.csv          MM.csv       right-id.def       XSV.csv
ETN.csv          model.bin    Symbol.csv

tools 디렉토리가 있다면 tools 디렉토리 안에 add-userdic.sh* 라는 쉘스크립트가 있는지 확인합니다.

ls tools
add-userdic.sh*  convert_for_using_store.sh*  mecab-bestn.sh*

확인하였다면 해당 스크립트를 실행하여줍니다.

!bash ./tools/add-userdic.sh

그 다음 make install을 통하여 추가를 완료합니다.

!make install

 

여기까지 하면 이제 솜씨좋은장씨 라는 단어와 개발블로그라는 단어는 정상적으로 등록이 완료되었습니다.

 

이제 제대로 추가가되어 형태소 분석 시 잘 분석이 되는지 확인해보겠습니다.

from konlpy.tag import Mecab

mecab = Mecab()

word_list = ['솜씨좋은장씨', '개발블로그']

for word in word_list:
  print(mecab.pos(word))
[('솜씨좋은장씨', 'NNP')]
[('개발블로그', 'NNP')]
print(mecab.pos("솜씨좋은장씨의 개발블로그"))
[('솜씨좋은장씨', 'NNP'), ('의', 'JKG'), ('개발블로그', 'NNP')]

이제 솜씨좋은장씨 와 개발블로그는 추가한대로 잘 나오는 것을 볼 수 있습니다.

 

다만!

아직 순위조정이나 Compound, Preanalysis 여부는 고려하지 않고 그저 추가만 하였기 때문에

추가한 단어 중에 솜씨와 같이 기존 사전에 존재하고 순위가 더 높은 단어가 존재할 경우

해당 단어로 분리될 수 있습니다.

 

순위 조정 같은 경우는 아래의 링크를 참고하시기 바랍니다.

 

mecab 사전 우선순위 조정

형태소 분석기인 mecab에 사용자 사전을 정의하여 사용하다보면 간혹 사전을 생성했음에도 사전에 입력한 대로 결과가 나오지 않고 단어가 분리되어 나올 때가 있다. 실제로 그러한 경우를 재현

joyhong.tistory.com

읽어주셔서 감사합니다.

728x90
반응형
25 Comments
  • 프로필사진 익명 2020.12.18 00:24 비밀댓글입니다
  • 프로필사진 BlogIcon 솜씨좋은장씨 2020.12.18 14:48 신고 Colab에서 사용자 사전 추가를 시도하셨던 건가요? 아니면 다른 곳에서 추가를 시도하셨던 건가요?
  • 프로필사진 익명 2020.12.18 15:36 비밀댓글입니다
  • 프로필사진 BlogIcon 솜씨좋은장씨 2020.12.18 16:42 신고 일단 제가 위에 포스팅한 내용을 그대로 해보면 문제 없이 진행이 되는것 같은데

    위의 포스팅에 있는 Colab 링크에 있는 방식으로 하셨는데 안되는 것인지

    아니면 다른 방법으로 mecab을 설치하고 다른 방법으로 사용자 사전을 등록하였을때 문제가 발생하는 것인지 궁금합니다.

    솜씨좋은장씨(SOMJANG)
    https://open.kakao.com/o/sMml3GTb

    위의 카카오톡 오픈프로필이나 메일로 좀 더 자세한 내용을 보내주시면 한 번 확인해보겠습니다~
  • 프로필사진 익명 2020.12.21 11:33 비밀댓글입니다
  • 프로필사진 BlogIcon 솜씨좋은장씨 2020.12.21 11:40 신고 아하 잘 되신다니 다행입니다~ 즐거운 하루보내세요~
  • 프로필사진 익명 2020.12.24 12:52 비밀댓글입니다
  • 프로필사진 BlogIcon 솜씨좋은장씨 2020.12.24 15:10 신고 안녕하세요 댓글 남겨주셔서 감사합니다.
    제가 보기에는 우선순위를 설정해주어야 할 것 같습니다. 가난 이라는 단어가 있는 위치나 띄어쓰기 같은 부분에도 영향을 받는 경향이 있어 저도 명확하게 답변을 드리기는 어려울 것 같습니다. 여러 케이스를 테스트해보고 나중에 알게되면 블로그에 글로 남기려고 합니다! 읽어주시고 질문 남겨주셔서 감사합니다!
  • 프로필사진 익명 2020.12.24 15:48 비밀댓글입니다
  • 프로필사진 BlogIcon 솜씨좋은장씨 2020.12.26 16:27 신고 감사합니다~
  • 프로필사진 chomu 2021.05.05 02:22 안녕하세요! 작성자님 포스팅으로 많은 도움 얻고 있습니다. 정말 감사합니다!
    그런데 다름이 아니라, 단어의 우선순위를 정하는 글에서 순위를 변경한 뒤 컴파일을 하라고 나옵니다.
    다른 단계는 잘 따라갈 수 있었으나, colab에 설치된 Mecab의 /content/mecab-ko-dic-2.1.1-20180720/tools 폴더에는 컴파일 파일이 없더라구요.
    혹시나 해서 tools 폴더에 있는 add-userdic.sh, convert_for_using_store.sh, mecab-bestn.sh 총 3개의 파일 중, 첫번째 파일은 글에 나와있듯 유저 사전을 사전에 등록하는 파일이니 제외하고, 나머지 두 파일을 실행해봐도 소용이 없더라구요.
    어떻게 해야할까요?
    포스팅 정말 감사드립니다!
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.05.05 23:04 신고 안녕하세요! 해당 부분은 아직 저도 실시해보지 못하여서 확인해보고 답변드리겠습니다.
  • 프로필사진 BlogIcon chomu 2021.05.05 23:17 앗 그렇군요ㅠㅠ 감사합니다...
  • 프로필사진 chomu 2021.05.06 16:51 윗 댓글 쓴 사람입니다. 해답을 찾았습니다. user-nnp.csv 파일 저장 후
    !make clean
    !make install
    를 실행하면 되더라구요.
    https://mondayus.tistory.com/46
    이 분의 글을 참고했습니다. 다시 한 번 포스팅 감사합니다! 덕분에 정말 많은 도움 되었습니다!!!
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.05.06 16:51 신고 오... 직접 찾아보시고 해결방안까지 남겨주시다니...ㅠㅠㅠ 정말 감사합니다! 알려주신 내용 참고하여 내용도 업데이트하겠습니다! 정말 감사합니다!!!!!
  • 프로필사진 bho 2021.07.20 10:53 안녕하세요. 올려주신 자료 감사히 잘 보고 있습니다.
    위 내용 중에 "bash /content/mecab-ko-dic-2.1.1-20180720/tools/add-userdic.sh" 실행시
    아래와 같은 오류가 나오는데 원인을 알 수 있을까요? 바쁘신 중에 번거롭게 해드려 죄송합니다.
    generating userdic...
    nnp.csv
    /content/mecab-ko-dic-2.1.1-20180720/tools/../model.def is not a binary model. reopen it as text mode...
    person.csv
    /content/mecab-ko-dic-2.1.1-20180720/tools/../model.def is not a binary model. reopen it as text mode...
    place.csv
    /content/mecab-ko-dic-2.1.1-20180720/tools/../model.def is not a binary model. reopen it as text mode...
    /bin/bash ./config.status --recheck
    running CONFIG_SHELL=/bin/bash /bin/bash ./configure --no-create --no-recursion
    Makefile:233: recipe for target 'config.status' failed
    /bin/bash ./config.status --recheck
    running CONFIG_SHELL=/bin/bash /bin/bash ./configure --no-create --no-recursion
    Makefile:233: recipe for target 'config.status' failed
    dictionary.cpp(171) [property.open(param)]
    dictionary.cpp(171) [property.open(param)]
    dictionary.cpp(171) [property.open(param)]
    ./configure: line 1696: syntax error near unexpected token `mecab-ko-dic,'
    ./configure: line 1696: `AM_INIT_AUTOMAKE(mecab-ko-dic, 2.0.0)'
    make: *** [config.status] Error 2
    ./configure: line 1696: syntax error near unexpected token `mecab-ko-dic,'
    ./configure: line 1696: `AM_INIT_AUTOMAKE(mecab-ko-dic, 2.0.0)'
    make: *** [config.status] Error 2
  • 프로필사진 BlogIcon 조은경 2021.07.25 00:07 #포스트와는 조금 달라보이지만, 참고하세요.
    !sudo apt-get install curl git

    !bash <(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)

    !pip install konlpy

    #Menu: Runtime > restart runtime
    from konlpy.tag import Mecab
    mecab = Mecab()
    print(mecab.morphs('한국언어유형론학회의 공부 모임에서 만나요!'))
    #출력:['한국', '언어', '유형', '론', '학회', '의', '공부', '모임', '에서', '만나', '요', '!']

    #두번째 실행 중 출력을 보면, '/tmp/mecab-ko-dic-2.1.1-20180720'에 있는 사전을 "dicdir = /usr/local/lib/mecab/dic/mecab-ko-dic"에 설치를 합니다.

    #/tmp/mecab-ko-dic-2.1.1-20180720/user-dic/에 있는 npp.csv, place.csv를 로컬에 다운받아 적당히 수정하여 다시 올림. 예시)nnp.csv에서 한국언어유형론학회,,,,NNP,*,F,한국언어유형론학회,*,*,*,*,* place.csv에서 한국언어유형론학회,,,,NNP,지명,T,한국언어유형론학회,Compound,*,*,.....

    !bash /tmp/mecab-ko-dic-2.1.1-20180720/tools/add-userdic.sh

    %cd '/tmp/mecab-ko-dic-2.1.1-20180720/'
    !make clean
    !make install

    from konlpy.tag import Mecab
    mecab = Mecab()
    print(mecab.morphs('한국언어유형론학회의 공부 모임에서 만나요!'))
    출력:['한국언어유형론학회', '의', '공부', '모임', '에서', '만나', '요', '!']

    #코랍은 새 세션은 새로 다 설치해야 하므로... 한글 Mecab은 가급적 로컬에서 써야 할 것 같습니다.



  • 프로필사진 BlogIcon BBOBBOB 2022.05.02 21:38 혹시 문제 해결되었나요?
    같은 오류 발생중이라서 문의드립니다.
  • 프로필사진 BlogIcon 솜씨좋은장씨 2022.05.03 09:45 신고 저도 퇴근하고 한번 확인해보겠습니다.
  • 프로필사진 hohohope 2022.01.10 15:13 안녕하세요!

    mecab 사용자 사전 추가 작업을 하고자, 코랩 환경에서 솜씨좋은장씨님 블로그를 참고해서 mecab을 정말 감사하게 잘 사용하고 있었는데

    22.01.09 일자로 실행할 때, 갑자기 Mecab() 을 불러올 때

    NameError: name 'Tagger' is not defined 오류가 발생하였습니다.

    다른 방식으로 mecab을 설치해도 계속 저런 오류가 발생하네요.

    구글링을 해도 도저히 해답이 나오지 않아서..ㅠㅠ
    이렇게라도 댓글 남겨 봅니다!
  • 프로필사진 BlogIcon 솜씨좋은장씨 2022.01.10 15:21 신고 안녕하세요!
    저도 안되는 것을 방금 알게되어서
    확인해보고 해결하면 업데이트 하도록 하겠습니다~!
  • 프로필사진 BlogIcon hohohope 2022.01.10 16:34 아 그렇군요...!! 정말정말 감사합니다 ㅠㅠ 혹시 제가 지금 프로젝트를 준비 중이라서.. 언제쯤 업데이트가 반영 되는지 알 수 있을까요..?
  • 프로필사진 BlogIcon 솜씨좋은장씨 2022.01.10 16:37 신고 잠깐 확인해봤는데
    bash <(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)

    위의 과정을 실행할때 python-mecab-ko 이게 제대로 빌드되지 않는 것 같기도합니다.

    확실한 것은 아니어서 좀더 새벽에 확인해보고 고칠 수 있는 문제면 고치고 아니면 어떤 문제 인지라도 내일 오전 전에 답변 드리겠습니다.
  • 프로필사진 BlogIcon 솜씨좋은장씨 2022.01.11 08:28 신고 안녕하세요!
    https://github.com/konlpy/konlpy/issues/393
    여기에 isuue를 올려주신 덕분에
    다른 분께서 해결 방법을 찾아주셔서
    해당 부분 반영하여 업데이트 해두었습니다!
    다시 clone을 받으신 뒤에
    기존
    ! bash install_mecab-ko_on_colab190912.sh
    명령어 대신에
    !bash install_mecab-ko_on_colab_light_220111.sh
    명령어를 활용하여 실행해주세요!

    감사합니다~

    좋은 하루 보내세요~
  • 프로필사진 BlogIcon hohohope 2022.01.11 08:52 방금 다시 돌렸는데 정상적으로 잘 돌아갑니다 ㅠㅠㅠㅠㅠㅠ 정말 감사드립니다!!ㅠㅠ
댓글쓰기 폼