이번 글에서는 konlpy의 Okt tagger를 이용하여 형태소를 추출해보겠습니다.
konlpy를 사용하기 위해서는 별도의 설치 과정이 필요합니다.
설치 과정은 konlpy 공식 문서(https://konlpy-ko.readthedocs.io/ko/v0.4.3/install/)에 자세히 나와있습니다.
konlpy를 사용하기 위해서는 분석에 사용될 데이터가 필요합니다.
경북대학교 컴퓨터학부 공지사항의 제목 데이터를 스크래핑하여 분석에 사용하겠습니다.
# 경북대학교 컴퓨터학부 공지사항 제목 스크래핑
import requests
from bs4 import BeautifulSoup
if __name__ == "__main__":
# requests는 특정 URL로부터 HTML 문서를 가져오는 작업을 수행합니다.
source = requests.get("http://computer.knu.ac.kr/06_sub/02_sub.html").text
# BeautifulSoup는 HTML 문서에서 데이터를 추출하는 작업을 수행합니다.
soup = BeautifulSoup(source, "html.parser")
# 제목
title = []
for i in soup.select('#content > article > article.sub-content.area > div > table > tbody > tr > th:nth-of-type(2)'):
temp = [i.find("a")['title']]
title.extend(temp)
text = "".join(map(str, title))
다음은 Okt tagger를 이용하여 title에 담긴 명사의 수를 카운트하는 코드입니다.
from konlpy.tag import Okt
from collections import Counter
nouns_tagger = Okt()
nouns = nouns_tagger.nouns(title)
count = Counter(nouns)
print(count)
특정한 의미를 가지는 한 글자 키워드는 따로 예외 처리를 하는 것이 좋지만, 대부분의 한 글자는 큰 의미를 가지고 있지 않기 때문에 제거하도록 하겠습니다.
# 한 글자 키워드를 제거합니다.
remove_char_counter = Counter({x : count[x] for x in count if len(x) > 1})
추가적으로 '입니다'와 같이 실질적인 의미가 없는 키워드이면서 동시에 의미적인 독립을 할 수 없는 불용어(관사, 접속사)를 제거하겠습니다. 한국어 약식 불용어 사전(https://www.ranks.nl/stopwords/korean)에 있는 정보를 활용하였습니다.
korean_stopwords_path = "./korean_stopwords.txt"
# 텍스트 파일을 오픈합니다.
with open(korean_stopwords_path, encoding='utf-8') as f:
stopwords = f.readlines()
stopwords = [x.strip() for x in stopwords]
# 불용어 데이터를 제거합니다.
remove_char_counter = Counter({x: remove_char_counter[x] for x in count if x not in stopwords})
마지막으로 시각화를 통해서 올바른 데이터를 추출하였는지 파악해보겠습니다.
import pytagcloud
# 가장 출현 빈도수가 높은 10개의 단어를 선정합니다.
ranked_tags = remove_char_counter.most_common(10)
taglist = pytagcloud.make_tags(ranked_tags, maxsize=80)
# pytagcloud 이미지 생성
pytagcloud.create_tag_image(taglist, 'wordcloud.jpg', size=(600, 400), fontname='NanumGothic', rectangular=False)
지금까지 konlpy를 활용하여 형태소를 분석해보았습니다. 경북대학교 홈페이지 공지사항은 제목 그 자체로 의미가 있기 때문에 따로 명사를 추출하는 것이 올바른 분석이 아닐 수도 있다는 생각이 듭니다. 하지만 konlpy를 사용과 의미 없는 글자들을 제거하는 경험은 그 자체로도 큰 의미가 있다고 생각합니다!
'Data Engineering > 데이터 분석' 카테고리의 다른 글
T-test (T검정) (0) | 2020.09.02 |
---|---|
상관 분석 (0) | 2020.09.02 |
외부 파일 읽어오기 - 2 (Excel, JSON) (0) | 2020.05.29 |
외부 파일 읽어오기- 1 (CSV) (0) | 2020.05.29 |
데이터프레임(Data Frame) 연산 (0) | 2020.05.29 |