반응형

문장의 유사도를 비교시 사용할 수 있는 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 




반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts