파이썬 한글 전처리

이주현·2023년 11월 30일
0

머신러닝

목록 보기
2/14

형태소 분석기별 메서드 정리

출처 : https://konlpy-ko.readthedocs.io/ko/v0.4.3/


1) Hannanum : KAIST에서 개발

  • analyze : 다양한 형태학적 후보를 반환
  • morphs : 형태소 토큰화
  • nouns : 명사 토큰만 반환
  • pos : 형태소에 품사 태깅하여 반환

2) Kkma : 서울대에서 개발

  • morphs : 형태소 토큰화
  • nouns : 명사 토큰만 반환
  • pos : 형태소에 품사 태깅하여 반환
  • sentences : 문장 토큰화

3) Komoran : Shineware팀에서 개발

  • morphs : 형태소 토큰화
  • nouns : 명사 토큰만 반환
  • pos : 형태소에 품사 태깅하여 반환

4) Mecab : 교토대에서 일본어용으로 개발된 분석기, 은전 프로젝트에 의해 한국어용 개발

  • morphs : 형태소 토큰화
  • nouns : 명사 토큰만 반환
  • pos : 형태소에 품사 태깅하여 반환

5) Okt(Twitter) : Will Hohyon Ryu가 개발

  • morphs : 형태소 토큰화
  • nouns : 명사 토큰만 반환
  • phrases : 다양한 형태학적 후보를 반환
  • pos : 형태소에 품사 태깅하여 반환
#konlpy 설치
!pip install konlpy

from konlpy.tag import Hannanum, Okt, Kkma

# 객체 생성
okt = Okt()

# 형태소 분석기 : 형태소 단위로 쪼개기
okt.morphs(kor_text) 

okt.morphs('갈 수도 있고 아닐 수도 있고', stem = True)
=> ['갈다', '수도', '있다', '아니다', '수도', '있다']

# 명사 추출
okt.nouns(kor_text)

# 품사 태깅
okt.pos(kor_text)



1. 토큰화

코모란(Komoran) 토큰화

from konlpy.tag import Komoran

komoran = Komoran()

kor_text = "인간이 컴퓨터와 대화하고 있다는 것을 
꺠닫지 못하고 인간과 대화를 계속할 수 있다면 컴퓨터는 지능적인 것으로 간주될 수 있다."

komoran_tokens = komoran.morphs(kor_text)
print(komoran_tokens)

=>
['인간', '이', '컴퓨터', '와', '대화', '하', '고', '있', 
'다는', '것', '을', '꺠닫지', '못하', '고', '인간', '과', '대화', '를', '계속', 
'하', 'ㄹ', '수', '있', '다면', '컴퓨터', '는', '지능', '적', '이', 'ㄴ', '것',
'으로', '간주', '되', 'ㄹ', '수', '있', '다', '.']

한나눔(Hannanum) 토큰화

from konlpy.tag import Hannanum

hannanum = Hannanum()

kor_text = "인간이 컴퓨터와 대화하고 있다는 것을 꺠닫지 못하고 인간과 대화를 계속할
수 있다면 컴퓨터는 지능적인 것으로 간주될 수 있다."

hannanum_tokens = hannanum.morphs(kor_text)
print(hannanum_tokens)

=>
['인간', '이', '컴퓨터', '와', '대화', '하고', '있', '다는', '것', '을',
'꺠닫지', '못하', '고', '인간', '과', '대화', '를', '계속', '하', 'ㄹ', '수', 
'있','다면', '컴퓨터', '는', '지능적', '이', 'ㄴ', '것', '으로', '간주', '되',
'ㄹ', '수', '있','다', '.']

Okt 토큰화

from konlpy.tag import Okt

okt = Okt()

okt_tokens = okt.morphs(kor_text)
print(okt_tokens)

=>
['인간', '이', '컴퓨터', '와', '대화', '하고', '있다는', '것', '을', '꺠닫', 
'지', '못', '하고', '인간', '과', '대화', '를', '계속', '할', '수', '있다면',
'컴퓨터', '는', '지능', '적', '인','것', '으로', '간주', '될', '수', 
'있다', '.']

Kkma 토큰화

from konlpy.tag import Kkma

kkma = Kkma()

kkma_tokens = kkma.morphs(kor_text)
print(kkma_tokens)

=>
['인간', '이', '컴퓨터', '와', '대화', '하', '고', '있', '다는', '것', '을',
'꺠', '닫', '지', '못하', '고', '인간', '과', '대화', '를', '계속', '하', 'ㄹ',
'수', '있', '다면', '컴퓨터', '는', '지능', '적', '이', 'ㄴ', '것', '으로',
'간주', '되', 'ㄹ', '수', '있', '다', '.']

norm(정규화) = True, False

  • norm = True로 설정하면 텍스트를 정규화하여 표준화된 형태로 변환
  • 한글 문장에서 맞춤법 및 띄어쓰기 오류를 보정하는데 도움
  • 예를 들어, "한글입니다."와 "한글 입니다."의 정규화 결과로
    "한글입니다."로 변환된다.

stem = True

  • True로 설정하면 형태소 분석 결과에서 각 단어의 어간을 추출

  • 어간 추출은 단어의 원형을 찾는 작업으로 동사의 형태를 제거하고
    기본 형태로 단어를 표현

  • 예를 들어, "가고"라는 동사의 형태가 있을때,

  • 'stem=True'로 설정하면 이를 "가다" 라고 추출

  • 'stem=False'로 설정하면 원형 그대로 "가고"로 추출

kor_text= "그래욬ㅋzz잘해봅시다! 
잘하고 있지만 더 잘해보면 좋지 않을까라고 생각하는 중"

from konlpy.tag import Okt
okt = Okt()

# norm = False
print(okt.morphs(kor_text, norm = False))
=>
['그래욬', 'ㅋㅋㅋ', '잘', '해봅시다', '!', '잘', '하고', '있지만', '더', '잘',
'해보면', '좋지', '않을까', '라고', '생각', '하는', '중']

# norm = True
print(okt.morphs(kor_text, norm=True))
=>
['그래요', 'ㅋㅋㅋ', '잘', '해봅시다', '!', '잘',
'하고', '있지만', '더', '잘', '해보면', '좋지', '않을까', '라고', '생각', 
'하는', '중']

# stem = True
print(okt.morphs(kor_text, stem = True))
=>
['그래욬', 'ㅋㅋㅋ', '잘', '해보다', '!', '잘', '하다', '있다', '더', '잘', 
'해보다', '좋다', '않다', '라고', '생각', '하다', '중']

2. 한글 품사 부착(Pos Tagging)

코모란(Komoran) 품사 태깅

komoranTag = []

for token in komoran_tokens:
  komoranTag += komoran.pos(token)

print(komoranTag)

=>
[('인간', 'NNG'), ('이', 'MM'), ('컴퓨터', 'NNG'), ('오', 'VV'), 
('아', 'EC'), ('대화', 'NNG'), ('하', 'NNG'), ('고', 'MM'),('있', 'VV'), 
('달', 'VV'),('는', 'ETM'), ('것', 'NNB'), ('을', 'NNG'), ('꺠닫지', 'NA'), 
('못', 'MAG'),('하', 'MAG'), ('고', 'MM'), ('인간', 'NNG')]

한나눔(Hannanum) 품사 태깅

hannanum_Tag = []

for token in hannanum_tokens:
  hannanum_Tag += hannanum.pos(token)

print(hannanum_Tag)
=>
[('인간', 'N'), ('이', 'M'), ('컴퓨터', 'N'), ('와', 'I'), ('대화', 'N'), 
('하', 'P'), ('고', 'E'), ('있', 'N'), ('다', 'M'), ('는', 'J'), ('것', 'N'),
('을', 'N'), ('꺠닫지', 'N'), ('못하', 'P'), ('어', 'E'),
('고', 'M'), ('인간', 'N')]

Okt 품사 태깅

oktTag = []

for token in okt_tokens:
  oktTag += okt.pos(token)

print(oktTag)
=>
[('인간', 'Noun'), ('이', 'Noun'), ('컴퓨터', 'Noun'), ('와', 'Verb'),
('대화', 'Noun'), ('하고', 'Verb'), ('있다는', 'Adjective'), ('것', 'Noun'), 
('을', 'Josa'), ('꺠닫', 'Noun'), ('지', 'Verb'), ('못', 'Noun'), 
('하고', 'Verb'), ('인간', 'Noun')]

Kkma 품사 태깅

kkmaTag = []

for token in kkma_tokens:
  kkmaTag += kkma.pos(token)

print(kkmaTag)
=>
[('인간', 'NNG'), ('이', 'NNG'), ('컴퓨터', 'NNG'), ('오', 'VA'), 
('아', 'ECS'), ('대화', 'NNG'), ('하', 'NNG'), ('고', 'NNG'), ('있', 'VA'),
('달', 'VV'), ('는', 'ETD'), ('것', 'NNB'), ('을', 'NNG'), ('꺠', 'UN'),
('닫', 'VV'), ('지', 'NNG'), ('못하', 'VX'), ('고', 'NNG'), ('인간', 'NNG')]

3. 불용어 처리(StopWord) 처리

  • 분석에 불필요한 품사를 제거하고, 불필요한 단어(불용어)를 제거한다
# 불용어 처리
stopPos = ['Suffix','Punctuation','Josa','Foreign','Alpha','Number']

#최빈어 조회: 최빈어를 조회하여 불용어 제거 대상을 선정
from collections import Counter
Counter(oktTag).most_common()

=>
[(('인간', 'Noun'), 2),
 (('컴퓨터', 'Noun'), 2),
 (('대화', 'Noun'), 2),
 (('하고', 'Verb'), 2),
 (('것', 'Noun'), 2),
 (('수', 'Noun'), 2),
 (('이', 'Noun'), 1),
 (('와', 'Verb'), 1),
 (('있다는', 'Adjective'), 1),
 (('을', 'Josa'), 1),
 (('꺠닫', 'Noun'), 1),
 (('지', 'Verb'), 1),
 (('못', 'Noun'), 1),
 (('과', 'Noun'), 1),
 (('를', 'Noun'), 1),
 (('계속', 'Noun'), 1),
 (('할', 'Verb'), 1),
 (('있다면', 'Adjective'), 1),
 (('는', 'Verb'), 1),
 (('지능', 'Noun'), 1),
 (('적', 'Noun'), 1),
 (('인', 'Noun'), 1),
 (('으로', 'Josa'), 1),
 (('간주', 'Noun'), 1),
 (('될', 'Verb'), 1),
 (('있다', 'Adjective'), 1),
 (('.', 'Punctuation'), 1)]

stopWord = ['의','이','로','두고','들','를','은','과','수','했다','것','있는',
'한다','하는','그','있다']

word =[]
for tag in oktTag:
  if tag[1] not in stopPos:
    if tag[0] not in stopWord:
      word.append(tag[0])

print(word)

=>
['인간', '컴퓨터', '와', '대화', '하고', '있다는', '꺠닫', '지', '못', '하고',
'인간', '대화', '계속', '할', '있다면', '컴퓨터', '는', '지능', '적', '인',
'간주', '될']
profile
Backend Delveloper

0개의 댓글