Seongwon Lim

[Python] KoNLPy를 이용하여 문장에서 명사 추출하기 본문

Python

[Python] KoNLPy를 이용하여 문장에서 명사 추출하기

limsw 2022. 5. 27. 23:17
반응형

KoNLPy 란?

KoNLPy는 한국어 정보처리를 위한 파이썬 패키지로 발음은 "코엔엘파이" 라고 읽는다.

한글은 조사, 어미 등 다양한 문법이 존재하기 때문에 형태소 단위로 분리하기가 어려운데, KoNLPy는 사람이 구분하기 힘든 단어나 문장을 형태소 단위로 쪼개어 자동으로 분석해주는 라이브러리로 생각하면 좋을 것 같다.

 

따라서, 이번 글에서는 KoNLPy 설치 방법과 더불어 간단하게 해당 라이브러리를 사용하는 방법을 살펴보고자 한다.

KoNLPy 설치하기

필자는 MacOS 환경에서 개발하는 중이므로 해당 라이브러리 설치 방법 또한 MacOS 기준으로 설명하려고 한다.

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

두 개의 명령어를 통해 라이브러리를 설치한다.

 

 

Installation — KoNLPy 0.6.0 documentation

Ubuntu Supported: Xenial(16.04.3 LTS), Bionic(18.04.3 LTS), Disco(19.04), Eoan(19.10) Install dependencies # Install Java 1.8 or up $ sudo apt-get install g++ openjdk-8-jdk python3-dev python3-pip curl Install KoNLPy $ python3 -m pip install --upgrade pip

konlpy.org

MacOS 이외의 다른 운영체제에서 KoNLPy 설치 방법은 위 사이트에서 참고하면 좋을 것 같다.

KoNLPy 형태소 분석 클래스 종류

형태소 분석 클래스는 총 5개로 구성되어 있는데, 이번 글에서는 범용적으로 사용하고 있는 Twitter(이하 Okt) 클래스를 사용해볼 것이다.

사용 방법

from konlpy.tag import Okt

okt = Okt()

먼저 사용할 라이브러리를 불러온 뒤, 우리가 사용할 Okt 객체를 생성한다.

 

또한, 불러온 모듈에서 제공하는 메서드들은 다음과 같다.

  • morphs(phrase, norm=False, stem=False)
    • 형태소 단위로 구문을 분석한다.
    • 반환 결과는 리스트로 반환한다.
  • nouns(phrase)
    • 명사를 추출한다. 문장의 띄어쓰기가 제대로 되어있지 않아도 명사를 알아서 추출해준다.
    • 반환 결과는 리스트로 반환한다.
  • phrases(phrase)
    • 어절 단위로 추출한다.
    • 반환 결과는 리스트로 반환한다.
  • pos(phrase, norm=False, stem=False, join=False)
    • 형태소 단위로 추출 후, 형태소와 품사를 Tagging 하여 리스트로 반환한다.
    • 예를 들어 "이름 입니다" 라는 문자열이 있다고 가정하면, [('이름', 'Noun'), ('입니다', 'Verb')] 이런 식으로 결과를 반환한다.

이제 실제로 이번 글에서 다루고자 했던 문장에서 명사를 추출하는 방법을 살펴보자.

샘플 파일 구성하기

 

한글입숨 - 무의미한 한글 텍스트 생성기

한글판 로렘입숨. 무의미한 한글 텍스트를 생성해 줍니다.

hangul.thefron.me

해당 사이트에서 테스트에 사용할 샘플 한글 문장을 만들었다.

위와 같이 구성을 했고 생성하기를 누르면 임의의 문장이 생성된다. 또한, test.txt 라는 텍스트 파일을 만들어 해당 파일에 내용을 저장했다.

 

먼저, 명사를 추출하는 코드를 구현해보자.

f = open('./test.txt', 'r', encoding='utf-8')
sentences = f.read()

# 명사 추출하기
noun = okt.nouns(sentences)
print(noun)

프린트 결과는 다음과 같다.

['헤', '어머니', '까닭', '무엇', '하나', '추억', '별', '까닭', '까닭', '청춘', '어머님', '하나', '어머님', '하나', '청춘', '비둘기', ... ]

결과를 보면 1음절로 되어있는 단어부터 시작해서 2,3음절로 이루어진 명사까지 추출되는 것을 확인할 수 있다.

이번에는 추출된 명사 중에서 가장 많이 추출된 상위 100개의 명사를 추출해보기로 하자.

 

코드를 다음과 같이 수정한다.

from konlpy.tag import Okt
from collections import Counter

okt = Okt()

f = open('./test.txt', 'r', encoding='utf-8')
sentences = f.read()

# 명사 추출하기
noun = okt.nouns(sentences)
counter = Counter(noun)

top_100_noun_list = counter.most_common(100)

for i in top_100_noun_list:
    print(i)

Counter 모듈을 이용하면 특정 단어가 몇 번 출현했는지 쉽게 구할 수 있다.

most_common() 메서드의 인자에 100을 주면 출현 빈도 상위 100개 단어를 자동적으로 추출해준다.

결과는 다음과 같이 한글자인 경우도 있었고 두글자인 경우도 있었다. 사실 1음절로 된 글자는 의미 있는 글자가 아닐 가능성도 있기 때문에 이번에는 상위 100개 추출한 결과 중에서 2음절 이상으로 이루어진 형태소만 추출해보기로 했다.

 

반복문을 다음과 같이 수정했다.

for i in top_100_noun_list:
    if len(i[0]) > 1:
        print(i)

다음과 같이 결과가 나왔다. 우리가 추출하고자 했던 명사가 적절하게 추출된 것을 확인할 수 있었다.

결론

위 그림과 같이 요즘에 Word Cloud 라는 기술이 많이 사용되고 있다. Word Cloud는 한글로 이루어진 단어나 중요 키워드를 다양한 모양으로 시각화를 해주는 기법인데, 우리가 예제에서 다룬 문장에서 출현 빈도가 높은 형태소(또는 명사)를 추출한 것 또한 그 글에서는 중요도가 높은 키워드로 생각해볼 수 있으므로 더 나아가 추출한 결과들을 워드클라우드로 생성하는 것도 다뤄보면 좋을 것 같다는 생각을 했다.

 

시간이 된다면 다음 포스팅에서 이번에 추출한 단어들을 가지고 워드클라우드로 시각화를 해보는 방법을 다뤄보겠다.


출처

Comments