본문 바로가기
Python 과 머신러닝/III. 머신러닝 모델

[Python 머신러닝] 10장. 텍스트 마이닝 - (2) 형태소 분석 & 시각화 (w/ konlpy, word cloud)

by JoyfulS 2019. 10. 31.

 

실습 전 준비사항 (미리 깔아둬야하는 패키지 등)

[Python 머신러닝] 10장. 텍스트 마이닝 (Text Mining) 개요 & 패키지 준비

 

 

< 실습한 내용 >

1. 형태소 분석 (konlpy)

2. 시각화 (word cloud)

3. 뉴스 페이지 크롤링한 데이터 시각화

 

 

* 형태소 : 언어에 있어서 분해 가능한 최소한의 의미를 가진 단위 

 

 

1. 형태소 분석 (konlpy)

from konlpy.tag import Kkma # class 


# 1. Kkma object 
kkma = Kkma() 

# 2. 문단 -> 문장 (sentences)
para = "형태소 분석을 시작합니다. 나는 홍길동 이고 age는 28세 입니다." 
ex_sent = kkma.sentences(para) 
len(ex_sent) # 문장 2개 
ex_sent 
# ['형태소 분석을 시작합니다.', '나는 홍길동 이고 age는 28세 입니다.'] 

# 3. 문단 -> 단어 (nouns) 
ex_nouns = kkma.nouns(para) 
len(ex_nouns) # 단어 7개 
ex_nouns 
# ['형태소', '분석', '나', '홍길동', '28', '28세', '세'] 

# 4. 문단 -> 형태소 추출 
ex_pos = kkma.pos(para) 
ex_pos 

 

# 'NNG 일반 명사, NNP 고유 명사, NP 대명사' 만 추출하기 
text_data = [] 
for (text, tclass) in ex_pos : # ('형태소', 'NNG') 
    if tclass == 'NNG' or tclass == 'NNP' or tclass == 'NP' : 
        text_data.append(text)         

text_data # ['형태소', '분석', '나', '홍길동'] 

 

 

2. 시각화 (word cloud)

"""

시각화 진행 순서
  1. text file 읽기
  2. 명사 추출
  3. 전처리 : 단어 길이 제한, 숫자 제외
  4. word cloud 시각화
"""

from konlpy.tag import Kkma

# object 생성
kkma = Kkma()

# 1. text file 읽기

text_data.txt
0.00MB

file = open("../data/text_data.txt", mode='r', encoding='utf-8')
doc = file.read()
file.close()
doc

# 2. doc -> sentence
ex_sent = kkma.sentences(doc)
ex_sent

# 3. doc -> noun
ex_nouns = kkma.nouns(doc)
ex_nouns


# 4. sentence -> noun
from re import match  # 전처리 위해서 정규표현식 관련 re 패키지 import
nouns = []
for sent in ex_sent : 
    for noun in kkma.nouns(sent) :
        # 단어 전처리 : 2음절 이상, 수사 제외
        if len(str(noun)) >= 2 and not(match('^[0-9]', noun)) :
            nouns.append(noun)
            
nouns
# ['형태소', '분석', '데이터', '분석', '직업', '데이터', '분석', '전문가', '기법', '초반', '개발', '기술']


# 5. word count : dict
word_count = {} # 빈 set

for noun in nouns :
    word_count[noun] = word_count.get(noun, 0) + 1

word_count

 


# 6. top_n
from collections import Counter

counter = Counter(word_count)

top5 = counter.most_common(5)
top5
# [('분석', 3), ('데이터', 2), ('형태소', 1), ('직업', 1), ('전문가', 1)]


# 7. word cloud

import pytagcloud
import webbrowser

# tag에 color, size, tag 사전 구성 
word_count_list = pytagcloud.make_tags(top5, maxsize=80)
# maxsize : 최대 글자크기
print(word_count_list)

pytagcloud.create_tag_image(word_count_list,
                            'wordcloud.jpg',  # 생성될 시각화 파일 이름
                            size=(900, 600),  # 사이즈
                            fontname='korean', # 한글 시각화를 위해 새로 추가했던 폰트 이름

                            rectangular=False)

 

webbrowser.open('wordcloud.jpg')  # 저장된 'wordcloud.jpg' 브라우저로 띄워서 보기

 

 

 

 

3. 뉴스 페이지 크롤링한 데이터 시각화

from konlpy.tag import Kkma
import pickle

# 1. news Crawling 가져오기

# (이전 크롤링에 관한 게시물에서 만들어 저장한 파일)

data.pickle
0.00MB

file = open("../data/data.pickle", mode='rb') # 'rb' : read, binary
crawling_data = pickle.load(file)
crawling_data
len(crawling_data) # 49

# 2. data -> nouns 추출

kkma = Kkma() 


ex_nouns = [] # 단어 저장

for sent in crawling_data : # doc -> sentence
    for noun in kkma.nouns(sent) : # sentence -> noun
        ex_nouns.append(noun)

ex_nouns
len(ex_nouns) # 503


# 3. 명사 전처리 : 2음절 이상, 숫자 제외 -> 단어사전(dict)
from re import match

nouns_count = {} # 빈 set

for noun in ex_nouns :
    # 2음절 이상, 숫자 제외
    if len(str(noun)) > 1 and not(match('^[0-9]', noun)) :
        nouns_count[noun] = nouns_count.get(noun, 0) + 1

nouns_count

# del nouns_count['오늘']

# 4. 단어 카운트
from collections import Counter

counter = Counter(nouns_count)
top10 = counter.most_common(n=10)
top10 
# '오늘'이라는 단어 포함 되어 있는데 의미 X => 위로 올라가서 제거하고 다시 top10 뽑음


# 5. word cloud
import pytagcloud
import webbrowser

# tag에 color, size, tag 사전 구성 
word_count_list = pytagcloud.make_tags(top10, maxsize=80)
# maxsize : 최대 글자크기
print(word_count_list)

pytagcloud.create_tag_image(word_count_list,
                            'newsCrawling.jpg', 
                            size=(900, 600), 
                            fontname='korean', rectangular=False)

 

webbrowser.open('wordcloud.jpg')

 

댓글