자연어 처리에서 각 언어마다 모두 특징이 다르기 때문에 동일한 방법을 사용하기는 어려울 것이다. 한글에도 NLTK나 Spacy 같은 도구를 사용할 수 있으면 좋겠지만 언어 특성상 영어를 위한 도구를 사용하기에는 적합하지 않다. 하지만 많은 사람들의 노력으로 개발된 한글 자연어 처리를 돕는 훌륭한 도구를 사용할 수있다. 그중 한글 자연어 처리에 많이 사용하는 파이썬 라이브버리 KoNLPy에 대해 알아보겠다.
KoNLPy는 한글 자연어 처리를 쉽고 간결하게 처리할 수 있도록 만들어진 오픈소스 라이브러리다. 또한 국내에 이미 만들어져 사용되고 있는 여러 형태소 분석기를 사용할 수 있게 허용한다. 일반적인 어절 단위에 대한 토크나이징은 NLTK로 충분히 해결할 수 있으므로 형태소 단위에 대한 토크나이징에 대해 알아보도록 하겠다.
설치
리눅스 또는 macOS에서는 다음과 같이 pip를 이용해 간단하게 설치할 수 있다.
pip install konlpy #python2.x
pip3 install konlpy #python2.x
형태소 단위 토크나이징
한글 텍스트의 경우 형태소 단위 토크나이징이 필요할 떄가 있는데 KoNLPy에서는 여러 형태소 분석기를 제공하며, 각 형태소 분석기별로 분석한 결과는 다를 수 있다. 각 형태소 분석기는 클래스 형태로 되어 있고 이를 객체로 생성한 후 매서드를 호출해서 토크나이징할 수 있다.
형태소 분석 및 품사 태깅
형태소란 의미를 가지는 가장 작은 단위로서 더 쪼개지면 의미를 상실하는 것들을 말한다. 따라서 형태소 분석이란 의미를 가지는 단위를 기준으로 문장을 살펴보는 것을 의미한다. KoNLPy는 기존에 C, C++, Java 등의 언어를 통해 형태소 분석을 할 수 있는 좋은 라이브러리들을 파이썬 라이브러리로 통합해서 사용할 수 있록 하여 한국어 구문 분석을 쉽게 할 수 있도록 만들어진 라이브러리이다. KoNLPy에는 다양한 형태소 분석기들이 객체 형태로 포함돼 있으며 다음과 같은 각 형태소 분석기 목록이 있다.
- Hannanum
- Kkma
- Komoran
- Mecab
- Okt(Twitter)
모두 동일한 형태소 분석기능을 제공하는데, 각기 성능이 조금씩 다르다고 하니 직접 비교해보고 자신의 데이터를 가장 잘 분석하는 분석기를 사용하는 것이 좋다. (단, Mecab는 윈도우에서 사용할 수 없다.)
여기에서는 Okt 예로 들어 설명 하도록 하겠다. Okt는 원래 이름이 Twitter였으나 0.5.0 버전 이후부터 이름이 Okt로 바뀌었다.
import konlpy.tag import Okt
okt = Okt() # 객체 생성
Okt 에서 제공되는 함수를 살펴보자.
- okt.morphs() 텍스트를 형태소 단위로 나눈다. 옵션으로 norm과 stem이 있다. norm은 문장을 정규화. stem은 각 단어에서 어간을 추출.(기본값은 둘다 False)
- okt.nouns() 텍스트에서 명사만 뽑아낸다.
- okt.phrases() 텍스트에서 어절을 뽑아낸다.
- okt.pos() 각 품사를 태깅하는 역할을 한다. 품사를 태깅한다는 것은 주어진 텍스트를 형태소 단위로 나누고, 나눠진 각 형태소를 그에 해당하는 품사와 함께 리스트화하는 것을 의미한다. 옵션으로 norm, stem, join이 있는데 join은 나눠진 형태소와 품사를 '형태소/품사' 형태로 같이 붙여서 리스트화한다.
다음 문장을 직접 각 함수에 적용해서 살펴보자.
모바일 게임은 재밌다 열심히 해서 만랩을 찍어야지~ ㅎㅎㅎ
from konlpy.tag import Okt
okt = Okt()
text = "모바일 게임은 재밌다 열심히 해서 만랩을 찍어야지~ ㅎㅎㅎ"
print(okt.morphs(text))
print(okt.morphs(text, stem=True))
['모바일', '게임', '은', '재밌다', '열심히', '해서', '만', '랩', '을', '찍어야지', '~', 'ㅎㅎㅎ']
['모바일', '게임', '은', '재밌다', '열심히', '하다', '만', '랩', '을', '찍다', '~', 'ㅎㅎㅎ']
어간 추출을 한 경우 찍어야지
의 어간인 찍다
로 추출된 것을 볼 수 있다.
이제 명사와 어절을 추츨헤 보자
print(okt.nouns(text))
print(okt.phrases(text))
['모바일', '게임', '랩']
['모바일', '모바일 게임', '만랩', '게임']
nouns 함수를 사용한 경우에는 명사만 추출되었고 phrases 함수의 경우 어절 단위로 나뉘어서 추출 되었다.
품사 태깅을 하는 함수 pos를 사용해보자.
print(okt.pos(text))
print(okt.pos(text, join=True))
[('모바일', 'Noun'), ('게임', 'Noun'), ('은', 'Josa'), ('재밌다', 'Adjective'), ('열심히', 'Adverb'), ('해서', 'Verb'), ('만', 'Modifier'), ('랩', 'Noun'), ('을', 'Josa'), ('찍어야지', 'Verb'), ('~', 'Punctuation'), ('ㅎㅎㅎ', 'KoreanParticle')]
['모바일/Noun', '게임/Noun', '은/Josa', '재밌다/Adjective', '열심히/Adverb', '해서/Verb', '만/Modifier', '랩/Noun', '을/Josa', '찍어야지/Verb', '~/Punctuation', 'ㅎㅎㅎ/KoreanParticle']
join 옵션을 True로 설정 하면 형태소와 품사가 함께 나오는 것을 볼 수 있다. 경우에 따라 옵션을 설정하면서 사용하면 된다.
KoNLPy 데이터
KoNLPy 라이브러리는 한글 자연어 처리에 활용할 수 있는 한글 데이터를 포함하고 있어 라이브러리를 통해 데이터를 바로 사용할 수 있다.
- kolaw 한국 법률 말뭉치. 'constitution.txt'파일
-
kobill 대한민국 국회 의안 말뭉치. 각 id값을 가지는 의안으로 구성. 파일은 '1809890.txt' 부터 '1809899.txt'까지로 구성.
라이브러리를 사용해 각 말뭉치를 불러오자.
from konlpy.corpus import kolaw
from konlpy.corpus import kobill
kolaw.open('constitution.txt').read()[:30]
'대한민국헌법\n\n유구한 역사와 전통에 빛나는 우리 대한국'
kobill.open('1809890.txt').read()[:30]
'지방공무원법 일부개정법률안\n\n(정의화의원 대표발의 )\n'
위 데이터들을 가지고 여러 가지 한글 자연어 처리 문제를 연습하는 데 활용할 수 있다.
마치며
KoNLPy 홈페이지에 가보면 나름의 철학을 가지고 프로젝트를 진행하는 듯한 글을 볼 수 있다.
KoNLPy는 같은 기능을 하는 또 하나의 도구를 만들려는 것이 아닙니다. 이 프로젝트에는 세 가지 철학이 있습니다.
- 사용법이 간단해야 한다.
- 누구나 쉽게 이용할 수 있어야 한다.
- "인터넷 민주주의는 효과적이다."
개인적으로 마음에 드는 글귀이다. 인터넷 민주주의를 위해 직접 참여도 가능하니 한국어 NLP에 관심이 많다면 아래 공식홈을 방문하여 살펴보길 바란다.
KoNLPy 공식홈 : https://konlpy-ko.readthedocs.io