오늘은 NLP, 챗봇 학습을 위한 텍스트 데이터 텍스트 마이닝을 진행하겠습니다

 

 

 

1. 데이터 준비

pip install Korpora
from import Korpora import Korpora
review_corpus = Korpora.load('nsmc')

nsmc는 네이버 영화 리뷰 데이터로 텍스트 마이닝 실습을 위해 사용해보겠습니다

데이터는 15만개 리뷰 데이터로 레이블은 긍정, 부정 입니다

 

 

 

2. 데이터 확인

import pandas as pd
review_corpus_df =  pd.DataFrame()

review_corpus_df['doc']   = review_corpus.train.get_all_texts()
review_corpus_df['label'] = review_corpus.train.get_all_labels()

review_corpus_df.head()

비어있는 데이터 프레임 review_corpus_df를 만든 후 글과 레이블을 추가해서 확인하는 코드입니다

리뷰 글과 부정 긍정을 0,1로 확인할 수 있습니다

 

 

 

 

3. 워드클라우드 시각화

pip install wordcloud

from wordcloud import WordCloud, STOPWORDS
from PIL import Image
import numpy as np

heart_mask = np.array( Image.open('heart.jpg') )

stopwords = set(STOPWORDS)

# 워드 클라우드
wc = WordCloud( 
  font_path = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf',
  max_words = 300,
  stopwords = stopwords,
  mask = heart_mask,
  background_color='white'
)

wc_gen = wc.generate( review_posi_text )

# 시각화
plt.figure( figsize=(7,7) )
plt.imshow( wc_gen )
plt.axis('off')
plt.show()

heart 사진에 워드클라우드를 만드는 코드입니다

 

stopwords 불용어를 배제해줍니다

wc wordcloud로 font 설정, 시각화할 빈도개수 300개, 불용어, heart 그림에 시각화 하여 워드클라우드를 만들었습니다

 

wc_gen은 빈도 서열입니다

 

마지막으로 plot으로 시각화 한 이미지입니다

 

 

 

4. 말뭉치 분절

from konlpy.tag import Mecab
tokenizer = Mecab()

review_corpus_df.doc = review_corpus_df.doc.apply( 
                                           lambda x: ' '.join(tokenizer.morphs(x)) )

Mecab으로 불필요한 품사 제거 및 재조립을 진행합니다

 

 

 

 

5. 백터화

from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(min_df=1, decode_error='ignore')

X = vectorizer.fit_transform( review_corpus_df.doc )

데이터 백터화를 통해 len()로 확인 해보면 50991개의 토큰으로 백터화 되었음을 확인할 수 있습니다

 

 

 

 

 

6. 유사도 검사

def check_answer_sim( user_sentnece='' ):
  if not user_sentnece:
    return '입력 필요'
  
  chatbot_df['score'] = 0

  # 1. 입력 백터화
  user_sentnece_vec = vectorizer.transform( [ my_sentence_change(user_sentnece) ] ).toarray()[0]    

  # 3. 유사도 score 계산
  chatbot_df['score'] = chatbot_df.Q2_vec.apply( lambda x: cos_sim(user_sentnece_vec, x) )
  #print(chatbot_df['score'])

  # 4. 유사 문장 return
  return chatbot_df.loc[ chatbot_df['score'].idxmax() ]['A']

챗봇에서 주로 사용되는 방법이지만 문장 -> 분절 -> 백터화를 통해 유사도를 측정하여 비슷한 문장을 찾을 수 있으며 이를 통해 결론을 도출할 수 있습니다

 

max를 사용하면 챗봇의 형태가 되며 리뷰에서 max값 여러개를 통해 리뷰의 성격을 파악하여 결론을 도출할 수 있으며 또한 백터화된 토큰과 워드클라우드를 통해 리뷰 성격 파악을 할 수 있습니다

+ Recent posts