본문 바로가기
Programming

python 한글 형태소 분석 하는 방법

by 하하호호 2021. 12. 12.
반응형

파이썬에서 문자열 분석으로 많은 인사이트를

얻어낼 수 있다. 영어 같은 경우는 문자열 분석이

용이하지만 한글의 경우 형태소 단위로 분석

해야 하기 때문에, 까다로운 편이다.

 

영어를 사용하지 않는 나라에서 문자열을 분석

하기 위해서는 인코딩/디코딩의 과정을 거쳐야 

하고 문자에 맞는 분석방법을 사용해야 하기 

때문에, 어려움을 겪는 것이다. 특히나 한글의 경우

전 세계에서 가장 어려운 언어중 하나이기 때문에,

한글을 분석할 수 있다면 다른 나라의 언어들은

용이하게 분석할 수 있을 것이다.

 

1. konlpy 모듈 사용하기

 

한글이 전 세계에서 13번째로 많이 사용하는 언어라고 한다.

 

konlpy

Python package for Korean natural language processing.

pypi.org

먼저 konlpy를 설치해준다.

1
pip3 install konlpy
cs

 

konlpy 모듈에서 Twitter 클래스를 사용한다.

norm 형태소를 깔끔하게 만들어준다. 불필요한 데이터를 지워준다.

stem은 형태소의 원형을 찾아서 반환해준다.

1
2
3
4
5
6
7
8
from konlpy.tag import Twitter
import tweepy
import jpype
 
twitter = Twitter()
text = "게임을 통해 디지털 트렌스포메이션의 자본적 수혜자가 일반 대중으로 확산되고 있고, 소비자에 머물렀던 일반 대중이 디지털 생산자로 변화하고 있다며 일부 인플루언서에 그치지 않고 일반 대중으로 확산될 것이며 디지털 컨텐츠는 대중이 접근 하기 쉬운 아르바이트, 투잡이 될 것이다 게임을 통해 디지털 트렌스포메이션의 자본적 수혜자가 일반 대중으로 확산되고 있고, 소비자에 머물렀던 일반 대중이 디지털 생산자로 변화하고 있다며 일부 인플루언서에 그치지 않고 일반 대중으로 확산될 것이며 디지털 컨텐츠는 대중이 접근 하기 쉬운 아르바이트, 투잡이 될 것이다 게임을 통해 디지털 트렌스포메이션의 자본적 수혜자가 일반 대중으로 확산되고 있고, 소비자에 머물렀던 일반 대중이 디지털 생산자로 변화하고 있다며 일부 인플루언서에 그치지 않고 일반 대중으로 확산될 것이며 디지털 컨텐츠는 대중이 접근 하기 쉬운 아르바이트, 투잡이 될 것이다 게임을 통해 디지털 트렌스포메이션의 자본적 수혜자가 일반 대중으로 확산되고 있고, 소비자에 머물렀던 일반 대중이 디지털 생산자로 변화하고 있다며 일부 인플루언서에 그치지 않고 일반 대중으로 확산될 것이며 디지털 컨텐츠는 대중이 접근 하기 쉬운 아르바이트, 투잡이 될 것이다"
malist = twitter.pos(text, norm=True, stem=True)
print(malist)
cs

 

코드를 실행하면 다음 결과값을 얻는다.

한글의 형태소에 따라서 문자열을 분석한 후

반환해주는 것이다.

 

 

모델을 좀더 발전시켜서, 명사 중에서 가장 많이

등장하는 단어를 찾는 프로그램도 가능하다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import codecs
import csv
from konlpy.tag import Twitter
 
 
 
twitter=Twitter()
word_dic={}
lines=[]
 
# CSV 에서 데이터를 읽어온다.
with open('koreanTest.csv''r'as raws:
    reader = csv.reader(raws)
    for raw in reader:
        lines.append(raw)
 
for line in lines:
    malist = twitter.pos(''.join(line))
    print(malist)
    
    # 명사들을 수집해서 반복되는 명사 count를 진행한다.
    for word in malist:
        if word[1== "Noun":
            if not(word[0in word_dic):
                word_dic[word[0]] = 0
            word_dic[word[0]] += 1
keys = sorted(word_dic.items(), key=lambda x:x[1], reverse=True)            
 
# 50개 까지 결과값을 출력한다.
 
for word, count in keys[:50]:
    print("{0}({1})".format(word, count), end="")
 
 
 
cs

 

 

결과값은 다음과 같다.

형태소 분석결과를 보여주고,

"카카오"라는 명사가 20번 

반복되었다는 결과를 반환한다.

반응형

댓글