Python tech/NLP

[Python, keras] 딥러닝을 활용한 감성 예측 + 그래프 생성(plot)

콜레오네 2021. 2. 7. 06:05

지난 포스팅에서 keras를 활용하여 딥러닝 모델을 생성했습니다.

생성된 모델을 활용하여 새로운 데이터의 감성을 예측해봅시다.

 

저장된 RNN 모델을 불러옵니다.

이때, TextVectorization으로 생성된 모델이기 때문에, custom_objects에 TextVectorization를 설정해주어야 합니다.

 

# load RNN model
rnn_model = tf.keras.models.load_model("../save_dir/rnn_model", \
custom_objects={"TextVectorization":TextVectorization})

 

새로운 댓글 데이터의 감성값을 예측하는 방법입니다.

sentiment = float(rnn_model.predict([comment]))

predict()를 이용하여 댓글 감성을 예측합니다.

 


예측된 감성값을 이용하여 딕셔너리를 생성하고, json에 저장해줍니다.

딕셔너리의 key는 date, value는 article url을 key로하는 딕셔너리입니다.

다시 article url이 key, 그리고 value는 댓글과 감성값입니다.

결과 json은 다음과 같은 형식입니다.

감성값 예측이 완료된 json

 

모든 댓글의 감성값 예측이 완료되었습니다.



기사가 존재하는 날짜당 감성값

가중 평균(Weight Average)=[기사당 댓글 수/날짜 전체 댓글 수 * 기사 평균 감성값]을 먼저 구한 다음

 

아래 URL(IMDb에서 투표 수를 고려한 영화 랭크 방법)에서 공식을 참조합니다

www.quora.com/How-does-IMDbs-rating-system-work 

 

날짜 당 총 댓글 수를 N, 감성 수치가 신뢰를 얻기 위한 날짜당 최소 댓글 수를 L이라고 한다.

전체 기간의 감성 평균을 e, 그리고 날짜당 가중 평균값을 W라고 한다.

날짜당 감성값을 계산하는 공식은 아래와 같다

 

날짜당 감성값 =  N / (N+L) * W + L / (N+L) * e

 


matplotlib을 통해서 그래프를 그려봅시다.

다음은 이전, 이후 기간의 감성값과 추세선을 그려주는 함수

def make_graph_flow(tablename, x, y, x2, y2, fig):
    
    plt.figure(fig, figsize=(16, 5)) # 그래프 사이즈
    # 한글 적용을 위한 폰트 설정
    font_name = font_manager.FontProperties(fname='./font/font_name.ttf', size=20).get_name()
    rc('font', family=font_name)
    
    plt.title(font_title,fontsize=22) #그래프 제목 설정
    a =0
    nx=[]
    #날짜가 문자열이기 때문에, 오름차순 정렬 위해 숫자 리스트를 x축 값으로 입력
    for s in range(len(x)):
        nx.append(s) 
        a+=1
    nx = np.array(nx)
    ny = np.array(y)
    m, bb = np.polyfit(nx, ny, 1) #추세선 계산
    #추세선 그리기
    plt.plot(nx, m*nx + bb, 'r--', color='#819FF7' , label="Before Trend Line")
    #이전 기간 적용
    plt.plot(nx, y, 'bo', color='#04B404', label="Before Emotion" )

    nx2 = [ e+2 for e in range(a-1, a-1+len(x2)) ] # 이후 기간 x 축 값
    nx2 = np.array(nx2)
    ny2 = np.array(y2)
    m2, bb2 = np.polyfit(nx2, ny2, 1) # calculate trend line
    #추세선 계산 및 적용
    plt.plot(nx2, m2*nx2 + bb2, 'r--', color='#FAAC58' , label="After Trend Line" )
    #이후 기간 적용
    plt.plot(nx2, y2, 'bo', color='#FF0080' , label="After Emotion" )
    
    # 날짜 x라벨 표시 (년/월로만 표시하기 위함)
    month_list, temp, year_temp = [], "", ''
    for month in x:
        month, year = month.split("/")[1],  month.split("/")[0][2:]
        if temp != month :  # 월이 바뀌면
            temp = month
            month_list.append(month)
            if  year_temp != year: #년도가 바뀌면
                month_list[-1] = year+"/"+ month_list[-1]
                year_temp = year
        else: month_list.append("")
    for month in x2:
        month, year = month.split("/")[1],  month.split("/")[0][2:]
        if temp != month : 
            temp = month
            month_list.append(month)
            if  year_temp != year: 
                month_list[-1] = year+"/"+ month_list[-1]
                year_temp = year
        else: month_list.append("")

    plt.ylim([0.0, 1.02]) # y축 범위 지정
    plt.xlabel('Date',fontsize=18) # x라벨
    plt.ylabel('Emotion',fontsize=18) # y라벨
    plt.xticks(rotation=6,fontsize=13) # x 라벨 회전(rotation)
    plt.yticks(fontsize=16)
    plt.xticks(range(0,len(month_list)), month_list)
    plt.legend()
    # 그래프 저장
    plt.savefig("../result/emotion/"+tablename+'-graph-emotion.png', dpi=400) 
    return 0

위 함수를 적용하여 나온 그래프는 아래와 같습니다.

 

코로나19 전후의 기독교 감성 변화
코로나19 전후의 천주교 감성 변화
코로나19 전후의 불교 감성 변화

한국의 3대 종교인 기독교 천주교 불교에 대한 그래프만 모아보았습니다.

'신천지', '종교' 키워드로 검색한 결과 그래프는 Github에서 보실 수 있습니다.

github.com/Minku-Koo/Comment-Sentiment-Analysis

 

작은 차이이지만, 코로나19 유입 이후 기간이 감성 값이 낮아진 것으로 확인됩니다.

과연 이 차이가 유의미한 차이인지 분석하는 것은 다음 포스팅에서 알아보겠습니다.

반응형