파이썬 KoNLPy, 형태소 분석 및 워드클라우드 그리는 법은?!

2021. 8. 22. 10:30

자연어 처리를 위해서는 텍스트를 컴퓨터가 연산할 수 있는 형태로 변경해야 한다. 이렇게 변환하기 위해 가장 많이 하는 작업이 형태소 단위로 분리하는 것이다. 자・모음 단위로 분리할 수도 있고 띄워쓰기 단위로 분리할 수도 있지만, 가장 일반적으로는 형태소 단위로 분리한다. 형태소 단위로 분리하기 위해서는 해당 단어별 사전이 있어야 한다.

오늘은 파이썬 KoNLPy를 이용하여, 형태소 분석 및 워드클라우드를 그리는 법에 대해서 알아보고자 한다. 형태소 분석은 텍스트를 형태소 단위로 분리하는 것을 말한다.

 

 

형태소분석, 워드클라우드

 

 

KoNLPy는 한국어를 형태소 단위로 분리할 수 있게 해 주는 파이썬 패키지이다. 라이센스는 무료다. 설치를 위해서는 pip install konlpy라고 입력창에서 실행하면 된다.

konlpy에는 5개의 방법으로 형태소를 분리하는 방법이 있다.

- Hannanum
- Kkma
- Komoran
- Mecab
- Twitter

 

Twitter로 형태소를 분리하기 위해, 아래와 같이 import하고 실행하였더니 에러가 발생했다.

from konlpy.tag import Twitter
twitter = Twitter()

[Out]
TypeError: Package kr.lucypark.tkt.TktInterface is not Callable

 

필자는 mac을 사용하고 있는데, 이 문제를 해결하기 위해서는 JAVA_HOME을 환경변수로 설정해야 한다. JAVA의 위치를 잡지 못해서 생기는 에러이기 때문이다.

일단 이것저것 참고해서 JAVA_HOME을 지정해봤는데 해결이 되지 않는다. 그냥 konlpy 패키지의 _okt.py로 가서, __init_함수에 jvmpath를 바로 지정했다.

jvmpath = '/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/MacOS/libjli.dylib'

 

이제 형태소를 분리하기 위한 소스를 찾아야 하는데, 필자는 필자의 블로그의 글들을 활용해 보기로 했다. 티스토리 블로그는 API를 제공하고 있는데, 여기서 블로그에 대한 정보 뿐만 아니라 제목, 내용 등을 가져올 수 있다.

from konlpy.tag import Twitter
from tqdm import tqdm

df = load_db("post_data", "total_df")

twitter = Twitter()

tot_sen = list()

for i in tqdm(range(0,len(df))):
    sen = twitter.pos(df["title"][i], norm = True, stem = True)
    tot_sen = sen +tot_sen

 

load_db는 필자가 함수로 티스토리 블로그의 글을 가져오기 위해 작성한 것이다. 다른 텍스트를 가져온다고 하면, 이 부분은 바뀌어야 할 것이다. for문에 tqdm을 넣은 것은 진행률을 확인하기 위해서이다. tqdm에 대해서는 이전 포스팅에서 다룬 적이 있으니, 넘어가도록 하겠다.

여기서 제일 중요한 부분은 sen = twitter.pos(df["title"][i], norm = True, stem = True) 이다. 여기가 실질적으로 형태소를 분리하는 부분이며, twitter.pos(텍스트)를 입력하면 형태소가 분리되어 나온다. norm과 stem은 이전 포스팅에도 다루었지만 약간의 오타 수정과 단어를 원형으로 가져오는 부분이다.

위와 같이 해서 형태소를 분리해서 list로 저장하였다. 저장한 이후에는 글자수를 세기 위해 collections를 이용하였다. collections는 여러가지 라이브러리가 있는데, counters는 list나 dict같이 데이터 유형의 count를 쉽게 할 수 있도록 도와준다. 아래와 같이 하면, 상위 50개의 단어들을 볼 수 있다.

count = Counter(tot_sen)
tot_sen_50 = count.most_common(50)

 

이제 워드클라우드를 그려보자. 워드클라우드는 pytagcloud 라이브러리를 이용해서 그릴 수 있다. 처음에 그리고나니 한글이 깨져서 보이지 않는다. 한글 폰트가 없어서 발생한 문제이다. pytagcloud의 라이브러리 폴더로 가서 fonts.json을 편집하면 된다. 필자는 anaconda를 설치했기 때문에 아래의 경로에서 fonts.json을 찾을 수 있었다.

/anaconda3/lib/python3.6/site-packages/pytagcloud/fonts

 

사용하고자 하는 한글 폰트를 해당 폴더에 복사하고, fonts.json도 아래와 같이 추가한다.

{
   "name": "NotoSansCJK",
   "ttf": "NotoSansCJKkr-Thin.otf",
   "web": "http://fonts.googleapis.com/css?family=Nobile"
},

 

이제 아래와 같이 코드를 실행하여, 워드클라우드를 그려보았다. 모든 품사를 다 그려보니 의미가 없는 것 같아, 명사만 그려 보았다.

tot_noun = list(i for i in tot_sen if i[1] == "Noun")
count = Counter(tot_noun)
tot_noun_50 = count.most_common(50)

tot_tags = list()

for n,c in tot_noun_50:
    tags = [{'color': color(), 'tag': n[0], 'size': c }]
    tot_tags = tot_tags + tags

pytagcloud.create_tag_image(tot_tags, 'word_noun.png', fontname='NotoSansCJK', size=(600,400))

 

첫 줄은 품사 중에서 명사만 가져오는 부분이다. 텍스트 분석을 할 때는 for문과 if문을 쓸 때가 많다. 위와 같이 한 줄에 작성하니 코드도 간결하고, 편리하다. 이를 컨프리헨션 문법이라고 부른다. 자세한 내용은 이전 포스팅에서 다룬 내용이 있으니 참고하기 바란다.

 

완성한 워드 클라우드는 아래와 같다.

 

 

워드클라우드

 

필자가 그 동안 블로그에서 다루었던 주제들을 한 눈에 볼 수 있다. 신용카드에 관한 글이 많아서 관련된 주제들이 많이 눈에 띈다.

 


오늘은 KoNLPy를 이용해서 형태소 분석 및 워드클라우드를 그려보았다. 필자는 필자의 블로그로 하였지만, 네이버에서 뉴스를 크롤링해서 작업을 해도 재미있는 결과를 얻을 수 있지 않을까 예상해본다. 다음 포스팅에서는 SoyNlpy를 이용해서 형태소를 분리하고, 결과를 비교해보고자 한다.

댓글()