«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Recent Posts
Today
Total
관리 메뉴

짜리몽땅 매거진

[Python] 마켓컬리 리뷰 전처리, 워드클라우드 시각화 본문

Data/Python

[Python] 마켓컬리 리뷰 전처리, 워드클라우드 시각화

쿡국 2023. 12. 29. 15:31

그동안 배운 pandas 문법을 사용해 마켓컬리 리뷰로부터 자주 언급되는 단어를 추출해 인사이트를 도출하기 위한 전처리 작업을 진행해보았습니다.

 

시각화는 각 토큰화 단어와 전체 문장 길이의 직관적 비교를 위한 [히스토그램]과 최빈 노출 단어 파악을 위한 [워드클라우드]를 출력했습니다. 각 시각화 그래프는 어떻게 출력됐으며, 어떤 인사이트를 뽑아낼 수 있는지 차근히 살펴보겠습니다.

 

(1) 기초 작업

import pandas as pd
data = pd.read_csv('마켓컬리 리뷰.csv')

 

우선 판다스를 import하고 마켓컬리 리뷰 데이터를 불러옵니다.

 

데이터는 이렇게 5개의 칼럼과 490개의 행으로 구성되어있는 것을 알 수 있습니다.

df = data[['상세제품명','리뷰내용']]
df['리뷰내용'] = df['리뷰내용'].astype(str)

 

리뷰에서 자주 언급되는 단어를 뽑아내는 것이 목적이기에 '상세제품명'과 '리뷰내용'칼럼만 따로 지정합니다.

그리고 워드클라우드를 생성하려면 일반적으로 텍스트 데이터가 필요하며, 이 텍스트 데이터는 문자열 형태여야 합니다. 따라서 astype(str)을 통해 '리뷰내용'칼럼의 데이터를 모두 문자열로 변환하는 작업을 거칩니다.

 

이정도면 간단한 기초 작업은 마무리됩니다.

 

(2) 기초 전처리

import string

def str_punc(x):
    pre_str=[]
    for i in x:
        if i not in string.punctuation:
            pre_str.append(i)
    pre_str = ''.join(pre_str)
    return pre_str

 

리뷰내용 칼럼에는 인사이트 도출에 크게 관여하지 못하는 특수문자가 다수 포함되어있기 때문에 string을 import하고 함수를 지정해 특수문자를 제거하는 작업을 거칩니다.

 

이때 string.punctuation은 다양한 특수문자들을 뜻합니다. 리뷰내용의 객체값들이 특수문자에 포함되면 pre_str 리스트에 추가되지 못합니다. 따라서 최종적으로 한글 단어들만 리스트에 추가됩니다.

df['리뷰내용'] = df['리뷰내용'].apply(str_punc)

 

이제 지정한 함수를 리뷰내용 칼럼 전체에 적용합니다.

 

(3) 문장 토큰화

 

이제 본격적으로 리뷰내용을 단어 별로 쪼개기 위한 토큰화 작업을 진행합니다.

tk_sp = [r.split() for r in df['리뷰내용']]

 

리스트 컴프리헨션을 사용해 리뷰내용 별로 리스트를 각각 생성하고 각 리스트 내에서도 공백에 의해 토큰화가 진행됩니다. 

 

tk_sp_len = [len(t) for t in tk_sp]  #토큰에 대한 길이
tk_t_sp_len = [len(s.replace(' ',"")) for s in df['리뷰내용']] #전체문장에 대한 길이

 

마찬가지로 리스트 컴프리헨션을 사용해 토큰화가 잘 진행되었는지 히스토그램 시각화를 위한 전초 작업을 진행합니다. 

토큰화가 잘 되었다면 더 큰 숫자에서 전체문장에 대한 길이가 표시되는 히스토그램 그래프가 출력되겠죠?

 

import matplotlib.pyplot as plt

plt.figure(figsize=(15,10))
plt.hist(tk_sp_len, bins=50, alpha=0.5, color='r', label='token')
plt.hist(tk_t_sp_len, bins=50, alpha=0.5, color='b', label='all')
plt.yscale('log')

 

matplotlib 라이브러리를 호출하고 범주값들을 설정한 뒤 출력하면!

정말 맛있는 히스토그램이 출력되었습니다. 확실히 토큰 길이는 200이 채 되지도 않는 선에서 멈춘다는 점을 알 수 있습니다. 

 

(4) 형태소 반환

from konlpy.tag import Okt

hannanum = Hannanum()
result = df['리뷰내용'].apply(hannanum.morphs)

 

이제 한국어 토큰화를 지원하는 konlpy 라이브러리를 사용해 형태소로 단어를 다시 한 번 쪼개는 작업을 진행합니다.

형태소 변환을 실시하는 이유는 'ex)맛있어요'와 같은 단어는 모든 리뷰에 똑같이 쓰이는게 아니라 '맛있', '어', '요'로 다시 쪼개져 여러 형태로 작성되기 때문에 필요한 작업이었습니다. 

 

여기서 hannanum.morphs는 텍스트에서 형태소를 변환하는 함수로 리뷰내용 칼럼에 전체 적용한 것을 볼 수 있습니다.

 

(5) 반복문과 정규식을 통한 전처리

import re

list_reg = []
for i in data.리뷰내용:
    if isinstance(i, str):
        리뷰내용 = re.sub('[^가-힣]',' ',i).strip()
        if (리뷰내용 !=''):
            list_reg.append(리뷰내용)

 

다시 한 번 빈 리스트를 생성하고 isinstance를 사용해 리뷰내용 데이터가 문자열인지 한 번 더 확인하여 결측치를 에외처리하는 작업을 거칩니다.

정규식을 통해 한글을 제외한 문자를 모두 공백으로 대체하고 공백이 아니라면 리스트에 추가합니다.

 

(6) 불용어 제거

okt = Okt()

custom_stop = set(['는', '은', '이', '가', '을', '도', '를', '등'])
tokenized_text = [okt.nouns(text) for text in list_reg]

filtered_text = []
for tokens in tokenized_text:
    filtered_tokens = [token for token in tokens if token not in custom_stop]
    filtered_text.append(" ".join(filtered_tokens))

for text in filtered_text:
    print(text)

 

영문 토큰화를 수행할 수 있는 nltk 라이브러리와는 다르게 konlpy 라이브러리는 자체적으로 stopwords 불용어 사전을 제공하지 않기에 사용자가 직접 불용어를 지정해야합니다.

 

따라서 저는 '는', '은', '이', '가', '을', '도', '를', '등' 으로 불용어를 지정했고, 리스트 컴프리헨션을 사용해 명사만 토큰화를 진행했습니다. 이렇게 불용어 제거 작업까지 진행하면 리뷰내용 중에 명사 text만 출력되는 것을 볼 수 있습니다.

 

(7) 워드클라우드 시각화 작업

tk_sp = [i for j in tokenized_text for i in j]

 

앞선 단계에서 tokenized_text 는 각 리뷰 별로 명사가 토큰화된 2차원 리스트이기 때문에 워드클라우드 시각화를 위해 1차원 리스트로 변환해줍니다

 

이렇게 되면 리뷰내용 구분없이 모든 리뷰가 하나의 리스트에 담기게 됩니다.

 

sp_cnt = dict()
for word in tk_sp:
    sp_cnt[word] = sp_cnt.get(word, 0)+1

 

리스트에 담긴 명사 객체들이 몇 번씩 언급되었는지 실제 카운팅을 하는 절차를 거칩니다.

 

from wordcloud import WordCloud

wc = WordCloud(font_path='malgun',width= 500, height = 500, scale =2.0, max_font_size=200, background_color='white')
wc.generate_from_frequencies(sp_cnt)
plt.figure()
plt.imshow(wc)

 

이제 정말 마지막입니다. 워드클라우드 라이브러리를 호출하고 범주값들을 입력합니다.

 

짜자잔~ 근사한 워드클라우드가 출력되었습니다. 맛, 쯔란, 갈비, 소스 등의 단어가 눈에 띕니다.

 

<발견한 인사이트>

 

1. 주요 특징 파악
"쯔란", "맛", "갈비", "소스" 등의 단어들이 빈도수가 높게 나타난 것으로 보입니다. 사용자들이 해당 제품 혹은 음식의 특징에 대해 많은 언급을 하는 것으로 보입니다.

 

2. 만족도 및 관심사 파악
"맛"이라는 단어가 가장 많이 나온 것으로 보아 '맛있다'에서 파생된 단어가 많이 노출된 것으로 보입니다. 제품에 대한 만족도가 높은 것으로 보입니다.


3. 개선점 도출
반대로 부정적인 단어가 빈도수가 높다면, 해당 제품에 대한 사용자들의 불만이나 개선이 필요한 부분을 파악할 수 있습니다. 예를 들어, "쯔란"이 부정적으로 언급된다면 해당 소스의 맛이나 품질에 대한 문제가 있을 수 있습니다. 또한 앞서 언급한 "맛"이라는 단어가 "맛없다"엣 파생될 가능성도 의심해보아야 합니다.


이렇게 마켓컬리 리뷰를 전처리하여 워드클라우드로 시각화하는 작업까지 거쳤는데, 워드클라우드만으로 구체적인 인사이트를 도출하기에 한계가 있지만 기업의 소비자 니즈 파악과 시장 동향 파악에 가장 큰 영향을 미치는 리뷰에 대한 데이터를 다뤄봄으로써 전처리 기초를 다질 수 있었습니다. 다음 번엔 좀 더 심화된 전처리 학습으로 찾아뵙도록 하겠습니다.!!