Jay's Project/포켓몬 소드&실드 리뷰 분석

[Metacritic 포켓몬 S/S 리뷰 분석 프로젝트] 3. 데이터 전처리

jay3108 2022. 7. 18. 18:21

지난 포스트까지 크롤링 코드를 통해 타겟 데이터를 수집하고 전처리를 위한 데이터 프레임을 구성하였다. 이번 포스팅에서는 전처리 이슈를 파악하고 해결하는 과정을 담아보려고 한다. 

데이터 전처리

데이터 분석이든 ML이나 DL을 활용한 인공지능 관련 프로젝트든 가장 기본이 되는 재료는 데이터이다. data-driven한 프로젝트에서 본격적으로 분석하고 알고리즘을 적용하기 이전에 목적에 맞게 데이터를 가공하는 과정이 필요하다.

전처리 이슈는 수집된 raw 데이터를 직접 살펴보면서 체크한다. 기획 단계에서부터 타겟 데이터의 raw 데이터 특성을 파악하면 수집하는 단계에서 상당 부분을 미리 처리 할 수도 있을 것 같다. 또한 이슈 탐색에 공을 들이면 실제로 전처리를 수행하는 과정이 좀 더 명확해지는 것 같다. 

 

전처리 이슈

특정 문자, 단어 제거 이슈

"collape " 제거

저번 포스팅의 크롤링 이슈에서 매 리뷰마다 'expand'를 클릭해야 전문을 볼 수 있는 문제가 있었다. expand 버튼을 클릭하면 'collape'로 바뀌고 전문을 크롤링하는 과정에서 해당 단어도 같이 포함되어 마지막에 남았다. 따라서 긴 리뷰의 경우 해당 단어를 포함하는 경우가 많아 전처리 단계에서 제거해야 했다. 

"This review contains spoilers" 제거

스토리에 대한 스포일러를 포함하는 경우 스포일러 포함 경고 문구가 리뷰 앞에 삽입된다. 따라서 위의 "collpase"와 마찬가지로 지워야 하지만 문장이라는 점에서 접근 방법이 다를 수 있다.  

 

이제 전처리를 위한 아이디어를 생각해보자.

현재 데이터의 특성을 살펴보면 각 리뷰마다 "collapse" 가장 마지막, "This review contains spoilers"는 가장 처음에 위치해있다. 전체 데이터프레임을 문장으로 스플릿 한 뒤 데이터프레임에서 저 문장, 단어를 포함하는 리뷰 컬럼의 행 인덱스를 구해서 리스트화 한 뒤 for문으로 제거한다. 따라서 str.contains 를 이용해 특정 단어와 문장을 포함하는 데이터만을 선별한 뒤 해당 인덱스를 리스트로 형태로 가져온다. 그 후 마침표 단위로 각 리뷰를 스플릿하여 iloc 으로 인덱스를 이용하여 제거하는 방식을 적용하였다. spoilers의 첫번째 인덱스, collpase의 마지막 인덱스를 지정하여 제거한 뒤 다시 합쳐서 데이터 프레임으로 재구성한다.

 

# csv 불러오기
df_all = pd.read_csv('all_raw.csv',encoding='utf-8')
df_all = df_all.drop("Unnamed: 0", axis=1) # csv 1열 unnamed 제거
df_all2 = df_all.copy() # df_all 복사해서 df_all2로 정제 진행 -> 이후 review 컬럼에 덮어씌우기만 하면 됨 / 제대로 전처리 되었는지 비교하기 좋음

##### This review contains spoilers 문장, collapse 단어 제거 #####

spoilers =df_all2.index[df_all2['Review'].str.contains('This review contains spoilers.')].tolist() # This review contains spoilers 문장을 포함하는 index 가져오기
collapse =df_all2.index[df_all2['Review'].str.contains('Collapse')].tolist() # Collapse 문장을 포함하는 index 가져오기 index 가져오기
df_all2=df_all2.Review.str.split('.') # . 기준으로 스플릿 -> 문장 단위로 나뉨 / pandas.core.series.Seriess로 자료형 변경됨

for i in spoilers:
    del df_all2.iloc[i][0] # This review contains spoilers 제거
for i in collapse:
    del df_all2.iloc[i][-1] # collapse 제거

df_all2=df_all2.str.join(sep='.') # 다시 글 하나로 합치기
df_all2=pd.DataFrame(df_all2) # pandas.core.series.Series를 dataframe으로 바꾸기

 

정규표현식 이용해서 특수문자 등 제거

정규표현식을 이용하여 이모지와 이모티콘, 특수문자를 제거한다. 프로젝트 과정에서 %나 $등 의미있는 특수문자를 살리는 방법을 고민하지 못했던 것이 아쉬운 점이다. 또한 이후에 이어질 감성분석을 고려하면 이모티콘을 살리는 알고리즘을 적용할 수도 있을 것이다. 

import re

def preprocessor(text): # 머신러닝 교과서 영화 리뷰 감성분석 참고 (알고리즘을 위한 것인지 모르겠지만 깔끔하게 지우지못함)
    text = re.sub('<[^>]*>', '', text) # html문자제거
    emoticons = re.findall('(?::|;|=)(?:-)?(?:\)|\(|D|P)', text) # :), :/,:\ 등의 이모티콘 모두 찾기 
    text = (re.sub('[^A-Za-z]+', ' ', text.lower()) + ' '.join(emoticons).replace('-', '')) # Non-alphanumeric 문자 및 '-' 제외하고 삭제하며 소문자화, 끝에 이모티콘 붙이기
    return text
    
df_all['Review'] = df_all2['Review'].apply(preprocessor) #df_all의 review 컬럼에 정제 결과 덮어 씌우기
df_all

 

영어 외의 다른 언어 처리

위의 리뷰는 스페인어로 작성되었다. metacritic은 전세계 유저가 모두 이용하는 사이트로 raw data를 대략적으로 확인한 결과 포르투갈어, 스페인어, 일본어, 중국어 등의 리뷰가 있었다. 특히 스페인어의 경우 상당히 많은 수의 리뷰가 있었다. 약 4000개의 리뷰 데이터를 직접 확인해서 제거할 수도 없으니 영어 외의 다른 언어를 분류하여 인덱스를 추출해야 하는 상황이었다. 이 때 적용한 라이브러리가 파이썬 언어감지 라이브러리 langid 이다. 

 

파이썬 언어 감지 라이브러리들 비교 | Daily Log

파이썬 언어 감지 라이브러리들 비교 사용자 입력값을 보고 언어를 감지하고자 한다. 요구사항은... 정확성이 높고. 이름과 같이 짧을 단어(한 글자, 두 글자)까지도 커버. (optional) 빠르고 다양한

jiyeonseo.github.io

 

langid

langid.py is a standalone Language Identification (LangID) tool.

pypi.org

langid 외에 langdetect 등의 라이브러리가 있으며 적용하기 간편한 langid를 사용하였다. 상기 블로그에서 좋은 포스팅을 참고하여 링크를 남긴다. 

!pip install langid
import langid

lang_list = []
for i in df_all['Review']:
	detected = langid.classify(i)
    lang_list.append(detected[0])
df_all['Language'] = lang_list
df_all['Language'].unique() # 언어 종류 파악

df_all[df_all['Language']=='en'] # 영어 리뷰의 갯수 파악

df_all=df_all[df_all['Language']=='en'].reset_index(drop=True)
df_all = df_all.dropna(axis=0)
df_all = df_all.drop("Unnamed: 0", axis=1)
df_all.to_csv('poke_all_clean.csv',encoding='utf-8')
df_all.info()

데이터 프레임 저장

여기까지 전처리 이슈를 파악하고 나름의 방식대로 해결해보았다. 전처리의 경우는 다양한 데이터를 다루는 프로젝트를 진행하면서 해결방법에 대해 정리해놓는 것이 도움이 될 것 같다. kaggle이나 dacon에서 얻을 수 있는 raw data로 연습하는 것도 좋지만 본인의 프로젝트에 맞추어 데이터를 수집하고 전처리를 수행하다보면 여러가지 아이디어를 고안하고 문제를 창의적으로 해결하는 역량을 키울 수 있을 것이다. 

 

다음으로는 전처리가 완료된 정제된 데이터를 바탕으로 시각화를 진행한다.