[NLP] 자연어처리 2. 형태소 분석
앞서 워드클라우드 정리 중 Pecab을 이용한 형태소 분석을 간단하게 해봤는데
이번에는 형태소 분석에 대해 집중적으로 알아보겠다.
🎈형태소 분석
- 형태소 : 의미를 가진 가장 작은 언어 단위
- 어절(토큰) : 띄어쓰기로 구분된 각각의 단위
분해 : 한국어 문장을 어절 단위로 분해
형태소 분석 : 각 어절을 다시 형태소로 세분화
품사 태깅 : 분리된 형태소에 품사 정보 부여
한글 형태소 품사 : 체언, 용언, 관형사, 부사, 감탄사, 조사, 어미, 접사, 어근, 부호, 한글 이외로 나눔
예시) 체언의 세부 품사
NNG | 일반 명사 | NN | 명사 |
NNP | 고유 명사 | NNP | 고유 명사 |
NNB | 의존 명사 | NX | 의존 명사 |
UM | 단위 명사 | NNM | 단위 의존 명사 |
NR | 수사 | NU | 수사 |
NP | 대명사 | NP | 대명사 |
형태소 분석은 하나의 어절의 의미를 정확하게 파악할 수 있고 다양한 자연어처리 작업의 기초가 되며 문맥 이해에도 필수적이다.
🎈KoNLPy
: 한국어 자연어처리를 위한 파이썬 기반 라이브러리
- 한국어 텍스트의 형태소 분석, 품사 태깅 등 제공
형태소 분석기 : Okt, Mecab, Komoran, Hannanum, Kkma 등
그 외
📍soynlp : 한국어 자연어처리를 위한 파이썬 라이브러리 - 단어 추출, L-토크나이저, 품사판별, 전처리 기능 제공
📍Pecab
📍Pororo : 카카오에서 개발한 자연어 처리 라이브러리 - 자연어처리, 음성 관련 태스크 수행 목적
등등
형태소 분석 실습 !!
# KoNLPy 설치 - 이거 설치하면 Okt, Mecab, Komoran, Hannanum, Kkma 등 사용가능
pip install --upgrade pip
pip install JPype1
pip install konlpy --upgrade
최신버전의 JDK도 설치
!apt-get install -qq openjdk-11-jdk
Kkma를 이용해서 품사태깅
#Kkma
from konlpy.tag import Kkma
text = "버스 운행시간을 문의합니다. ?!"
kkma = Kkma()
kkma.nouns(text) # 명사 추출 : ['버스', '운행', '운행시간' ... ]
kkma.pos(text) # 품사 태깅 : [ ('버스' , 'NNG'), ( , ),...]
kkma.tagset['SF'] # SF가 어떤 걸 의미하는지 알려줌 : '마침표, 물음표, 느낌표'
#한 문장 명사만 뽑아서 태깅
kkma_tagset = kkma.tagset
for txt, pos in kkma.pos(text):
if pos.startswith("N"): # N으로 시작하는 태깅명이 다 명사라는 것을 이용
print(txt, " : ", kkma_tagset[pos]) # 버스 : 보통명사 , 운행 : 보통명사 ...
📌 어간 추출 (스태밍, stemming)
: 단어에서 접미사를 제거하여 기본 형태(어간)을 찾는 과정
*표제어표기법 : 단어를 사전적 또는 문법적으로 올바른 기본형으로 변환하는 과정
Okt 의 stemming 기능 이용
#Okt
from konlpy.tag import Okt
okt = Okt()
okt.pos("버스 운행시간을 문의합니다. 어?!~" , norm=True, stem=True). # okt 품사태깅
# norm : 정규화 (표준화) : 어?! -> 어 로 표시
# stem : 어간추출 (기본형) : 합니다 -> 하다 로 표시
# 조사, 어미, 구두점 제거 ['Josa', 'Eomi', 'Punctuation']
def okt_clean(text):
clean_text = []
okt_pos = okt.pos(text, stem=True)
for txt, pos in okt_pos:
if pos not in ['Josa', 'Eomi', 'Punctuation']:
clean_text.append(txt)
return " ".join(clean_text)
okt_cleac(text="제거하고 싶은 문장")
이렇게 만든 okt_clean을 데이터에 적용시키려면 df를 불러온 후 적용해주면 된다.
clean = df['칼럼'].map(okt_clean)
clean
끝-!
모두의 한국어 텍스트 분석과 자연어처리 with 파이썬 강의 | 박조은 - 인프런
박조은 | 파이썬 한국어 텍스트 분석과 자연어처리 워드클라우드 시각화, 형태소 분석, 토픽모델링, 군집화, 유사도 분석, 텍스트데이터 벡터화를 위한 단어 가방과 TF-IDF, 머신러닝과 딥러닝을
www.inflearn.com