본문 바로가기
Python/Data Analysis

[텍스트 분석] konlpy 한글 형태소 분석

by skwkiix 2024. 2. 22.
728x90

0. 텍스트 전처리 단계

1. 데이터 정제 (Python 문법, 정규표현식 사용)

2. 영어/한글에 따라 전처리 진행(nltk, konlpy)

  • 토큰화 : 텍스트의 단위를 token으로 나누기
    • 문장토큰화/단어토큰화/단어보다 더 작은 형태로 토큰화
  • 정규화 : 어간 추출, 표제어 추출
    • ex) go, goes > go
  • 품사 태깅 : 명사, 대명사, 형용사 등으로 분석 요구에 따라 태깅

 

👉  이번 포스팅 : konlpy 라이브러리를 사용하여 형태소 분석 하는 방법

(mac 사용자의 경우, 설치 과정이 복잡하고 에러가 빈번하므로 Jupyter보다 Colab에서 사용하길 권장한다)


1. Konlpy 라이브러리 설치 및 임포트

Konlpy(Korean Natural Language Processing in Python) 한국어 텍스트 데이터를 처리하고 분석하는 데 사용하는 파이썬 라이브러리로 다양한 한국어 형태소 분석기를 제공한다.

 

  • konlpy 설치
#!pip install konlpy

 

  • Okt : 형태소 분석기 임포트
from konlpy.tag import Okt

 

Okt 메소드 

  1. morphs(phrase): 형태소 단위로 분리
    • 주어진 문장(phrase)을 형태소 단위로 분석 > 형태소 리스트 반환
  2. nouns(phrase): 형태소 단위로 분리 후, 명사만 추출
    • 주어진 문장(phrase)을 형태로 단위로 분리 후, 명사만 추출하여 리스트로 반환
  3. pos(phrase, norm=False, stem=False):
    • 주어진 문장(phrase)을 형태소 단위로 분석 > (형태소, 품사)튜플을 리스트로 반환
    • norm: 정규화 여부를 설정하는 매개변수로, True로 설정하면 형태소의 정규화된 표현을 반환
    • stem: 어간 추출 여부를 설정하는 매개변수로, True로 설정하면 형태소의 어간을 추출한 결과를 반환
  4. normalize(phrase):
    • 주어진 문장(phrase)을 정규화하여 반환('갑니다', '가요' > '가다')
  5. phrases(phrase):
    • 주어진 문장(phrase)에서 어절들을 추출하여 리스트로 반환
  6. tagset:
    • Okt 형태소 분석기에서 사용되는 품사 태그의 목록을 반환

 

형태소 분석 방법

k = Okt() # 객체 생성(임의로 k 사용)

 

(예시 문장)

sentence = "머신러닝은 컴퓨터가 데이터를 분석하고 패턴을 학습하여 문제를 해결하거나 예측하는 인공지능의 한 분야입니다.
머신러닝 알고리즘은 대규모 데이터셋을 기반으로 하여 복잡한 관계를 발견하고 모델을 훈련시키는데,
이를 통해 의사 결정을 내리거나 예측을 수행할 수 있습니다. 머신러닝 기술은 다양한 분야에서 활용되며,
자연어 처리, 이미지 인식, 의료 진단, 금융 예측 등 다양한 문제에 적용되어 사회적 가치를 창출하고 있습니다.
딥러닝과 같은 고급 머신러닝 기술의 발전으로 인해 머신러닝은 더욱 강력하고 정교한 모델을 개발하고 최적화할 수 있게 되었습니다."

 

(1) morphs : 형태소 단위로 분리

print(k.morphs(sentence))

 

['머신', '러닝', '은', '컴퓨터', '가', '데이터', '를', '분석', '하고', '패턴', '을', '학습', '하여', '문제', '를', '해결', '하', '거나', '예측', '하는', '인공', '지능', '의', '한', '분야', '입니다', '.', '\n', '머신', '러닝', '알고리즘', '은', '대규모', '데이터', '셋', '을', '기반', '으로', '하여', '복잡한', '관계', '를', '발견', '하고', '모델', '을', '훈련', '시키는데', ',', '\n', '이를', '통해', '의사', '결정', '을', '내리거나', '예측', '을', '수행', '할', '수', '있습니다', '.', '머신', '러닝', '기술', '은', '다양한', '분야', '에서', '활용', '되며', ',', '\n', '자연어', '처리', ',', '이미지', '인식', ',', '의료', '진단', ',', '금융', '예측', '등', '다양한', '문제', '에', '적용', '되어', '사회', '적', '가치', '를', '창', '출하', '고', '있습니다', '.', '\n', '딥', '러닝', '과', '같은', '고급', '머신', '러닝', '기술', '의', '발전', '으로', '인해', '머신', '러닝', '은', '더욱', '강력하고', '정교한', '모델', '을', '개발', '하고', '최적화', '할', '수', '있게', '되었습니다', '.']

 

(2) nouns : 형태소 단위로 분리 후, 명사만 추출

print(k.nouns(sentence))

 

['머신', '러닝', '컴퓨터', '데이터', '분석', '패턴', '학습', '문제', '해결', '거나', '예측', '인공', '지능', '분야', '머신', '러닝', '알고리즘', '대규모', '데이터', '셋', '기반', '관계', '발견', '모델', '훈련', '통해', '의사', '결정', '예측', '수행', '수', '머신', '러닝', '기술', '분야', '활용', '자연어', '처리', '이미지', '인식', '의료', '진단', '금융', '예측', '등', '문제', '적용', '사회', '가치', '창', '출하', '딥', '러닝', '고급', '머신', '러닝', '기술', '발전', '머신', '러닝', '더욱', '모델', '개발', '최적화', '수']

 

(3) pos : 품사 태깅, 튜플 형태로 반환

print(k.pos(sentence))

 

[('머신', 'Noun'), ('러닝', 'Noun'), ('은', 'Josa'), ('컴퓨터', 'Noun'), ('가', 'Josa'), ('데이터', 'Noun'), ('를', 'Josa'), ('분석', 'Noun'), ('하고', 'Josa'), ('패턴', 'Noun'), ('을', 'Josa'), ('학습', 'Noun'), ('하여', 'Verb'), ('문제', 'Noun'), ('를', 'Josa'), ('해결', 'Noun'), ('하', 'Suffix'), ('거나', 'Noun'), ('예측', 'Noun'), ('하는', 'Verb'), ('인공', 'Noun'), ('지능', 'Noun'), ('의', 'Josa'), ('한', 'Verb'), ('분야', 'Noun'), ('입니다', 'Adjective'), ('.', 'Punctuation') -- 이하 생략

 

원하는 품사만 반환 ( 예시, 명사만 반환)

pos_result = k.pos(sentence)
nouns = [word for word, pos in pos_result if pos == 'Noun'] # pos 가 Noun인 word만 추출
print(nouns)

 

['머신', '러닝', '컴퓨터', '데이터', '분석', '패턴', '학습', '문제', '해결', '거나', '예측', '인공', '지능', '분야', '머신', '러닝', '알고리즘', '대규모', '데이터', '셋', '기반', '관계', '발견', '모델', '훈련', '통해', '의사', '결정', '예측', '수행', '수', '머신', '러닝', '기술', '분야', '활용', '자연어', '처리', '이미지', '인식', '의료', '진단', '금융', '예측', '등', '문제', '적용', '사회', '가치', '창', '출하', '딥', '러닝', '고급', '머신', '러닝', '기술', '발전', '머신', '러닝', '더욱', '모델', '개발', '최적화', '수']

 

(4) postag : 품사 태그 목록

tagset 으로 konlpy 에 내장된 품사 태그 목록을 확인할 수 있다.

print(k.tagset)

 

{'Adjective': '형용사', 'Adverb': '부사', 'Alpha': '알파벳', 'Conjunction': '접속사', 'Determiner': '관형사', 'Eomi': '어미', 'Exclamation': '감탄사', 'Foreign': '외국어, 한자 및 기타기호', 'Hashtag': '트위터 해쉬태그', 'Josa': '조사', 'KoreanParticle': '(ex: ㅋㅋ)', 'Noun': '명사', 'Number': '숫자', 'PreEomi': '선어말어미', 'Punctuation': '구두점', 'ScreenName': '트위터 아이디', 'Suffix': '접미사', 'Unknown': '미등록어', 'Verb': '동사'}