TIL & WIL/Machine Learning
0803. klue 데이터 사용, 형태소 분석해보기(KoNLPy)
니츄
2023. 3. 28. 22:54
klue 데이터란?
- ChatGPT 이모한테 물어보았다.
형태소란?
- ChatGPT 이모한테 물어보았다.
KoNLPy란?
- ChatGPT 이모한테 물어보았다.
colab 데이콘 데이터 불러오기
# 로컬 PC에서 실습 시 직접 데이콘 사이트에 회원가입하고 다운로드 해주세요.
import os, platform
base_path = "data/klue/"
def file_exist_check(base_path):
if os.path.exists(f"{base_path}train_data.csv"):
print(f"{base_path} 경로에 파일이 이미 있음")
return
if platform.system() == "Linux":
print(f"파일을 다운로드 하고 {base_path} 경로에 압축을 해제함")
!wget https://bit.ly/dacon-klue-open-zip
if not os.path.exists(base_path):
os.makedirs(base_path)
!unzip dacon-klue-open-zip -d data/klue
else:
print(f"""https://dacon.io/competitions/official/235747/data 에서 다운로드 하고
실습 경로 {base_path}에 옮겨주세요.""")
return
file_exist_check(base_path)
# 학습, 예측 데이터셋을 불러옵니다.
train = pd.read_csv(f"{base_path}train_data.csv")
test = pd.read_csv(f"{base_path}test_data.csv")
train.shape, test.shape
# 토픽을 불러옵니다.
topic = pd.read_csv(f"{base_path}topic_dict.csv")
topic
1. 문자 전처리하기
# 정규표현식
import re
def preprocessing(text):
# 한글, 영문, 숫자만 남기고 모두 제거하도록 합니다.
text = re.sub('[^가-힣ㄱ-ㅎㅏ-ㅣa-zA-Z0-9]', ' ', text
# 중복으로 생성된 공백값을 제거합니다.
text = re.sub('[\s]+', ' ', text)
# 영문자를 소문자로 만듭니다.
text = text.lower()
return text
# !pip install tqdm --upgrade
# tqdm 으로 전처리 진행 상태를 표시
from tqdm import tqdm
tqdm.pandas()
# map을 통해 전처리 일괄 적용
train["title"] = train["title"].progress_map(preprocessing)
test["title"] = test["title"].progress_map(preprocessing)
# topic_idx값을 한글로 바꿉니다.
# join은 인덱스값이 같은 값끼리 연결해줍니다.
train['topic_idx'].value_counts(1).to_frame().join(topic['topic'])
2. 형태소 분석하기 (!pip install konlpy --upgrade)
- from konlpy.tag import Okt
- 형태소 분석기 Okt
- norm과 stem
# KoNLPy를 통해 필요없는 조사, 어미, 구두점을 제거해봅니다.
from konlpy.tag import Okt
okt = Okt()
print(okt.morphs(u'선인장에 물을 줬더니 쑥쑥 자랐닼ㅋㅋㅋㅋ'))
=> ['선인장', '에', '물', '을', '줬더니', '쑥쑥', '자랐닼', 'ㅋㅋㅋㅋ']
print(okt.morphs(u'선인장에 물을 줬더니 쑥쑥 자랐닼ㅋㅋㅋㅋ', norm=True))
=> ['선인장', '에', '물', '을', '줬더니', '쑥쑥', '자랐다', 'ㅋㅋㅋ']
print(okt.morphs(u'선인장에 물을 줬더니 쑥쑥 자랐닼ㅋㅋㅋㅋ', norm=True, stem=True))
=> ['선인장', '에', '물', '을', '주다', '쑥쑥', '자르다', 'ㅋㅋㅋ']
# okt.morphs가 아닌 pos를 사용해봅니다.
print(okt.pos('선인장에 물을 줬더니 쑥쑥 자랐닼ㅋㅋㅋㅋ', norm=True, stem=True))]
=> [('선인장', 'Noun'),
('에', 'Josa'),
('물', 'Noun'),
('을', 'Josa'),
('주다', 'Verb'),
('쑥쑥', 'Adverb'),
('자르다', 'Verb'),
('ㅋㅋㅋ', 'KoreanParticle')]
# word_list라는 이름의 빈 리스트를 생성해줍니다.
# okt_pos라는 리스트 내 모든 요소에 대해 반복문을 진행합니다.
# okt_pos는 okt.pos로 위의 문장에 품사를 태깅하여 (형태소, 품사)형태의 튜플이 들어있는 리스트입니다.
# txt라는 변수에 튜플의 첫번째 요소인 형태소를 할당
# pos라는 변수에 튜플의 두번째 요소인 품사를 할당
# 품사가 조사나 어미나 구두점이 아니라면
# word_list에 형태소를 넣어줍니다.
# word_list의 요소들 사이에 빈 문자열을 넣어줍니다.
word_list = []
for word in okt_pos:
txt = word[0]
pos = word[1]
if pos not in ['Josa', 'Adverb', 'KoreanParticle']:
word_list.append(txt)
' '.join(word_list)
=> '선인장 물 주다 자르다'
- from konlpy.tag import Kkma
- 형태소 분석기 Kkma
- morphs, nouns, pos
# Kkma
from konlpy.tag import Kkma
kkma = Kkma()
print(kkma.morphs(u'선인장에 물을 줬더니 쑥쑥 자랐다..'))
=> ['선인장', '에', '물', '을', '주', '었', '더니', '쑥쑥', '자라', '었', '다', '..']
print(kkma.nouns(u'선인장에 물을 줬더니 쑥쑥 자랐다..'))
=> ['선인장', '물']
print(kkma.pos(u'선인장에 물을 줬더니 쑥쑥 자랐다..'))
=>[('선인장', 'NNG'), ('에', 'JKM'), ('물', 'NNG'), ('을', 'JKO'), ('주', 'VV'), ('었', 'EPT'),
('더니', 'ECD'), ('쑥쑥', 'MAG'), ('자라', 'VV'), ('었', 'EPT'), ('다', 'ECS'), ('..', 'SW')]
- from pecab import PeCab
- !pip install pecab
from pecab import PeCab
pecab = PeCab()
pecab.pos("저는 오늘도 미루고 미루다가 늦은 밤에 복습을 하네요.")
=> [('저', 'NP'),
('는', 'JX'),
('오늘', 'NNG'),
('도', 'JX'),
('미루', 'VV'),
('고', 'EC'),
('미루', 'VV'),
('다가', 'EC'),
('늦', 'VA'),
('은', 'ETM'),
('밤', 'NNG'),
('에', 'JKB'),
('복습', 'NNG'),
('을', 'JKO'),
('하', 'VV'),
('네요', 'EF'),
('.', 'SF')]
3. 불용어 제거 (stop_word)
# 불용어 제거
def remove_stopwords(text):
tokens = text.split(' ')
# 제거할 불용어를 list에 담습니다.
stops = [ '합니다', '하는', '할', '하고', '한다',
'그리고', '입니다', '그', '등', '이런', '및','제', '더']
# 리스트컴프리헨션으로 작성합니다.
meaningful_words = [w for w in tokens if not w in stops]
return ' '.join(meaningful_words)
# train, test 데이터에 불용어 제거 함수를 적용합니다.
train["title"] = train["title"].map(remove_stopwords)
test["title"] = test["title"].map(remove_stopwords)
정말.. 어려워서 다 이해 못했지만
나 울지안아..