1. 전체 리뷰 긍부정 비율이 같게 샘플링작업
  2. 리뷰별 라벨링 작업
  3. 긍정 리뷰, 부정 리뷰에서 상위 빈도 단어들을 뽑아 해당 단어의 긍정비율, 부정비율이 얼마인지를 데이터프레임으로 뽑아냄

교수님 피드백

  1. 긍정 비율 결과물

    스크린샷 2022-01-27 오후 10.50.46.png

  2. 부정 비율 결과물

    스크린샷 2022-01-27 오후 10.51.19.png

Find_tokens.ipynb

from Local_ver import *
from Frequency_Analysis import * 
#0. 데이터 읽어들이기
#함수 변수로 쓸만한 것 
filename = '(표제화)스타벅스.csv'

if filename[-3:]=='csv':
    df = pd.read_csv(filename)
elif filename[-4:]=='xlsx':
    df = pd.read_excel(filename)
else:
    print('잘못된 인풋파일 형식입니다.')

try :
    #2. 긍정,부정 데이터프레임 필터
    pos_condition = (df.label == 1) #긍정리뷰 
    neg_condition = (df.label == 0) #부정리뷰 
    
except AttributeError :
    print('긍부정 라벨링 작업이 되어있지 않으므로 실시합니다.')
    #1. 별점을 기반으로 0, 1 라벨링 작업
    df['label'] =0
    df.loc[(df.score == ' 별표 5개 ') | (df.score == ' 별표 4개 '),'label'] = 1 #긍정은 1로
    df.loc[(df.score == ' 별표 1개 ') | (df.score == ' 별표 2개 '),'label'] = 0 #부정은 0으로 라벨링 
    
    #2. 긍정,부정 데이터프레임 필터
    pos_condition = (df.label == 1) #긍정리뷰 
    neg_condition = (df.label == 0) #부정리뷰 

#3.긍정,부정 리뷰 각각 세트별 단어 빈도분석을 위해 같은 수의 샘플을 xlsx로 저장해야하므로 더 작은 개수로 맞춰준다 
pos_review_count = df[pos_condition].label.count() #긍정리뷰 개수
neg_review_count = df[neg_condition].label.count() #부정리뷰 개수
sample_size= min(pos_review_count,neg_review_count) #더 작은 개수로 샘플 사이즈 결정
print('샘플의 개수:',sample_size)

if pos_review_count > neg_review_count:
    #4. 긍정, 부정 리뷰를 각각 따로 파일로 만들어서 빈도분석을 돌린다 
    df_pos = df[pos_condition].sample(sample_size)
    df_neg = df[neg_condition] 
elif pos_review_count < neg_review_count:
    df_pos = df[pos_condition]
    df_neg = df[neg_condition].sample(sample_size)
else:
    df_pos = df[pos_condition]
    df_neg = df[neg_condition]

#df_pos.to_excel(filename1)
#df_neg.to_excel(filename2)

filename1 = '(표제화)스타벅스_긍정리뷰'
filename2 = '(표제화)스타벅스_부정리뷰'

morphs_analysis(filename1)
morphs_analysis(filename2)
#함수 변수로 쓸만한 것 
filename1= '(표제화)스타벅스_긍정리뷰 빈도.xlsx'
filename2= '(표제화)스타벅스_부정리뷰 빈도.xlsx'
word_ratio = 0.1 #상위 1퍼센트의 단어를 살펴본다 

#5. 긍정,부정 단어 사전만들기
if filename[-3:]=='csv':
    pos_df = pd.read_csv(filename1) #긍정리뷰 빈도데이터 프레임
    neg_df = pd.read_csv(filename2) #부정리뷰 빈도데이터 프레임 
elif filename[-4:]=='xlsx':
    pos_df = pd.read_excel(filename1)
    neg_df = pd.read_excel(filename2) #부정리뷰 빈도데이터 프레임 
else:
    print('잘못된 인풋파일 형식입니다.')

sample_size= min(pos_df.freq.count(),neg_df.freq.count()) 

top_count =int(sample_size * word_ratio)

#긍정셋의 상위 빈도 1% 단어 
pos_df_top = pos_df[:top_count]
pos_df_top_lst = pos_df_top['Unnamed: 0'].to_list()

#부정셋의 상위 빈도 1% 단어 
neg_df_top = neg_df[:top_count]
neg_df_top_lst = neg_df_top['Unnamed: 0'].to_list()

#한번씩만 실행해줘야하는 부분. 여러번 실행하면 에러남. 
try:
    pos_df_top= pos_df_top.set_index('Unnamed: 0')
    neg_df_top= neg_df_top.set_index('Unnamed: 0')
except :
    pass
pos_ratio_dict = {} #긍정비율 

#1. 긍정 셋에 나온 단어들 기준으로 
#2. 부정 셋에도 있는 단어라면
#3. 긍정 ratio = 긍정 카운트 / (긍정 카운트 + 부정 카운트)

for i in pos_df_top_lst:
    pos_count = pos_df_top.loc[i].freq
    try : 
        neg_count = neg_df_top.loc[i].freq
    
    except KeyError:
        neg_count = 0 #부정에서는 등장하지 않았을 경우 0으로 처리 
        pass
    
    pos_ratio_dict[i] = pos_count /(neg_count + pos_count)

neg_ratio_dict = {} #부정비율 

#1. 부정 셋에 나온 단어들 기준으로 
#2. 긍정 셋에도 있는 단어라면
#3. 부정 ratio = 부정 카운트 / (긍정 카운트 + 부정 카운트)

for i in neg_df_top_lst:
    neg_count = neg_df_top.loc[i].freq
    
    try : 
        pos_count = pos_df_top.loc[i].freq
    
    except KeyError:
        pos_count = 0
        pass
    
    neg_ratio_dict[i] = neg_count /(neg_count + pos_count)
df1 = pd.DataFrame(list(pos_ratio_dict.items()),
                   columns=['Word', 'Pos_Ratio'])
df1['Pos_Ratio']= pd.to_numeric(df1['Pos_Ratio'])
df1[df1['Pos_Ratio'] >=0.6].to_excel(filename1+'긍정사전.xlsx')

df2 = pd.DataFrame(list(neg_ratio_dict.items()),
                   columns=['Word', 'Neg_Ratio'])
df2['Neg_Ratio']= pd.to_numeric(df2['Neg_Ratio'])
df2[df2['Neg_Ratio'] >=0.6].to_excel(filename2+'부정사전.xlsx')