1. Multinomial Naive Bayes(다항 분포 나이브 베이즈) 알고리즘
우선 다항 분포 나이브 베이즈 알고리즘을 이해하기 전에, 나이브 베이즈 분류기의 기본 원리를 이해할 필요가 있다.
나이브 베이즈는 텍스트 분류를 위해 전통적으로 사용되는 분류기로 인공신경망 알고리즘에 속하지 않지만, 머신 러닝의 주요 알고리즘으로 분류되어 좋은 성능을 보여주는 조건부 확률모델이다. 원리는 조건부 확률을 계산하는 베이즈 정리에서 유도되었다. 베이즈 정리는 사후확률(Posterior Probability)=(가능성(Prior)*사전확률(Class Prior Probability)) /특정 개체가 나타날 확률(Predictor Prio Probability) 로, 다음과 같이 나타낼수 있다.
이때 x를 형성하는 feature 들은 여러개가 가능하여 x=(x1,x2,..,xn)으로 나타낼수 있다. 이 베이즈 정리에 naive 한 특성이 들어가는데, 바로 feature들이 서로 독립된 변수처럼 가정되는것이다.
이에 따라 위의 식은 P(Ck|X)=P(x1,x2,...xn)|Ck)*P(Ck)/P(x1,x2..,xn) 으로 여러 feature을 가진것이 독립된 변수이기 때문에 이를 P(Ck|X)=P(x1|Ck)*P(x2|Ck)*...p(xn|Ck)*P(Ck)/(P(x1)*P(x2)*..P(xn)) 으로 나타낼수 있게 되는것이다. 여기서 여러 경우 중 가장 높은 확률을 가지는 것을 선택하는 방식이다. 좀더 직관적으로 이해하기 위해서 나이브 베이즈 분류기가 자주 활용되는 스팸필터 원리를 예시로 볼 수 있다.
어떠한 텍스트들이 입력되었을때 이것이 스팸메일인지 확인하기 위해서는 P(정상 메일 | input 텍스트), P(스팸 메일|input 텍스트) 를 비교하여 더 높은 확률인것을 확인하면 된다. 즉, input 텍스트가 입력되었을때 정상 메일일 확률이 높은지 스팸메일일 확률이 높은지 비교하는것이다. 위에서 언급하였듯이 input 텍스트 x 는 여러 feature들을 가질 수 있다고 하였다. 이 feature 들은 텍스트들을 토큰화하고, 형태소 분석기를 통해 유의미한 단어(명사,형용사,동사)로 설정할 수 있다. 따라서 x를 x=(word1,word2,...wordn)과 같이 유의미한 단어 n 개로 나타낼수 있는데, 'naive'한 성격의 분류기이므로 x 내의 word1,word2,...wordn을 각각 독립적인 변수로 생각한다. 따라서 다시 다음과 같이 식을 변경가능하다.
P(정상메일|input 텍스트)=P(word1|정상메일)*P(word2|정상메일)*...p(wordn|정상메일)*P(정상메일)/P(input 텍스트),
P(스팸메일|input 텍스트)=P(word1|스팸메일)*P(word2|스팸메일)*...p(wordn|스팸메일)*P(스팸메일)/P(input 텍스트)
두 식에서 P(input 텍스트)는 공통이므로 비교할때 제거 가능하다.
이를 간단히 정리하자면, 정상메일로 분류되는 문장들(단어들의 집합) 스팸메일로 분류되는 문장들(단어들의 집합)이 있을때 P(word1|정상메일)은 정상메일에 속하는 총 단어들의 갯수에서 word1이 몇번 나오는지 확률을 계산하는것이다. 즉 단어의 출현 빈도를 세는것이다. 이런식으로 P(정상메일|input 텍스트),P(스팸메일|input 텍스트)를 계산하고 어느쪽에 속할지를 결정하는 방식인것이다.
여기까지가 나이브 베이즈 분류기에 대한 설명이고, 다항 분포 나이브 베이즈는 여기서 다항 데이터를 분포를 다뤄, feature이 많은 x를 다루는것이다. 챗봇과 같이 다소 짧지 않은 문장을 대화 문장을 입력하게 될 경우, 다항 분포 나이브 베이즈를 통하여 해당 대화 문장이 어떤 상황에 속하는 대화인지 분류하는것이 가능하다.
2. TF-IDF 를 활용한 챗봇에 적용 예제
일반적인 일상 대화 챗봇이 아닌 FAQ 챗봇의 경우 대화 시나리오를 상세화 시키고 분류될 상황 클래스에 속할 대화 문장들을 신중하게 결정할 필요가 있다. 여기서는 이러한 요소를 고려하지 않고, 주문과 계산 두 상황에 대해 입력된 문장이 어떻게 분류되는지 간단한 예제를 확인할것이다.
2.1 상황 클래스에 대한 train data 셋 설정
상황 클래스가 계산, 주문이 생성된것을 확인할수 있다.
2.2 전처리하여 상황 클래스에 속할 유의미한 단어 저장하기
train data에 있는 문장들의 모든 단어들을 클래스에 저장하지 않고, 불용어를 제거하고 형태소 중 명사,동사,형용사인것만 저장되도록 유의미한 단어를 지정한다. 이 단어들은 각 class 별로 저장되고, 모든 class의 유의미한 단어를 저장한 corpus_words에도 저장한다.
2.3 class에 대한 매칭 점수 계산하기
2.4 최종 매칭
2.5 TF-IDF 적용하기
TF-IDF란 텍스트마이닝에서 가중치를 부여할때 쓰이는 방법으로 TF(Term Frequency) 인 문서 내에서 특정 단어의 빈도수를 구하고 IDF(Inverse Document Frequency) 인 문서군 자체에서 빈도수를 역으로 곱하는 방식이다. 즉 문서 내에서 자주 출현하는 단어라도 전반적으로 다른 문서에서도 자주 나타나는 단어라면 가중치를 낮게 부여하는 방식이다.
Scikit-learn 에서도 MutinomialNB(다항분포 나이브 베이즈)를 TF-IDF로 보완하는 방법을 소개하고 있는데, 그 방법은 매칭 점수를 부여할때 클래스에 자주 출현하는 단어라도 다른 클래스에 전반적으로 자주 나타나는 단어라면 가중치를 적게 부여하는 방식인것이다. 즉, score을 계산할때 위에서는 단순 클래스 내의 빈도수를 곱하였지만, IDF 에 해당되는 1/전체단어에서 출현 횟수를 반영하는것이다. 이렇게 한다면 전반적으로 흔한 단어에 대해서는 가중치를 낮게하여 좀 더 정확한 결과를 가질수 있다.
좀 더 정확한 결과를 얻으려면 클래스에 대한 단어를 좀더 세분화하여 정하고, 어떤 단어의 경우 가중치를 높게 줄것인지 구체적으로 정하여야 한다. 그렇게 한다면 좀더 상황 클래스 매칭의 성능이 높아질 수 있을것이다.
시도한 다른 방법: https://sunnn21.tistory.com/3
두가지 방법을 병렬한 방법: (예정)
'졸업 프로젝트' 카테고리의 다른 글
colab에서 양방향 LSTM으로 대화 의도 파악하기 (0) | 2021.11.14 |
---|---|
colab에서 mecab 설치하기 (0) | 2021.05.28 |