NLP

[NLP] 자연어처리 2. 형태소 분석

sueeee-e 2024. 9. 27. 16:03

앞서 워드클라우드 정리 중 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

 

끝-!


https://inf.run/uh9Xr

 

모두의 한국어 텍스트 분석과 자연어처리 with 파이썬 강의 | 박조은 - 인프런

박조은 | 파이썬 한국어 텍스트 분석과 자연어처리 워드클라우드 시각화, 형태소 분석, 토픽모델링, 군집화, 유사도 분석, 텍스트데이터 벡터화를 위한 단어 가방과 TF-IDF, 머신러닝과 딥러닝을

www.inflearn.com