0. 서론
konlpy라는 라이브러리가 있다. 한국어 형태소분석을 할 수 있는 여러개의 클래스가 모여있는 라이브러리이다.
공식 사이트는 여기 konlpy-ko.readthedocs.io/ko/v0.4.3/
라이브러리를 임포트해서 사용해보도록 한다.
1. 라이브러리 import
#konlpy에 있는 클래스 모두 import
from konlpy.tag import *
import re
import pandas as pd
import requests
from bs4 import BeautifulSoup
5개의 클래스가 있고, 출처는 아래와 같다.
-
Hannanum: 한나눔. KAIST Semantic Web Research Center 개발. http://semanticweb.kaist.ac.kr/hannanum/
-
Kkma: 꼬꼬마. 서울대학교 IDS(Intelligent Data Systems) 연구실 개발. http://kkma.snu.ac.kr/
-
Komoran: 코모란. Shineware에서 개발. https://github.com/shin285/KOMORAN
-
Mecab: 메카브. 일본어용 형태소 분석기를 한국어를 사용할 수 있도록 수정. https://bitbucket.org/eunjeon/mecab-ko
-
Open Korean Text: 오픈 소스 한국어 분석기. 과거 트위터 형태소 분석기. https://github.com/open-korean-text/open-korean-text
2. 객체설정
hannanum = Hannanum()
kkma = Kkma()
komoran = Komoran()
mecab = Mecab()
okt = Okt()
위와같이 객체를 설정해서 사용할 수 있다.
3. 함수
* 클래스별로 함수이름이 다를 수 있으니 주의!
(1) .pos() : 형태소 분석 함수. 형태소를 분석해 각 형태소별 품사까지 태그해주는 함수.
print(okt.pos('이문장을 형태소 분석 해봅시다. ㅎㅎ'))
[('이', 'Determiner'), ('문장', 'Noun'), ('을', 'Josa'), ('형태소', 'Noun'), ('분석', 'Noun'), ('해봅시다', 'Verb'), ('.', 'Punctuation'), ('ㅎㅎ', 'KoreanParticle')]
(2) .morphs() : 형태소 분석 함수. 형태소를 분석해서 나눈 뒤 리스트로 만들어 준다. 품사를 태깅하진 않는다.
print(okt.morphs('이문장을 형태소 분석 해봅시다. ㅎㅎ'))
['이', '문장', '을', '형태소', '분석', '해봅시다', '.', 'ㅎㅎ']
(3) .target : 태그된 형태소의 품사가 무엇인지 나와있는 변수.
- hannanum
wordType=hannanum.tagset
print(wordType)
{'E': '어미', 'EC': '연결 어미', 'EF': '종결 어미', 'EP': '선어말어미', 'ET': '전성 어미', 'F': '외국어', 'I': '독립언', 'II': '감탄사', 'J': '관계언', 'JC': '격조사', 'JP': '서술격 조사', 'JX': '보조사', 'M': '수식언', 'MA': '부사', 'MM': '관형사', 'N': '체언', 'NB': '의존명사', 'NC': '보통명사', 'NN': '수사', 'NP': '대명사', 'NQ': '고유명사', 'P': '용언', 'PA': '형용사', 'PV': '동사', 'PX': '보조 용언', 'S': '기호', 'X': '접사', 'XP': '접두사', 'XS': '접미사'}
- Okt
wordTypeOkt=okt.tagset
print(wordTypeOkt)
{'Adjective': '형용사', 'Adverb': '부사', 'Alpha': '알파벳', 'Conjunction': '접속사', 'Determiner': '관형사', 'Eomi': '어미', 'Exclamation': '감탄사', 'Foreign': '외국어, 한자 및 기타기호', 'Hashtag': '트위터 해쉬태그', 'Josa': '조사', 'KoreanParticle': '(ex: ㅋㅋ)', 'Noun': '명사', 'Number': '숫자', 'PreEomi': '선어말어미', 'Punctuation': '구두점', 'ScreenName': '트위터 아이디', 'Suffix': '접미사', 'Unknown': '미등록어', 'Verb': '동사'}
4. 대통령 연선문을 이용한 실습
(1) 크롤링 및 형태소 분석
#웹크롤링
url = 'https://www1.president.go.kr/articles/7940'
html = requests.get(url)
soup = BeautifulSoup(html.text, 'html.parser')
text = soup.select_one('.cs_body > .cs_view.text > .text')
text = text.get_text(' ', strip=True)
# 특수문자들 전처리
text = re.sub('[0-9]+', '', text)
text = re.sub('[A-Za-z]+', '', text)
text = re.sub('[-=+,#/\?:^$.@*\"※~&%ㆍ·!』\\‘’|\(\)\[\]\<\>`\'…》]', '', text)
#형태소분석
myNouns = hannanum.nouns(text) # 명사 분석
myMorphs=hannanum.morphs(text) # 형태소 (의미를 가지는 요소로서는 더 이상 분석할 수 없는 가장 작은말의 단위)
myPos=hannanum.pos(text) # 품사 분석
# 수식언(그러나, 그) M
print(myPos)
[('존경', 'N'), ('하', 'X'), ('는', 'E'), ('국민', 'N'), ('여러분', 'N'), ('경자년庚子年', 'N'), ('새', 'P'), ('어', 'E'), ('하', 'P'), ('어', 'E'), ('가', 'P'), ('아', 'E'), ('밝', 'P'), ('아ㅂ니다', 'E'), ('독립운동', 'N'), ('과', 'J'), ('임시정부', 'N'), ('수립', 'N'), ('년', 'N'), ('의', 'J'), ('뜻깊', 'P'), ('은', 'E'), ('해', 'N'), ('를', 'J'), ('보내', 'P'), ('고', 'E'), ('올해', 'N'), ('혁명', 'N'), ('주년', 'N'), ('과', 'J'), ('민주화운동', 'N'), ('주년', 'N'), ('을', 'J'), ('맞', 'P'), ('으며', 'E'), ('년', 'N'), ('전', 'N'), ('촛불', 'N'), ('을', 'J'), ('들', 'P'), ('어', 'E'), ('민주공화국', 'N'), ('을', 'J'), ('지키', 'P'), ('어', 'E'), ('내', 'P'), ('었던', 'E'), ('숭고', 'N'), ('하', 'X'), ('ㄴ', 'E'), ('정신', 'N'), ('을', 'J'), ('되새기', 'P'), ('ㅂ니다', 'E'), ('정의', 'N'), ('롭', 'X'), ('고', 'E'), ('안전', 'N'), ('하', 'X'), ('며', 'E'), ('더', 'M'), ('평화', 'N'), ('롭', 'X'), ('고', 'E'), ('행복',
(2) 많이나온 명사 추출
from collections import Counter
count=Counter(myNouns)
common_list=count.most_common(100)
print(common_list)
[('우리', 30), ('것', 30), ('수', 24), ('등', 21), ('국민', 20), ('년', 17), ('올해', 17), ('노력', 14), ('평화', 13), ('지난해', 13), ('정부', 12), ('수출', 12), ('남북', 11), ('전', 10), ('변화', 10), ('경제', 10), ('사회', 10), ('강화', 10), ('대', 10), ('협력', 10), ('국민들', 9), ('공정', 9), ('원', 9), ('세계', 9), ('도약', 8), ('혁신', 8), ('일자리', 8), ('지원', 8), ('대화', 8), ('여러분', 7), ('삶', 7), ('증가', 7), ('확대', 7), ('분야', 7), ('두', 7), ('북미', 7), ('민주공화국', 6), ('확실', 6), ('투', 6), ('법', 6), ('주년', 5), ('어려움', 5), ('개선', 5), ('지역', 5), ('시작', 5), ('위', 5), ('조', 5), ('상생', 5), ('남', 5), ('나', 4), ('포용', 4), ('기반', 4), ('기록', 4), ('이상', 4), ('질', 4), ('확산', 4), ('마련', 4), ('중소기업', 4), ('성과', 4), ('천', 4), ('돌파', 4), ('추진', 4), ('대응', 4), ('시대', 4), ('속', 4), ('기업', 4), ('시장', 4), ('배', 4), ('연속', 4), ('때', 4), ('한반', 4), ('북', 4), ('공동', 4), ('번영', 4), ('발전', 4), ('날개', 4), ('존경', 3), ('해', 3), ('개혁', 3), ('길', 3), ('한', 3), ('역대', 3), ('맞춤형', 3), ('결과', 3), ('명', 3), ('일', 3), ('인상', 3), ('비중', 3), ('완성', 3), ('누구', 3), ('활성화', 3), ('모두', 3), ('미세먼지', 3), ('대책', 3), ('개', 3), ('성장', 3), ('신산업', 3), ('반도체', 3), ('리', 3), ('힘', 3)]