Data Engineering/데이터 분석

konlpy를 이용해 형태소 추출하기

12.tka 2020. 9. 4. 17:37
728x90

이번 글에서는 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)

 

wordcloud 결과

지금까지 konlpy를 활용하여 형태소를 분석해보았습니다. 경북대학교 홈페이지 공지사항은 제목 그 자체로 의미가 있기 때문에 따로 명사를 추출하는 것이 올바른 분석이 아닐 수도 있다는 생각이 듭니다. 하지만 konlpy를 사용과 의미 없는 글자들을 제거하는 경험은 그 자체로도 큰 의미가 있다고 생각합니다!

 

728x90

'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