[NLP] 네이버 쇼핑 리뷰 데이터 분석

민정·2022년 8월 16일
8

NLP

목록 보기
3/6

리뷰 데이터 분석

전처리를 완료한 리뷰데이터 분석을 진행하여 본다.
한글의 문장은 문장간의 의미파악이 중요하기 때문에 단어 단어 사이의 의미 파악, 문장간의 관계를 파악하여 어떤 의미인지 임베딩시키는 학습이 중요하다


문장 임베딩

문장 임베딩 (Sentence Embedding)은 문장이 가지고 있는 의미를 효과적으로 표현할 수 있도록 벡터화하는 작업

문장 수준의 임베딩 기법 : LSA, Doc2Vec, LDA, ELMo, BERT
자연어 추론은 두 문장이 있을 때 해당 두 문장의 의미가 유사한지, 모순되는지, 서로 관련이 있는지를 분류하는 작업

본 실습에서는 Ko-Senetence-Transformerr Word Embedding 을 진행하였다!
처음에는 tf-idf vectorizer을 이용하여 Word Embedding을 진행해보았는데, 위에서 언급하였던 단어 단어 사이의 의미가 잘 파악되지 않는 단점이 있어 문장임베딩 의 정확도를 높이고자 Ko-Sentence-Transforemers을 사용하였다


Ko-Senetence-transformers

1. Ko-Senetence-transformers 패키지 설치

pip install ko-sentence-transformers

2. 크롤링을 진행한 네이버 쇼핑 리뷰 데이터를 이용하여 실습 진행

sunstic_review=pd.read_csv('./sunstic_review.csv)


선스틱 리뷰 데이터는 다음과 같다. 총 5721개의 리뷰 데이터를 수집하였다.

3. 감성분석

리뷰데이터에서 유용하지 않은 리뷰들, 즉 감정이 담겨있지 않고 상품의 정보에 대한 호/불호가 없는 데이터들을 삭제하여 주는 작업을 진행하였다. 감성어 사전은 KNU 감성어 사전을 불러와 이용하였다
txt로 된 감성어사전을 dictionary 형태로 변환하여 csv 로 저장해주었다.

#감성어 사전 불러오기 
!git clone https://github.com/park1200656/KnuSentiLex.git
f = pd.read_csv('/content/KnuSentiLex/SentiWord_Dict.txt','\t')
sentiment_dictionary=pd.read_csv('SentiWord_tocsv.csv',header=None, index_col=0,squeeze=True).to_dict() #사전형태로 변경 

4. POS TAG 진행

POS TAG는 PyKOMORAN으로 진행하였다. Okt 나 Mecab 등 다양한 형태소 분석기가 존재하지만 리뷰데이터에 가장 알맞다고 판단되어 KOMORAN을 선택하였다.

!pip install PyKomoran #Komoran 설치
from PyKomoran import *
import re
komoran= Komoran(DEFAULT_MODEL['LIGHT'])
n_= []

for i in range(len(sunstic)):
  nouns = komoran.get_morphes_by_tags(sunstic.iloc[i]['review'], tag_list=['NNP', 'NNG','VA'])
  n_.append(' '.join(nouns))
sunstic['nouns'] = n_
sunstic = sunstic[sunstic['nouns']!='']

그 결과 위와 같이 명사와 형용사가 추출되었다.

5. Lemmatize

감성어 사전에 적용시킬 수 있도록 형용사를 명사로 변경한다

def lemmatize(sentence):
    morphtags = komoran.pos(sentence)
    words = []
    for m, t in enumerate(morphtags) :
      k = t.get_pos()
      if k=='NNP' or k=='NNG' :
        words.append(t.get_morph())
      elif k=='VA' or k=='VV' :
        words.append(t.get_morph()+'다')
    return words

w_ = []
for i in range(len(sunstic)) :
  words = lemmatize(sunstic.iloc[i]['review'])
  w_.append(' '.join(words))
sunstic['words'] = w_  
sunstic = sunstic[sunstic['words']!='']


이와 같은 결과가 나와 형용사가 명사로 바뀌어 저장된 것을 확인할 수 있다.

6. 감성 분석

감성어사전을 이용하여 감성분석을 진행하고 sent_score을 주어 점수를 매기는 과정을 거친다. 그 후에 sent_score이 0 인 리뷰들은 제거하여 리뷰분석에 유용한 리뷰들만 추출해낸다

total = []
for i,w  in enumerate(sunstic['words']):
    sent_score = 0
    w= w.split(' ')
    for j in w:
        if(len(j)<=1):
          continue
        elif(j not in sentiment_dictionary):
          continue
        else:
          sent_score = sent_score + float(sentiment_dictionary[j])
    total.append(sent_score/len(w))
sunstic['sent_score'] = total
sunstic_df=pd.read_csv('sunstic_감정분석.csv')
for i in range(len(sunstic_df)):
  if float(sunstic_df.iloc[i]['sent_score'])==0.0:
      print(i,sunstic_df.iloc[i]['review'])
    sunstic_k=sunstic_df.drop(sunstic_df.index[i])
  else :
     continue

7. 워드 임베딩 진행

그 후 이전에 설치했던 sentence_transformers를 이용하여 워드 임베딩을 진행한다

from sentence_transformers import SentenceTransformer,util

embedder = SentenceTransformer("jhgan/ko-sbert-sts")
sunstick_one_embeddings = embedder.encode(k)

8. 클러스터링 진행

자!! 이제까지 진행한 과정들을 거쳐 클러스터링을 진행하였다
본 실습에서는 DBScan을 이용하였는데 , 추후에 Clustering 기법들에 대하여 따로 정리하여 올려두어야겠다.

from sklearn.cluster import DBSCAN
import numpy as np

model = DBSCAN(eps=0.1, min_samples=6,metric = "cosine")
cluster2 = model.fit_predict(sunstick_one_embeddings)
sunstic_k['dbscan'] = cluster2
for cluster_num in set(cluster_label) :
  if (cluster_num == 0) :
    continue
  else : 
    print("cluster num : {}".format(cluster_num))
    temp_df = sunstic_k[sunstic_k['dbscan'] == cluster_num] # cluster num 별로 조회
    for review in temp_df['review'] :
      print(review) 
    print()


클러스터링 결과를 확인하여 봤을때 나름 문장간의 관계를 파악하여 클러스터링이 잘되어 있는 것을 확인할 수 있다 ! 여러가지 클러스터링 기법, 워드 임베딩을 적용하였는데 여기까지의 결과가 나온 것만으로도 상당히 만족하였다!
한국어 전처리는 역시 쉽지 않음을 깨닫고 그치만 그 과정에서 내가 부딪혔었던 문제들을 해결해가며 한층 더 자연어처리에 한발짝 다가간 기분이 들었다.

클러스터링까지 진행해보았지만 생성요약도 시간이 된다면 추가로 공부해서 시도해봐야겠다 !

참고/레퍼런스
ko-sentence-transformers
BERT-WordEmbedding Tutorial
KoSentenceBERT-SKT

profile
공부 기록장

2개의 댓글

comment-user-thumbnail
2023년 10월 4일

도움이 많이 되었어요 감사합니다

답글 달기
comment-user-thumbnail
2024년 4월 16일

안녕하세요. 혹시 k에는 어떤 값이 들어가는지 궁금한데 전체 소스코드 깃헙 링크를 알수 있을까요?

답글 달기