관리 메뉴

솜씨좋은장씨

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

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

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

사용자 솜씨좋은장씨 2020. 11. 4. 21:21

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

읽어주셔서 감사합니다.

반응형
10 Comments
댓글쓰기 폼