- 두 벡터 간의 코사인 각도를 이용하여 구할 수 있는 두 벡터의 유사도를 의미한다.
- 두 벡터의 방향이 완전히 동일한 경우 : 1
- 90°의 각 : 0
- 180°로 반대의 방향 : -1
- 코사인 유사도는 -1 이상 1 이하의 값을 가지며 값이 1에 가까울수록 유사도가 높다고 판단할 수 있다.
import pandas as pd
from sentence_transformers import SentenceTransformer #사전학습 모델을 가져오는 것
from sklearn.metrics.pairwise import cosine_similarity
model = SentenceTransformer('jhgan/ko-sroberta-multitask') # embedding을 하기위해 encoder를 가져온 것.
sentences=["안녕하세요?", "테스트를 위한 문장입니다."]
embeddings=model.encode(sentences)
print(embeddings)
[[-0.37510455 -0.7733845 0.5927711 ... 0.57923514 0.32683447
-0.6508966 ]
[-0.17084298 -0.6179124 -0.53709316 ... 0.3774292 0.75107646
-0.19669947]]
df=pd.read_csv('wellness_dataset_original.csv')
df.head()
df=df[~df['챗봇'].isna()]
df=df.drop(columns=['Unnamed: 3'])
df.head()
df['embedding']=pd.Series([[]]*len(df)) # 길이를 맞춰주기 위해서 곱함
df['embedding']=df['유저'].map(lambda x : list(model.encode(x)))
df.head()
test_text='요즘 외롭지 않고 기분이 좋네요'
ebd=model.encode(test_text)
df['distance']=df['embedding'].map(lambda x : cosine_similarity([ebd], [x]).squeeze())#차원을 없애주기 위해서 squeeze를 씀.
df.head()
answer1 = df.loc[df['distance'].idxmax()]
answer2 = df.loc[df['distance'].idxmin()]
print('환자 상태 :', answer1['구분'])
print('유사한 질문 :', answer1['유저'])
print('챗봇 답변 :', answer1['챗봇'])
print('유사도 :', answer1['distance'])
print('\n\n')
print('환자 상태 :', answer2['구분'])
print('유사한 질문 :', answer2['유저'])
print('챗봇 답변 :', answer2['챗봇'])
print('유사도 :', answer2['distance'])
💬 챗봇 답변
환자 상태 : 감정/즐거움
유사한 질문 : 확실히 외로움도 덜 느껴지고 좋더라고요.
챗봇 답변 : 당신이 행복하다면 저도 기뻐요.
유사도 : 0.7856825590133667
환자 상태 : 배경/사업/실패
유사한 질문 : 사업을 하다가 실패해서 집안이 완전히 주저앉았어요.
챗봇 답변 : 그런 일이 있으셨군요. 마음이 쓰라리시겠어요.
유사도 : -0.03497869521379471
def 대화(text):
ebd=model.encode(text)
df['distance']=df['embedding'].map(lambda x : cosine_similarity([ebd], [x]).squeeze())
answer1 = df.loc[df['distance'].idxmax()]
answer2 = df.loc[df['distance'].idxmin()]
print('입력한 텍스트 :',text)
print('환자 상태 :', answer1['구분'])
print('유사한 질문 :', answer1['유저'])
print('챗봇 답변 :', answer1['챗봇'])
print('유사도 :', answer1['distance'])
print('\n\n')
print('환자 상태 :', answer2['구분'])
print('유사한 질문 :', answer2['유저'])
print('챗봇 답변 :', answer2['챗봇'])
print('유사도 :', answer2['distance'])
대화('이 세상에 혼자 있는 기분이에요')
입력한 텍스트 : 이 세상에 혼자 있는 기분이에요
환자 상태 : 감정/고독감
유사한 질문 : 세상에 저 혼자 있는 거 같아요.
챗봇 답변 : 제가 당신의 편이 될게요.
유사도 : 0.90902179479599
환자 상태 : 증상/식욕저하/불면
유사한 질문 : 5일 동안 밥도 제대로 못 먹고, 잠도 거의 못 잤어.
챗봇 답변 : 식사와 수면 둘 다 중요한데 정말 걱정되네요. 지금은 괜찮으신가요?
유사도 : -0.028927002102136612