Konlpy 형태소분석기의 사용자 사전 비교
지난 글에 이어, 이번에는 형태소 분석기가 잘못 분석하는 단어를 사용자 사전에 추가해 바로잡는 방법을 정리해보았다.
이전 글 :
Motivation
진행 중인 프로젝트에 어떤 형태소분석기를 적용할지 비교/분석해서 정하기 위해 틈틈이 공부하는 중이다. 비교하는 요소 중에는 ‘사용자 사전 관리가 얼마나 용이한가’라는 관점도 있다. 분석하려는 데이터의 특성상 복합명사나 외래어/신조어가 많고, 앞으로도 계속 생겨날 것 같아서다.
이에 Konlpy가 지원하는 형태소분석기들 중 Okt, Mecab, Komoran의 사용자 사전 관련된 내용들을 찾아보고 정리해보았다.
WHAT | 형태소분석기의 사용자 사전이란?
형태소가 잘못 분석된 경우를 바로잡거나 복합명사를 분석 목적에 따라 하나의 단어로 처리하기 위해 사용한다.
형태소분석기를 사용해 단어를 추출한 뒤에는, 분석 및 시각화 결과의 보정을 위해 원하는 단어를 사용자 사전에 추가하게 된다.
보통 csv, txt 등의 사전 파일에 원하는 단어와 품사를 추가하게 된다.
- (before) 카카오/NNG 톡/NNG → (after) 카카오톡/NNP
- NNG : 일반명사, NNP : 고유명사
WHY | 사용자 사전, 왜 필요한가?
대부분의 형태소분석기는 커다란 말뭉치(코퍼스)를 이용해서 사전을 구축하고 이를 활용해 형태소를 분석한다. 하지만, 현실적으로는 어쩔 수 없이 분석 결과에 보정이 필요한 경우가 발생한다. 주로 아래와 같은 이유들 때문이다.
- 다양한 도메인의 전문용어를 모두 커버할 수가 없다.
- 기존 사전에 없는 신조어는 제대로 분석할 수 없다.
- 문법을 파괴하는 인터넷 용어, 축약어 등
- 비즈니스/마케팅 분야에서 새로 생겨나는 개념들 (예. 푸드테크, 핀테크, 욜로족, 홈파밍 등)
- 새로 생겨나는 기업명, 브랜드명, 서비스명 등
- 또한 복합명사의 경우,
- 하나의 의미로 묶어주는 게 분석이나 시각화에 더 나을 수 있다. (예. 격리해제, 자가진단)
- 다만 복합명사를 묶어주는 것은 일장일단이 있으므로, 분석 텍스트에 출현하는 단어들을 살펴보고 분석 목적에 맞게 적용할 필요가 있다.
그런데 잘못 분석된 단어를 꼭 바로잡아야 할까? 두 가지 경우로 나눠서 생각해볼 수 있다.
- 1회성 분석을 하는 경우
- 해당 도메인에서 중요하고 자주 출현하는 단어가 잘못 잘려서 추출되면 제대로 분석하기가 어렵고 효율이 떨어진다.
- 커뮤니케이션을 위해 워드클라우드, 키워드 랭킹 등 분석 결과물을 전달할 때 신뢰성이 떨어지게 된다. (사실 인간은 오탈자를 바로잡는 본능이 있기 때문에, 일단 눈에 거슬린다)
- 심한 경우엔 원래 의미를 유추할 수 없을 정도로 잘못 잘라진다. (보는 순간 이게 뭐지?….하게 되는 단어들)
- 지속적인 서비스를 제공하는 경우
- 위와 마찬가지로, 서비스의 퀄리티와 신뢰도를 떨어뜨리는 요소가 된다.
- 또한 분석에 중요한 단어가 잘못 잘리면 정정 요청을 받을 수 있는데, 이를 지속적으로 유지보수하는 것은 서비스 운영에 부담이 된다. 따라서 초반에 셋팅을 잘 해놓는 것이 좋다.
HOW | 사용자 사전에 단어 추가는 어떻게 할 수 있나?
형태소 분석기에 따라 조금씩 차이는 있지만, 전체적인 순서는 아래와 같다.
- 사용자 사전 파일을 생성하거나, 이미 만들어져 있는 파일에 접근한다.
- 원하는 단어를 추가한다.
카카오톡 [탭문자] NNP
- 파일을 저장한 뒤, 압축하여 다시 jar 파일로 만들거나 컴파일한다.
형태소분석기별 비교
다음은 Konlpy 패키지가 지원하는 형태소분석기별로 사용자 사전에 대해 찾아본 내용이다.
Komoran
초보자도 가장 쉽고 간편하게 적용해볼 수 있는 편이다. 사용자 사전에 단어를 추가하는 방법은 아래와 같다.
- 사용자 사전 파일을 만든다. (.txt 또는 .tsv)
- 단어를 추가한다.
- 사전 파일 경로를 지정해준다.
from konlpy.tag import Komoran
komoran = Komoran(userdic='./my_dic.tsv')
- 참고한 글
- Konlpy : https://ktae23.tistory.com/111
- Java : ([NLP] 코모란(Komoran) 사용자사전 만들기)
- 사용법이 간편한 대신, 정교한 부분까지 커스터마이징하기는 어렵다.
- 형태소분석기가 사전을 참고할 때의 우선순위를 직접 설정하여 조정할 수 없다. (Mecab과 달리)
- 공식 문서에 따르면 아래와 같다.
- 매뉴얼 : “문장 내에서 사용자 사전에 포함된 단어가 출현하면 사용자 사전에 정의된 품사를 우선적으로 갖게 됩니다.” (https://komorandocs.readthedocs.io/ko/latest/manual/manual.html)
- FAQ : “setUserDic은 사용자 사전을 형태소 분석기에 로드하는 메소드입니다. 사용자 사전에 포함된 단어들은 형태소 분석 단계에서 가장 높은 우선 순위를 갖습니다. 사이드 이펙트가 발생할 수 있으니 주의하여 사용해야 합니다.” (https://komorandocs.readthedocs.io/ko/latest/faq/faq.html)
Okt (Open Korea Text)
지난 번 글을 쓸 당시에는 okt의 사용자 사전 등록 방법을 찾지 못했었는데, 이후 검색을 통해 발견했다. 전체적인 순서는 아래와 같이 Komoran보다 조금 더 손이 가는 편이다.
- jar 파일을 찾아서 임시 폴더에 압축을 푼다.
- 사전 파일을 열어 단어를 추가한다.
- 다시 jar 파일로 압축해 준다.
- 참고한 글
- KoNLPy 사용자 사전 추가 : https://sirzzang.github.io/ai/AI-konlpy-userdic/
Mecab 윈도우 환경에서는 설치할 때와 마찬가지로 사전에 단어를 추가하는 과정도 복잡한 편이다. 하지만 다행히 현 시점에 구글링해서 참고할 자료는 많다.
- Mecab 패키지를 설치할 때 사전도 함께 설치한다.
- 사전 파일을 찾아서 단어를 추가한다.
- 사전을 빌드한다. (윈도우의 경우 powershell에서 컴파일, C:\mecab 폴더 > tool 폴더 > add-userdic-win.ps1 실행)
- 참고한 글
- Konlpy 공식 문서 : Mecab 사용자 사전 추가
- 과정이 정리된 블로그 글
- 윈도우 환경 : https://lsjsj92.tistory.com/612 (관리자 권한으로 실행해야 함)
- 에러가 발생하는 경우 : https://joyhong.tistory.com/128
- https://tape22.tistory.com/6
- 검색해 보면 윈도우 환경에서의 Mecab 설치과정에 대해 정리한 블로그 글이 많은데, 그만큼 에러와 시행착오도 많다고 볼 수 있겠다.
- 이런 경험담도 있었는데, 매우 공감이 갔다.
- “….일단은 가장 기본적인 Okt모델을 사용하려고 한다. mecab이 빠르고 좋다고 했는데, 내 실력부족인지 윈도우환경에서는 사용자단어를 추가하는게 너무 힘들었다.” (참고)
- (내 경우 Konlpy 설치/JDK 연결에 어려움을 겪어서 버전을 맞추는 것으로 겨우 성공했는데, Mecab 사전을 설치하고 Wheel로 연결하려 하니 다시 낮은 버전의 python이 필요해서 한번 좌절했었다. 결국 가상환경을 설정해 어찌어찌 쓰고 있지만, 개발 지식이 얕은 입장에선 쉽지 않은 과정이었고 아직 안개 속을 헤매는 심정이다.)
- 그럼에도 Mecab 사전의 장점은 가장 정교하게 커스터마이징할 수 있다는 것이다.
- 기존 사전의 단어와 새로 등록한 사용자 사전의 단어 중 어떤 것을 우선 고려할 것인지, 단어비용으로 가중치를 부여해 조정할 수 있다.
- (Komoran은 위에 언급했듯이 항상 사용자 사전의 품사가 우선적으로 적용된다)
- 다만 형태소분석기를 처음 사용하는 입장에서는 조금 복잡하게 느껴질 수 있다.
그 외 참고할 링크
- 아래 Konlpy 공식 문서 페이지에 Mecab, Kkma, Hannanum의 시스템 사전에 대한 내용이 나와 있다.
- https://konlpy.org/ko/latest/data/#mecab-system-dictionary
- 그러나 사용자 사전을 편집하는 방법은 Mecab만 링크가 연결되어 있다.
- 잘 정리된 Mecab 설치 방법 : https://lsjsj92.tistory.com/612
마무리하며
- 형태소분석기에 대해 처음 공부하기 시작했을 때는 막연하게 구글링을 시작했는데, 전체적인 개념이 좀 잡히고 나니 공식문서를 보면서 많은 걸 배울 수 있었다. 왜 공식문서로 공부하라는 건지 알 것 같다.
- 글을 정리하는 과정에서 kiwi라는 형태소분석기에 대해 자세히 찾아보게 되었는데, 코퍼스로부터 미등록단어를 추출/자동 등록하는 기능을 지원한다고 한다. 사용자 사전의 꾸준한 업데이트와 단어 추가 자동화를 염두에 둔 기능인 것 같다. 이 글을 읽으며 그 매력에 푹 빠져버렸는데 다음에는 이 부분도 공부하고 정리해봐야겠다.
- Okt는 단어비용(가중치) 조정이 가능한지 아직 찾아내지 못했는데, Twitter에서 Okt로 넘어오면서 자리잡은 Github 페이지에는 관련 내용을 찾을 수가 없었다. 유지보수가 계속되지는 않는 것 같아서 안타깝다. (Okt 히스토리 https://needjarvis.tistory.com/645)
조사한 것을 정리하고 경험한 것을 남겨봅니다. 배우기 위해 씁니다.
Subscribe via RSS