일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 코로나19
- Git
- ubuntu
- 자연어처리
- 캐치카페
- 더현대서울 맛집
- 맥북
- 편스토랑 우승상품
- Kaggle
- 데이콘
- 프로그래머스 파이썬
- AI 경진대회
- Baekjoon
- 금융문자분석경진대회
- hackerrank
- leetcode
- Docker
- Real or Not? NLP with Disaster Tweets
- PYTHON
- 편스토랑
- ChatGPT
- programmers
- gs25
- 파이썬
- SW Expert Academy
- 우분투
- 프로그래머스
- 백준
- dacon
- Today
- Total
솜씨좋은장씨
Google Colab에서 mecab-ko-dic 사용자 사전 추가하기! 본문
from konlpy.tag import Mecab
mecab = Mecab()
print(mecab.pos("솜씨좋은장씨의 개발블로그"))
최근 Google Colab에서 mecab에 사용자 사전을 추가하는 방법에 대해서 문의 하시는 분이 많기도 하셨고
저도 mecab에서 사용자 사전을 추가하여 사용해야하는 경우가 생겨 작성해보았습니다.
2023.04.22 - [머신러닝 | 딥러닝/자연어처리] - Google Colab에서 mecab-ko-dic 사용자 사전 추가하기! (2023년 업데이트 버전)
최신 버전은 위 링크에서 확인해주세요! 감사합니다.
현재 버전에서는 추가하는 단어의 순위나 Compound, Preanalysis 여부는 고려하지 않고 그저 추가만 하는 방법입니다.
Colab에서 바로 보시고 싶은 분은 위의 링크를 참고 바랍니다.
먼저 Colab에서 Mecab-ko-for-Google-Colab 쉘스크립트를 활용하여 Mecab을 설치합니다.
해당 방법은 아래의 링크를 참고 바랍니다.
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
이렇게 적어주면 됩니다.
그 외에 , 나 *로 적혀있는 부분들과 자세한 설명은 아래의 링크를 참고 바랍니다.
이번 글에서는 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 여부는 고려하지 않고 그저 추가만 하였기 때문에
추가한 단어 중에 솜씨와 같이 기존 사전에 존재하고 순위가 더 높은 단어가 존재할 경우
해당 단어로 분리될 수 있습니다.
순위 조정 같은 경우는 아래의 링크를 참고하시기 바랍니다.
읽어주셔서 감사합니다.
'머신러닝 | 딥러닝 > 자연어처리' 카테고리의 다른 글
Google Colab에서 mecab-ko-dic 사용자 사전 추가하기! (2023년 업데이트 버전) (5) | 2023.04.22 |
---|---|
Ubuntu에서 Khaiii 설치하기 (0) | 2020.09.10 |
Windows 에서 Mecab ( mecab 기반 한국어 형태소 분석기 ) 설치하는 방법 (16) | 2020.09.07 |
Google Colab에서 Mecab-ko-dic 쉽게 사용하기 (53) | 2019.09.12 |
Ubuntu 18.04 LTS에 mecab-ko-dic 설치하기 (7) | 2019.09.12 |