문장의 유사도를 비교시 사용할 수 있는 Sentence Transformers 사용 방법을 다룹니다.
다음 문서를 기반으로 작성했습니다.
Quickstart
https://www.sbert.net/docs/quickstart.html#comparing-sentence-similarities
2024. 3. 2 최초작성
다음처럼 sentence-transformers 패키지를 설치해야 합니다.
pip install sentence-transformers
테스트 해볼떄 기본 파이썬 환경과 독립적으로 패키지를 설치할 수 있는 Miniconda 사용을 추천합니다.
Visual Studio Code와 Miniconda를 사용한 Python 개발 환경 만들기( Windows, Ubuntu)
https://webnautes.tistory.com/1842
CUDA 가속을 사용하려면 PyTorch를 설치해야합니다. PyTorch 설치 방법은 다음 포스트를 참고하세요.
Ubuntu / Windows / WSL2에서 CUDA를 사용하는 Tensorflow / Pytorch 설치
https://webnautes.tistory.com/2254
사용할 수 있는 Sentence Transformer 모델은 허깅 페이스 허브( https://huggingface.co/models )에서 찾을 수 있습니다. 한국어를 사용할 수 있는 Sentence Transformer 모델을 찾아보겠습니다.
Tasks 탭에서 Natural Language Processing 항목에 있는 Sentence Similarity를 선택합니다.
Languages 탭에서 Korean을 선택합니다.
글 작성시점에 54개의 모델이 검색됩니다. 오른쪽 위에 보이는 Sort를 조정하여 정렬 방법을 바꿀 수 있고 각 모델별로 다운로드 개수와 좋아요 개수가 표시됩니다.
이중에 snunlp/KR-SBERT-V40K-klueNLI-augSTS 모델을 사용해보겠습니다.
from sentence_transformers import SentenceTransformer # 모델을 로드합니다. model = SentenceTransformer("snunlp/KR-SBERT-V40K-klueNLI-augSTS") # 인코딩해볼 문장입니다. sentences = [ "안녕하세요", "오늘을 즐겁게 사세요", "멈춤보단 천천히라도", ] # model.encode를 사용하여 문장을 인코딩을 해봅니다. sentence_embeddings = model.encode(sentences) # 인코딩 결과 얻은 임베딩(embeddings)을 출력해봅니다. for sentence, embedding in zip(sentences, sentence_embeddings): print("Sentence:", sentence) print("Embedding:", embedding) print("") |
처음 실행시에는 모델이 다운로드된 후, 코드가 실행됩니다.
문장과 실수 배열인 임베딩이 출력됩니다. 임베딩 길이는 사용하는 모델에 따라 달라집니다.
Sentence: 안녕하세요
Embedding: [-0.8737877 0.51739484 0.609266 -0.44665205 -0.2724999 0.4278632
-0.8329894 0.5745985 1.1008736 -0.15871537 0.99624306 0.34876847
0.56605333 -0.25209 0.08570296 -0.5976638 0.6762777 -0.22923815
0.15332514 -0.5932304 -0.48137864 0.23162384 0.12672712 0.02881984
….….….….….….….….….….….….….….….….….….….….….….….….….….….….
-1.0404934 0.495519 1.3848743 0.50197065 0.2159965 -0.15523516
-0.14469309 -0.05091649 -0.8628233 -0.5377979 -0.21017177 0.8720729 ]
Sentence: 오늘을 즐겁게 사세요
Embedding: [-0.26642904 0.8224812 0.4734286 0.24794106 -0.03654553 0.1492772
-0.43533817 -0.6399177 -0.12757014 0.3611263 0.6050594 -0.7618291
-0.89946485 -0.45443606 0.0737004 0.05821227 0.64218503 -1.6093768
-1.0574077 0.54869455 -0.20314325 -0.2809659 0.25756073 1.100432
….….….….….….….….….….….….….….….….….….….….….….….….….….….….
-0.7763114 0.26331347 0.68160486 -0.83627987 -0.30985576 0.90296316
-0.7274006 0.9144573 0.23684828 -0.3469492 -1.0827118 0.7831165 ]
Sentence: 멈춤보단 천천히라도
Embedding: [ 1.21598877e-01 2.39369020e-01 -6.55887961e-01 1.39561534e-01
-2.33324505e-02 5.19744456e-01 -2.68895775e-01 -2.91514099e-01
-5.97296357e-01 -1.11123490e+00 2.48153210e-01 2.51260787e-01
1.11823785e+00 1.44671574e-01 -1.32478392e+00 8.38296115e-01
….….….….….….….….….….….….….….….….….….….….….….….….….….….….
1.07271707e+00 1.10517001e+00 -4.63861495e-01 -1.32686555e-01
2.82214314e-01 -2.76035726e-01 -1.11892772e+00 -9.46682274e-01]
두 문장의 유사도 비교
Sentence Transformer 모델을 사용하여 문장을 인코딩하면 벡터 공간에서 비슷한 의미를 가진 문장이 가까워지도록 매핑됩니다. 벡터 공간에서 유사성을 측정하는 방법 중 하나는 코사인 유사도를 사용하는 것입니다. 다음처럼 두 문장의 유사도를 코사인 유사도로 측정해볼 수 있습니다.
from sentence_transformers import SentenceTransformer, util model = SentenceTransformer("snunlp/KR-SBERT-V40K-klueNLI-augSTS") # 문장을 인코딩합니다. emb1 = model.encode("너는 사과를 좋아하니?") emb2 = model.encode("나는 사과를 좋아합니다.") emb3 = model.encode("나는 딸기를 좋아합니다.") # 코사인 유사도를 계산하여 출력합니다. cos_sim = util.cos_sim(emb1, emb2) print("Cosine-Similarity:", cos_sim) cos_sim = util.cos_sim(emb1, emb3) print("Cosine-Similarity:", cos_sim) |
실행결과를 보면 "너는 사과를 좋아하니?" 문장과 "나는 사과를 좋아합니다." 문장이 유사한 정도는 0.8137이고 "너는 사과를 좋아하니?" 문장과 "나는 딸기를 좋아합니다." 문장이 유사한 정도는 0.4914입니다.
Cosine-Similarity: tensor([[0.8137]])
Cosine-Similarity: tensor([[0.4914]])
FAISS를 사용하여 다수의 문장에 대해 주어진 문장의 유사도를 비교하는 방법은 아래 포스트를 참고하세요.
faiss 사용법 및 예제 코드
https://webnautes.tistory.com/1887
'Deep Learning & Machine Learning > HuggingFace & Transformer' 카테고리의 다른 글
LLM 모델을 다루는 Transformers 라이브러리 간단히 살펴보기 (0) | 2024.03.01 |
---|---|
the current text generation call will exceed the model's predefined maximum length 해결방법 (0) | 2024.02.29 |
colab에서 transformers 라이브러리로 LLM 학습시 checkpoint 사용하기 (0) | 2024.02.27 |
Transformer 개념 정리 - Attention is all you need (0) | 2023.11.11 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!