[NLP 4] tokenization 2 : mecab & kiwipiepy

방선생·2025년 1월 10일

대표적인 한글 형태소 분석기

Mecab, kiwipiepy


mecab 한글 형태소 분석기

  • 라이브러리 설치 및 임폴트
    ① 라이브러리 설치
    !pip install python-mecab-ko
    ② 라이브러리 임폴트
    import mecab


  • 클래스 함수 사용 방법
    ① 클래스 함수 호출, 객체 생성, df = pd.DataFrame()와 동일한 과정
    mc = mecab.MeCab()

    ② 기능1. 형태소 분석
    1) mc.morphs(text)
    2) 결과물 : 리스트 [형태소1, 형태소2, ...]

    ③ 기능2. 형태소 분석 + 품사 tagging
    1) mc.pos(text)
    2) 결과물 : 리스트 [(형태소1, 품사), (형태소2, 품사2), ...]

    ④ 기능3. 명사 추출
    1) mc.nouns(text)
    2) 결과물 : 리스트 [명사1, 명사2, ...]


(이 시리즈의 모든 코드는 코랩환경에서 Python으로 작성하였습니다)

# text data 생성
text_ko='''산업통상자원부는 지난 2개월간 공모절차를 진행한 결과, 시스템반도체 검증지원센터의 입지로 성남 판교가 최종 선정됐다고 9일 밝혔다.
시스템반도체 검증지원센터는 제2판교 테크노벨리에 위치한 성남 글로벌 융합센터 내에 조성될 계획이다.
올해부터 2028년까지 5년간 국비 150억원, 지방비 64억5000만원 등 총 214억5000만원의 예산을 투입해 한국팹리스산업협회, 한국반도체산업협회, 성남산업진흥원, 한국전자기술연구원 등이 함께 구축한다.
센터는 중소·중견기업이 확보하기 어려운 검증용 첨단장비를 구비하고, 전문 검증인력을 채용해 반도체 검증 환경을 구축할 예정이다.
또 검증 전문 인력 및 수요 측면 전문가들이 팹리스 기업에 설계의 취약점 분석하고, 해결방안을 제시해 ‘제품의 상용화’도 지원한다.
오는 8월까지 공간을 조성하고, 올해 하반기부터 기업들에게 검증지원 서비스를 제공할 예정이다.
산업부 관계자는 “설계 프로그램(EDA), 시제품 제작 등 반도체 설계를 중점 지원하는 ‘설계지원센터’와 검증·상용화를 지원하는 ‘검증지원센터’를 연계할 예정”이라며 “반도체 칩 설계-검증-상용화 전주기에 걸친 밀착 지원으로 팹리스들의 경쟁력을 높일 수 있을 것”이라고 기대했다.'''
  • (NLTK 코드에서 사용된 text와 같음)

mecab Code (형태소 단위 토큰화)

# mecab 형태소 분석기 활용
!pip install python-mecab-ko

import mecab #라이브러리 임폴트
mc = mecab.MeCab() #클래스 함수 호출, 객체 생성

morphs_ko = mc.morphs(text_ko) #형태소 분석
pos_ko = mc.pos(text_ko) #형태소 + 품사
nouns_ko = mc.nouns(text_ko) #명사만 추출

print(morphs_ko, '\n',len(morphs_ko), '\n')
print(word_ko, '\n',len(word_ko), '\n')

print('-'*100, '\n')

print(pos_ko, '\n')
print(nouns_ko)



Kiwi(Korean Intelligent Word Identifier) 지능형 한국어 형태소 분석기

  • 라이브러리 설치 및 임폴트
    ① 라이브러리 설치
    !pip install kiwipiepy
    ② 클래스 함수 임폴트
    from kiwipiepy import Kiwi

  • 클래스 함수 사용 방법
    ① 클래스 함수 호출, 객체 생성
    kiwi = Kiwi()

    ② utils안에 있는 Stopwords 활용
    1) utils.Stopwords() == 불용어 처리

    ③ 기능 : 형태소 분석 + 품사 tagging
    1) kiwi.tokenize(text, normalize_coda=True)
    2) 결과물
    [Token 자료형, ...][Token(form='한글', tag='NNG', start=0, len=2), ...]

kiwipiepy Code 1 (불용어 리스트 생성)

# kiwi 형태소 분석기 활용
!pip install kiwipiepy

import kiwipiepy #라이브러리 임폴트

kw = kiwipiepy.Kiwi(typos='basic_with_continual') #클래스 함수 호출, 객체 생성
stop_words = kiwipiepy.utils.Stopwords() #utils안에 있는 Stopwords 활용

###################################################

# 불용어 추출
## 객체.Stopwords > python 자료형 > set() 집합 자료형 > list 자료형으로 변환
stopwords_list = list(stop_words.stopwords)

print(stopwords_list, '\n\n', len(stopwords_list),'', len(set(stop_words.stopwords)))
  • kiwipiepy의 매개변수 typos : 오타교정 함수
    • kiwipiepy.Kiwi(typos='basic’) : 기본적인 오타 교정
    • kiwipiepy.Kiwi(typos='continual’) : 형태소 간의 연철 오타를 교정
    • kiwipiepy.Kiwi(typos='basic_with_continual’) : 위 두 오타 정의자를 합친 오타 정의자

kiwipiepy Code 2 (불용어 포함한 형태소 분석)

# 불용어 포함해서 형태소 분석
morphemes_kw = kw.tokenize(text_ko, normalize_coda=True)

print(morphemes_kw, '\n\n') # kiwi 형태소 분석기 활용

# unpacking : 리스트(튜플)의 성분 원소의 수 만큼 변수를 설정하여 분해 할 수 있음
for morph, pos, _, _ in morphemes_kw: 
  print(f'형태소: {morph},  품사: {pos}')
  • normalize_coda : 초성을 인식함 (기본적으로 False)
    • kiwi.tokenize(”text”, normalize_coda = False/True)
  • Python의 기능 - unpacking
    • for a, b, c, d… in 리스트(튜플):

kiwipiepy Code 3 (불용어가 제거된 형태소 분석)

# 형태소 분석 + 불용어 제거
morphemes_kw2 = kw.tokenize(text_ko, normalize_coda=True, stopwords=stop_words)

print(len(morphemes_kw2), '\n\n')

for morph, pos, _, _ in morphemes_kw2:
  print(f'형태소: {morph},  품사: {pos}')
  • kiwi.tokenize(text, normalize_coda=True)
    • [Token(form=’TEXT', tag=’품사', start=리스트번호, len=TEXT길이), ...]으로 결과값 출력함
    • kiwi형태소 분석기는 리스트의 형태로 결과를 출력하기 때문에 따로 형태소를 추출해야함

Q) kiwi분석기에서 오타교정함수 + 초성함수False로 하면 분석이 이상해진다

  • 초성인식을 키지않으면 ‘엌’을 인식을 하지 못해서 ‘밥먹었엌’을 분석하지 못함
  1. T / T는 왜 되는냐?
    1. 엌을 변환했지만, 뒤 초성과 결합하여 텍스트가 표준형으로 변함
  2. F / F는 왜 되느냐?
    1. 기본설정에서 의미있는 단어들을 분리하려고 함 + 기본 설정이 구체적인 문법 규칙에 따라 처리함
  3. T / F는 왜 안되느냐?
    1. 오타를 교정할때 문장의 흐름을 고려해 텍스트를 처리함 그렇기 때문에 엌을 교정하는 과정에서 하나의 의미단위로 결합 함
    2. 하지만 초성을 인식하지 않기 때문에 T/T때 처럼 뒤 초성과 결합하지 않기 때문에 표준형으로 변하지 않아 분석이 안된다.

kiwipiepy Code 4 (체언 추출)

# 형태소 분석 후 용언 추출
## 불용어 제거 후 결과에 적용
### 결과 값을 저장할 빈 리스트 생성
nouns_kiwi = [] #체언
nouns_kiwi2 = [] #명사

# for + if문 > 불용어가 제거된 후 형태소 중에서 길이가 1보다 큰 명사만 추출(보통 길이1인 명사는 큰 뜻이 없을 경우가 많음)
for morph, pos, _, _ in morphemes_kw2:
  if pos.startswith('N'): 
    nouns_kiwi.append(morph)

    if pos.startswith('NN'):
      nouns_kiwi2.append(morph)


print(nouns_kiwi)
print(len(nouns_kiwi))

print("\n")

print(nouns_kiwi2)
print(len(nouns_kiwi2))
  • startswith : 문자열 전용 함수 - 문자열.startswith('변수')
    • 문자열이 '변수'로 시작하는 지 여부를 확인하는 함수 => 문자열[0]이 ‘변수’인지 확인








참고자료
pypi mecab-ko

pypi kiwipiepy

kiwipiepy documentation (v0.18.0)

profile
AI & Robotics

0개의 댓글