본문 바로가기

Python 기본 문법

코사인 유사도를 이용한 챗봇 만들기 기본 원리

반응형

 

안녕하세요. 코딩을 공부하는 닥터 배입니다. 오늘은 코사인 유사도를 이용한 챗본 만들기의 기본 원리에 대하여 알아보도록 하겠습니다.

 

기본 원리는 다음과 같습니다. 기존에 질문과 답변에 해당하는 리스트가 존재합니다. 질문과 답변 리스트는 같은 인덱스 별로 내용이 연결되어 있습니다. 사용자가 내용을 입력합니다. 그리고 질문 리스트와 사용자 입력 내용을 백터화 시키고 코사인 유사도를 구합니다. 이후 사용자 입력 내용과 가장 유사도가 높은 질문을 구합니다. 그러면 사용자가 입력한 내용과 가장 코사인 유사도가 높은 질문에 해당하는 답변을 챗봇이 출력합니다. 

 

먼저 기본 모듈을 import 합니다.

 

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

 

질문과 답변으로 이루어진 각각의 리스트를 만듭니다. questions와 answers는 인덱스 별로 서로 내용이 연결되어 있습니다. 예를 들어 questions[0]의 "안녕"에 대한 답변은 answers[0]의 "반가워" 입니다. 

 

questions = ["안녕", "슬퍼", "기뻐", "우울해", "화가나"]
answers = ["반가워", "힘내", "축하해", "기운내, 좋은일이 있을거야.", "진정해"]

 

questions을 백터화 시키고 question_vectors라는 변수에 담습니다.

 

vectorizer = TfidfVectorizer()
question_vectors = vectorizer.fit_transform(questions)​

 

사용자의 질문을 입력 받고 입력 받은 내용을 백터화 시킵니다. 이를 user_input_vector라는 변수에 담습니다.

 

user_input = input("나: ")
user_input_vector = vectorizer.transform([user_input])

 

백터화 시킨 questions(question_vectors)와 백터화 시킨 user_input(user_input_vector)의 코사인 유사도를 구합니다. 그리고 유사도가 가장 큰 index를 구하여 max_similarity_index라는 변수에 저장합니다. 그리고 사용자 입력 내용에 대한 답변으로 answers[max_similarity_index]를 출력합니다. 

 

cosine_similarities = cosine_similarity(user_input_vector, question_vectors)
max_similarity_index = cosine_similarities.argmax()
print('챗봇:', answers[max_similarity_index])

 

정리해 보면 기존 질문들을 백터화 시키고, 사용자가 입력한 문장을 백터화 시킵니다. 그리고 사용자가 넣은 문장과 기존 질문들 사이의 코사인 유사도를 구하고 코사인 유사도가 가장 큰 요소의 index를 max_similarity_index라는 변수에 저장합니다. 내가 넣은 문장에 대한 답변으로 answers[max_similarity_index]를 출력합니다. 

 

전체 코드는 다음과 같습니다.

 

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

questions = ["안녕", "슬퍼", "기뻐", "우울해", "화가나"]
answers = ["반가워", "힘내", "축하해", "기운내, 좋은일이 있을거야.", "진정해"]
user_input = input("나: ")

vectorizer = TfidfVectorizer()
question_vectors = vectorizer.fit_transform(questions)
user_input_vector = vectorizer.transform([user_input])

cosine_similarities = cosine_similarity(user_input_vector, question_vectors)
max_similarity_index = cosine_similarities.argmax()
print('챗봇:', answers[max_similarity_index])

 

questions와 answers의 data가 방대하다면 좋은 답변을 내 놓을 수 있을 것이라고 생각합니다. 이 기본 코드를 활용하여 더 좋은 프로그램을 만들 수 있을 것이라고 생각합니다. 

반응형