<jupyter_start><jupyter_text>---  scikit-learn 나이브 베이즈 감정 분석<jupyter_code>cv = CountVectorizer()
transformed_text = cv.fit_transform(train_data)
clf = MultinomialNB()
clf.fit(transformed_text, train_emotion)
test_data = ['i am curious', 'i feel gloomy and tired', 'i feel more creative', 'i feel a little mellow today']
doc_vector = cv.transform(test_data)
test_result = clf.predict(doc_vector)
print(test_result)<jupyter_output>['surprise' 'sadness' 'joy' 'joy']<jupyter_text>---   cal_partial_freq 텍스트 데이터(texts)와 특정 감정(emotion)을 매개변수로 가지며, 해당 감정을 나타내는 문서를 filtered_texts에 저장<jupyter_code>def cal_partial_freq(texts, emotion):
    partial_freq = dict()
    filtered_texts = texts[texts['emotion']==emotion]
    filtered_texts = filtered_texts['sentence']
    
    # 전체 데이터 내 각 단어별 빈도수를 입력해 주는 부분
    for sent in filtered_texts:
        # words = sent.rstrip().split()
        # for word in words:
        for word in sent.rstrip().split():
            if word not in partial_freq:
                partial_freq[word] = 1
            else:
                partial_freq[word] += 1
    
    return partial_freq<jupyter_output><empty_output><jupyter_text>cal_total_freq partial_freq 딕셔너리를 입력받아, 특정 감정별 문서 내 전체 단어의 빈도수를 계산하여 반환<jupyter_code>def cal_total_freq(partial_freq):
    total = 0
    # partial_freq 딕셔너리에서 감정별로 문서 내 전체 단어의 빈도수를 계산하여 반환하는 부분 
    for word, freq in partial_freq.items():
        total += freq
    
    return total
# Emotions dataset for NLP 
data = pd.read_csv("emotions_train.txt", delimiter=';', header=None, names=['sentence','emotion'])

# happy가 joy라는 감정을 표현하는 문장에서 발생할 가능도 
joy_counter = cal_partial_freq(data, "joy")
joy_likelihood = joy_counter['happy'] / cal_total_freq(joy_counter)
print(joy_likelihood)

# happy가 sadness라는 감정을 표현하는 문장에서 발생할 가능도 
sad_counter =  cal_partial_freq(data, "sadness")
sad_likelihood = sad_counter['happy'] / cal_total_freq(sad_counter)
print(sad_likelihood)

# can이 surprise라는 감정을 표현하는 문장에서 발생할 가능도 
sup_counter =  cal_partial_freq(data, "surprise")
sup_likelihood = sup_counter['can'] / cal_total_freq(sup_counter)
print(sup_likelihood)<jupyter_output>0.001415604166467398
0.0005952589376378725
0.002363652280486737<jupyter_text>cal_prior_prob입력되는 data 내 특정 감정의 로그 발생 확률 을 반환해 주는 함수<jupyter_code>def cal_prior_prob(data, emotion):
    filtered_texts = data[data['emotion'] == emotion]
    # data 내 특정 감정의 로그발생 확률을 반환하는 부분 
    
    return np.log(len(filtered_texts)/ len(data))<jupyter_output><empty_output><jupyter_text>predict_emotion매개변수 data를 학습 데이터로 사용하여 sent의 각 감정별 로그 확률을 계산해 주는 함수* 감정별 로그 확률 계산을 위해 단어의 로그 가능도를 사용* 스무딩 값을 10으로 설정<jupyter_code>def predict_emotion(sent, data):
    emotions = ['anger', 'love', 'sadness', 'fear', 'joy', 'surprise']
    predictions = []
    train_txt = pd.read_csv(data, delimiter=';', header=None, names=['sentence', 'emotion'])

    # sent의 각 감정별 로그 확률을 predictions 리스트에 저장 
    for emotion in emotions:
        prob = 0
        for word in sent.split():
            emotion_counter = cal_partial_freq(train_txt, emotion)
            prob += np.log((emotion_counter[word] + 10) / (cal_total_freq(emotion_counter) + 10))
        prob += cal_prior_prob(train_txt,emotion)
        predictions.append((emotion,prob))
    predictions.sort(key = lambda a : a[1])
    return predictions[-1]<jupyter_output><empty_output><jupyter_text>* (감정, 확률)의 형태로 predictions 리스트에 저장* 확률값이 가장 높은 (감정, 확률) 튜플을 반환<jupyter_code># 문장의 예측된 감정을 확인
test_sent = "i really want to go and enjoy this party"
predicted = predict_emotion(test_sent, "emotions_train.txt")
print(predicted)<jupyter_output>('surprise', -49.413280143234715)
StarcoderdataJupyterStructuredCleanDedup