minhui study

한국어 분석(형태소 분석) 실습 본문

Python/챗봇

한국어 분석(형태소 분석) 실습

minhui 2020. 7. 14. 01:00

형태소 분석

수많은 형태소 분석 라이브러리가 오픈소스로 배포되고 있고 파이썬에서도 사용할 수 있다.

파이썬 한국어 형태소 분석 라이크러리 KoNLPy를 이용하면 한나눔, 꼬꼬마, Komoran, MeCab, 트위터 등의 형태소 분석기를 쉽게 사용할 수 있다. 이 중에서 트위토 형태소 분석기를 사용해보자

 

<konlpy1.py>

from konlpy.tag import Okt

okt=Okt()
malist = okt.pos("아버지 가방에 들어가신다.", norm=True, stem=True)
print(malist)

 

Okt()메서드로 Okt객체를 생성하고 pos() 메서드에 형태소 분석을 수행할 문장을 지정하기만 하면 된다. 

이 때 두가지 옵션을 지정했는데 사실 지정하지 않아도 실행은 된다.

(1) norm옵션을 지정하면 "그래욬ㅋㅋ?"처럼 작성했을 경우 "그래요"처럼 변환해준다.

(2) stem옵션을 지정하면 "그렇다"라고 원형을 찾아준다.

 

 

출현 빈도 분석

머신러닝에 형태소 분석을 적용하기 전에 간단한 예로 박경리의 "토지"를 사용해보자

https://ithub.korean.go.kr/user/total/database/corpusView.do

 

::: 국립국어원 언어정보나눔터 :::

 

ithub.korean.go.kr

파일을열어보면 tei.2 > text > body > text 안에 글이 있는 것을 확인할 수 있다. 다음의 코드를 이용해 모두 추출해보자

 

<konlpy2.py>

import codecs
from bs4 import BeautifulSoup
from konlpy.tag import Okt

#utf-16인코딩으로 파일을 열고 글자를 출력하기 -- (1)
fp = codecs.open("BEXX0014.txt", "r", encoding="utf-16")
soup = BeautifulSoup(fp, "html.parser")
text = soup.select_one('body').text

#텍스트를 한 줄씩 처리하기 -- (2)
okt=Okt()
word_dic={}
lines = text.split("\n")
for line in lines :
    malist = okt.pos(line)
    for word in malist :
        if word[1] == "Noun": # 명사 확인하기 -- (3)
            if not (word[0] in word_dic):
                word_dic[word[0]]=0
            word_dic[word[0]]+=1 #카운트하기

#많이 사용된 명사 출력하기 -- (4)
keys = sorted(word_dic.items(), key=lambda x:x[1], reverse=True)
for word, count in keys[:50]:
    print("{0}({1})".format(word, count), end="")
print()

1 : 파일 BEXX0014.txt을 읽고 BeautifulSoup로 body > text에 있는 글자를 모두 추출한다. 

2 : 이때, text를 출력해보면 줄바꿈이 들어있다. 이를 활용해 반복문으로 줄바꿈을 기준으로 한 줄 한 줄을 살펴보자

3 : 보면 조건문이 있는데 이 조건문에서는 명사인지 아닌지 확인한다.

4 : 그리고 가장 많이 사용된 명사 50개를 출력한다.

 

 



< 출처 및 참고 자료 >

파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문

Comments