Skip to content

KoNLPy #

Find similar titles

1회 업데이트 됨.

Edit
  • 최초 작성자
  • 최근 업데이트
    shlee

Structured data

Category
Programming

KoNLPy #

KoNLPy (Korean NLP in Python)은 말 그대로 한국어 정보처리를 위한 파이썬 패키지이다. KoNLPy를 활용하면 한국어 문서에 대하여 형태소 분석, 품사 태깅 등을 수행할 수 있으며, 나아가 한국 법률 말뭉치 및 대한민국 국회 의안 말뭉치 등의 한국어 문서 데이터를 활용할 수도 있다. NLP 분야에서 영어나 다른 외국어의 경우 NLTK라는 패키지를 활용하나, 한국어 처리에는 능통하지 못하여 한국어를 위한 별도의 패키지인 KoNLPy를 주로 사용한다.

KoNLPy 설치 #

1. Windows #

1) OS의 비트 수가 일치하는 파이썬 설치

버전 1.7 이상인 자바 설치 필요 (JDK 링크 참고)

2) JAVA_HOME 설청

3) OS 비트 수 일치하는 JPype1 (<=0.5.7) 설치

4) pip 업그레이드

pip install --upgrade pip
pip install JPype1-0.5.7-cp27-none-win_amd64.whl

5) KoNLPy 설치

$ pip install konlpy

2. MacOS #

터미널에서 다음 명령어를 실행한다.

$ python3 -m pip install --upgrade pip
$ python3 -m pip install konlpy        # Python 3.x

3. Ubuntu #

의존성 패키지 설치

# Install Java 1.8 or up
$ sudo apt-get install g++ openjdk-8-jdk python3-dev python3-pip curl

KoNLPy 설치

$ python3 -m pip install --upgrade pip
$ python3 -m pip install konlpy       # Python 3.x

4. CentOS #

의존성 패키지 설치

$ sudo yum install gcc-c++ java-1.8.0-openjdk-devel python3      python3-devel python3-pip make diffutils

KoNLPy 설치

$ python3 -m pip install --upgrade pip
$ python3 -m pip install konlpy     # Python 3.x

5. Docker #

다음과 같은 도커 파일을 생성하여 실행하면 됨.

 
> FROM python:3
> ENV JAVA_HOME /usr/lib/jvm/java-1.7-openjdk/jre
> RUN apt-get update && apt-get install -y g++ default-jdk
> RUN pip install konlpy

사용법 #

KoNLPy를 활용하여 한국어 문서의 형태소 분석과 품사 태깅을 수행해보자. 실습에 활용할 한국어 문서(정희성 시인의 희망 공부) 예시는 아래와 같다.

sentence = '''\
절망의 반대가 희망은 아니다
어두운 밤하늘에 별이 빛나듯
희망은 절망 속에 싹트는 거지
만약에 우리가 희망함이 적다면
그 누가 세상을 비추어줄까
정희성, 희망 공부'''

형태소 분석 #

위 예제의 형태소 분석을 위해, KoNLPy 가 제공하는 형태소 분석기 중 Twitter 클래스를 임포트하자. 아래 임포트에서 오류가 나는 경우, 설치 또는 설정이 제대로 안된 것이니 다음을 설치 과정을 되짚어 보자.

from konlpy.tag import Okt
t = Okt()

형태소 분석을 수행하기 위해서는 다음의 코드를 입력하면 되며, 예제 문서에 대해 수행한 결과는 아래와 같다.

print('형태소:', t.morphs(sentence))
형태소: ['절망', '의', '반대', '가', '희망', '은', '아니다', '.', '\n', '어', '두운', '밤하늘', '에', '별', '이', '빛나듯', '\n', '희망', '은', '절망', '속', '에', '싹트는', '거지', '\n', '만약', '에', '우리', '가', '희망', '함', '이', '적다면', '\n', '그', '누가', '세상', '을', '비추어', '줄까', '\n', '정희성', ',', '희망', '공부']

참고로 NLTK를 활용하여 한국어 문서의 형태소 분석을 수행한 결과는 다음과 같으며, 한국어 문서에 대해서는 KoNLPy가 훨씬 잘 수행하는 것을 알 수 있다.

import nltk
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
from nltk.tokenize import word_tokenize
tokens = word_tokenize(sentence)
print(tokens)
['절망의', '반대가', '희망은', '아니다', '.', '어두운', '밤하늘에', '별이', '빛나듯', '희망은', '절망', '속에', '싹트는', '거지', '만약에', '우리가', '희망함이', '적다면', '그', '누가', '세상을', '비추어', '줄까', '정희성', ',', '희망', '공부']

POS tagging #

POS tagging은 품사 태깅으로, 각 형태소가 어떤 품사에 해당되는지를 태깅해주는 기능이다. POS 태깅은 다음과 같이 수행할 수 있다.

print('품사 태깅 결과:', t.pos(sentence))
품사 태깅 결과: [('절망', 'Noun'), ('의', 'Josa'), ('반대', 'Noun'), ('가', 'Josa'), ('희망', 'Noun'), ('은', 'Josa'), ('아니다', 'Adjective'), ('.', 'Punctuation'), ('\n', 'Foreign'), ('어', 'Noun'), ('두운', 'Noun'), ('밤하늘', 'Noun'), ('에', 'Josa'), ('별', 'Noun'), ('이', 'Josa'), ('빛나듯', 'Verb'), ('\n', 'Foreign'), ('희망', 'Noun'), ('은', 'Josa'), ('절망', 'Noun'), ('속', 'Noun'), ('에', 'Josa'), ('싹트는', 'Verb'), ('거지', 'Noun'), ('\n', 'Foreign'), ('만약', 'Noun'), ('에', 'Josa'), ('우리', 'Noun'), ('가', 'Josa'), ('희망', 'Noun'), ('함', 'Noun'), ('이', 'Josa'), ('적다면', 'Verb'), ('\n', 'Foreign'), ('그', 'Noun'), ('누가', 'Noun'), ('세상', 'Noun'), ('을', 'Josa'), ('비추어', 'Verb'), ('줄까', 'Verb'), ('\n', 'Foreign'), ('정희성', 'Noun'), (',', 'Punctuation'), ('희망', 'Noun'), ('공부', 'Noun')]

위를 통해 '절망'은 명사, '의'는 조사로 태깅이 성공적으로 수행된 것을 알 수 있다.

한편, NLTK를 활용한 품사 태깅 수행 시 다음과 같은 결과를 얻을 수 있다.

print(nltk.pos_tag(tokens))
[('절망의', 'JJ'), ('반대가', 'NNP'), ('희망은', 'NNP'), ('아니다', 'NNP'), ('.', '.'), ('어두운', 'VB'), ('밤하늘에', 'JJ'), ('별이', 'NNP'), ('빛나듯', 'NNP'), ('희망은', 'NNP'), ('절망', 'NNP'), ('속에', 'NNP'), ('싹트는', 'NNP'), ('거지', 'NNP'), ('만약에', 'NNP'), ('우리가', 'NNP'), ('희망함이', 'NNP'), ('적다면', 'NNP'), ('그', 'NNP'), ('누가', 'NNP'), ('세상을', 'NNP'), ('비추어', 'NNP'), ('줄까', 'NNP'), ('정희성', 'NNP'), (',', ','), ('희망', 'NNP'), ('공부', 'NNP')]

위를 통해 '절망의'는 형용사로 분리된 것을 알 수 있는데, 실제로는 형용사가 아닌 명사와 조사의 조합이므로 NLTK를 활용한 한국어 품사 태깅은 적절하지 않은 것을 알 수 있다.

Reference #

  1. https://konlpy.org/ko/latest/
  2. 파이썬 텍스트 마이닝 완벽 가이드
0.0.1_20230725_7_v68