일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
- github
- ubuntu
- 파이썬
- SW Expert Academy
- Real or Not? NLP with Disaster Tweets
- Baekjoon
- dacon
- leetcode
- elasticsearch
- gs25
- selenium
- hackerrank
- Docker
- 맥북
- 더현대서울 맛집
- Kaggle
- 자연어처리
- 캐치카페
- 우분투
- 금융문자분석경진대회
- programmers
- 코로나19
- 캐글
- Git
- 백준
- 편스토랑
- 프로그래머스
- AI 경진대회
- 데이콘
- PYTHON
- Today
- 3,549
- Total
- 1,726,734
솜씨좋은장씨
Google Colab에서 mecab-ko-dic 사용자 사전 추가하기! 본문
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
읽어주셔서 감사합니다.
'머신러닝 | 딥러닝 > 자연어처리' 카테고리의 다른 글
Google Colab에서 mecab-ko-dic 사용자 사전 추가하기! (25) | 2020.11.04 |
---|---|
Ubuntu에서 Khaiii 설치하기 (0) | 2020.09.10 |
Windows 에서 Mecab ( mecab 기반 한국어 형태소 분석기 ) 설치하는 방법 (16) | 2020.09.07 |
Google Colab에서 Mecab-ko-dic 쉽게 사용하기 (44) | 2019.09.12 |
Ubuntu 18.04 LTS에 mecab-ko-dic 설치하기 (5) | 2019.09.12 |
Ubuntu에서 Mecab-ko 사용을 위한 개발환경 설정 정리 (2) | 2019.09.08 |
-
솜씨좋은장씨 2020.12.18 14:48 신고 Colab에서 사용자 사전 추가를 시도하셨던 건가요? 아니면 다른 곳에서 추가를 시도하셨던 건가요?
-
솜씨좋은장씨 2020.12.18 16:42 신고 일단 제가 위에 포스팅한 내용을 그대로 해보면 문제 없이 진행이 되는것 같은데
위의 포스팅에 있는 Colab 링크에 있는 방식으로 하셨는데 안되는 것인지
아니면 다른 방법으로 mecab을 설치하고 다른 방법으로 사용자 사전을 등록하였을때 문제가 발생하는 것인지 궁금합니다.
솜씨좋은장씨(SOMJANG)
https://open.kakao.com/o/sMml3GTb
위의 카카오톡 오픈프로필이나 메일로 좀 더 자세한 내용을 보내주시면 한 번 확인해보겠습니다~ -
솜씨좋은장씨 2020.12.21 11:40 신고 아하 잘 되신다니 다행입니다~ 즐거운 하루보내세요~
-
솜씨좋은장씨 2020.12.24 15:10 신고 안녕하세요 댓글 남겨주셔서 감사합니다.
제가 보기에는 우선순위를 설정해주어야 할 것 같습니다. 가난 이라는 단어가 있는 위치나 띄어쓰기 같은 부분에도 영향을 받는 경향이 있어 저도 명확하게 답변을 드리기는 어려울 것 같습니다. 여러 케이스를 테스트해보고 나중에 알게되면 블로그에 글로 남기려고 합니다! 읽어주시고 질문 남겨주셔서 감사합니다! -
솜씨좋은장씨 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개의 파일 중, 첫번째 파일은 글에 나와있듯 유저 사전을 사전에 등록하는 파일이니 제외하고, 나머지 두 파일을 실행해봐도 소용이 없더라구요.
어떻게 해야할까요?
포스팅 정말 감사드립니다!
-
솜씨좋은장씨 2021.05.05 23:04 신고 안녕하세요! 해당 부분은 아직 저도 실시해보지 못하여서 확인해보고 답변드리겠습니다.
-
chomu 2021.05.05 23:17 앗 그렇군요ㅠㅠ 감사합니다...
-
chomu 2021.05.06 16:51 윗 댓글 쓴 사람입니다. 해답을 찾았습니다. user-nnp.csv 파일 저장 후
!make clean
!make install
를 실행하면 되더라구요.
https://mondayus.tistory.com/46
이 분의 글을 참고했습니다. 다시 한 번 포스팅 감사합니다! 덕분에 정말 많은 도움 되었습니다!!! -
솜씨좋은장씨 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 -
조은경 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은 가급적 로컬에서 써야 할 것 같습니다.
-
BBOBBOB 2022.05.02 21:38 혹시 문제 해결되었나요?
같은 오류 발생중이라서 문의드립니다. -
솜씨좋은장씨 2022.05.03 09:45 신고 저도 퇴근하고 한번 확인해보겠습니다.
-
hohohope 2022.01.10 15:13 안녕하세요!
mecab 사용자 사전 추가 작업을 하고자, 코랩 환경에서 솜씨좋은장씨님 블로그를 참고해서 mecab을 정말 감사하게 잘 사용하고 있었는데
22.01.09 일자로 실행할 때, 갑자기 Mecab() 을 불러올 때
NameError: name 'Tagger' is not defined 오류가 발생하였습니다.
다른 방식으로 mecab을 설치해도 계속 저런 오류가 발생하네요.
구글링을 해도 도저히 해답이 나오지 않아서..ㅠㅠ
이렇게라도 댓글 남겨 봅니다! -
솜씨좋은장씨 2022.01.10 15:21 신고 안녕하세요!
저도 안되는 것을 방금 알게되어서
확인해보고 해결하면 업데이트 하도록 하겠습니다~! -
hohohope 2022.01.10 16:34 아 그렇군요...!! 정말정말 감사합니다 ㅠㅠ 혹시 제가 지금 프로젝트를 준비 중이라서.. 언제쯤 업데이트가 반영 되는지 알 수 있을까요..?
-
솜씨좋은장씨 2022.01.10 16:37 신고 잠깐 확인해봤는데
bash <(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)
위의 과정을 실행할때 python-mecab-ko 이게 제대로 빌드되지 않는 것 같기도합니다.
확실한 것은 아니어서 좀더 새벽에 확인해보고 고칠 수 있는 문제면 고치고 아니면 어떤 문제 인지라도 내일 오전 전에 답변 드리겠습니다. -
솜씨좋은장씨 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
명령어를 활용하여 실행해주세요!
감사합니다~
좋은 하루 보내세요~
-
hohohope 2022.01.11 08:52 방금 다시 돌렸는데 정상적으로 잘 돌아갑니다 ㅠㅠㅠㅠㅠㅠ 정말 감사드립니다!!ㅠㅠ