
# 데이터로딩
import pandas as pd
train_text = pd.read_csv("./train_origin_text.csv")
test_text = pd.read_csv("./test_origin_text.csv")

한국어 형태소 분리시 자주 활용하는 konlpy를 사용
1. jdk, Jype 등을 설치 - PC 상태에 따라 안 되는 경우 많음 -> colab으로 진행
2. konlpy 형태소 분석기 중에서 mecab이 있음 -> 리눅스 운영체제에서 사용 가능 -> colab으로 진행
# konlpy 설치
!pip install konlpy
https://konlpy.org/ko/latest/index.html

from konlpy.tag import Okt, Kkma, Mecab
https://github.com/SOMJANG/Mecab-ko-for-Google-Colab
# mecab을 위한 설치
!git clone https://github.com/SOMJANG/Mecab-ko-for-Google-Colab.git
%cd Mecab-ko-for-Google-Colab
!bash install_mecab-ko_on_colab_light_220429.sh
okt = Okt() # 트위터 기반으로 시작된 형태소 분석기 -> 비교적 신조어 분리에 강함
kkma = Kkma() # 속도는 느림, 품사태깅이 디테일하다
mecab = Mecab() # 처리 속도가 빠르다
# 형태소 분리
okt.morphs("아버지가 방에 들어가신다.")
kkma.morphs("아버지가 방에 들어가신다.")

# 형태소 분리 및 품사 부착
okt.pos("아버지가 방에 들어가신다.")
kkma.pos("아버지가 방에 들어가신다.")

# 태그셋 확인
print(okt.tagset)
print(kkma.tagset)

# okt의 토큰 정규화 및 어근 추출
okt.pos("어제는 저녁을 맛있게 먹었닼ㅋ", norm=True, stem=True)

!pip install emoji
import emoji
from tqdm import tqdm
train_rm_emoji = [emoji.replace_emoji(s) for s in train_text['문장']]
# kkma vs mecab
train_text.dropna(inplace=True)
train_kkma_morphs = [kkma.morphs(s) for s in tqdm(train_rm_emoji)]
-> kkma 시간 오래 걸린다
train_mecab_morphs = [mecab.morphs(s) for s in tqdm(train_rm_emoji)]

-> mecab이 kkma에 비해 상대적으로 시간 빠름
# 정규표현식 활용 클렌징
import re # 정규표현식을 사용할 수 있는 모듈 로딩
# 클렌징할 패턴 생성
unsmile_p = re.compile('[!?,.:;0-9a-zA-zㅋㅎㄷㅇ~]+')
clean_morphs_train = [] # 클렌징된 단어토큰이 들어갈 리스트
for s in train_mecab_morphs: # 형태소로 분리된 훈련용 문장 전체반복
temp = [] # 한 문장을 담을 리스트
for w in s : # 하나의 문장에서 형태소 단위로 반복
if unsmile_p.search(w): # 단어토큰이 패턴에 매칭된다면
continue # 다음 단어 반복으로 넘어감
if len(w) < 2 : # 한글자 단어라면
continue # 다음 단어 반복으로 넘어감
temp.append(w) # 패턴에 매칭되지 않는 다면 리스트에 추가
clean_morphs_train.append(temp) # 한 문장을 전체 리스트에 추가
clean_morphs_test = [] # 클렌징된 단어토큰이 들어갈 리스트
for s in test_mecab_morphs: # 형태소로 분리된 훈련용 문장 전체반복
temp = [] # 한 문장을 담을 리스트
for w in s : # 하나의 문장에서 형태소 단위로 반복
if unsmile_p.search(w): # 단어토큰이 패턴에 매칭된다면
continue # 다음 단어 반복으로 넘어감
if len(w) < 2 : # 한글자 단어라면
continue # 다음 단어 반복으로 넘어감
temp.append(w) # 패턴에 매칭되지 않는 다면 리스트에 추가
clean_morphs_test.append(temp) # 한 문장을 전체 리스트에 추가
print(len(clean_morphs_train))
print(len(clean_morphs_test))

# 피클을 이용해 전처리된 파일 저장
import pickle
with open("./clean_morphs_train.pkl", "wb") as f: # wb 쓰기모드
pickle.dump(clean_morphs_train, f)
with open("./clean_morphs_test.pkl", "wb") as f: # wb 쓰기모드
pickle.dump(clean_morphs_test, f)

# 'ex05_2_텍스트마이닝_응용_konlpy_사용하기.ipynb' 파일에서 처리한 데이터 로딩
import pickle
with open("./data/clean_morphs_train.pkl", 'rb') as f : # rb 읽기모드
clean_morphs_train = pickle.load(f)
with open("./data/clean_morphs_test.pkl", 'rb') as f : # rb 읽기모드
clean_morphs_test = pickle.load(f)


from sklearn.feature_extraction.text import CountVectorizer
sample_text = clean_morphs_train[:3]
sample_cv = CountVectorizer() # BOW를 해주는 객체 생성
print(sample_text[0])
print(sample_text[1])
print(sample_text[2])

# step 1 : 토큰화 및 단어사전 구축
# countvectorize에 토큰화 기능이 내장되어 있어 문장을 하나로 묶어주는 전처리 작
sample_text2 = [" ".join(s) for s in sample_text]
sample_text2
sample_cv.fit(sample_text2)
# 구축된 단어사전 확인 -> 25개 단어 등장
# 빈도에 따라 수가 올라간다
sample_cv.vocabulary_

# step 2 : 단어사전을 기반으로 문장 내의 단어빈도를 측정
result = sample_cv.transform(sample_text2)
result
# 3문장(행)을 25개 단어(컬럼)로 표현되도록 변환

# 만약 데이터를 직접 보고 싶다면 활용
result.toarray()

# 단어사전을 데이터 프레임을 변환
result_df = pd.DataFrame([sample_cv.vocabulary_.keys()],
columns = sample_cv.vocabulary_.values())
result_df = result_df.sort_index(axis=1) # 컬럼을 기준으로 정렬
result_df

pd.concat([result_df, pd.DataFrame(result.toarray())])
