brunch

You can make anything
by writing

C.S.Lewis

by 최재철 Oct 15. 2024

각 모델별 문장 유사도 평가

Sentence Transformer 기본/ 심화 활용법

출처 : https://huggingface.co/sentence-transformers

안녕하세요, 인포싱크랩의 최재철입니다.


문장 간 유사도를 계산하는 작업은 텍스트 데이터를 다루는 여러 프로젝트에서 핵심적인 역할을 합니다. 이와 관련해, Python의 Sentence Transformer 라이브러리는 매우 유용한 도구로, 다양한 언어에서 문장의 의미를 비교할 수 있는 기능을 제공합니다.

이번 글에서는 Sentence Transformer 라이브러리를 활용해 문장 유사도를 계산하는 기본적인 방법을 살펴보고, 특히 한국어 문장에 대해 각 모델이 어떻게 성능을 발휘하는지 간단히 설명드리려고 합니다.


SentenceTransformer 란?

Sentence Transformer는 Hugging Face 에서 제공하는 라이브러리로 사전 학습된 문맥 임베딩 모델(Contextualized Embeddings)을 사용하여 문장을 벡터로 변환합니다.이를 통해 문장의 의미와 문맥을 고려한 벡터 표현을 얻을 수 있습니다.


설치

먼저 Sentence Transformer 라이브러리를 설치합니다.

pip install sentence-transformers

pip install sentence-transformers

기본 실습

다음은 Sentence Transformer 라이브러리를 사용하여 문장 유사도를 계산하는 간단한 예입니다.

결과는

문장 1과 문장 2의 유사도: 0.7942466735839844

이 코드는 문장 임베딩을 활용해 두 문장의 의미적 유사성을 측정하는 과정을 보여줍니다. 구체적으로, paraphrase-multilingual-mpnet-base-v2 모델을 이용해 문장을 벡터로 변환하고, 이 벡터들 간의 코사인 유사도를 계산하여 문장의 의미적 유사도를 구하는 방법입니다. 

encode 메서드는 입력된 문장(텍스트)을 임베딩 벡터로 변환합니다. 각 문장은 고차원의 벡터 공간에서의 점으로 표현되며, 이 벡터들은 문장의 의미적 특성을 반영합니다.

convert_to_tensor=True 옵션은 벡터를 PyTorch 텐서 형식으로 변환하여 이후의 계산에 활용될 수 있도록 합니다.

util.pytorch_cos_sim 함수는 두 벡터 간의 코사인 유사도를 계산합니다. 코사인 유사도는 두 벡터가 얼마나 유사한 방향을 가리키는지를 나타내며, 값이 1에 가까울수록 두 문장의 의미가 비슷하다는 뜻입니다.

결과로 얻어진 similarity_score는 두 문장 간의 의미적 유사도를 나타내는 값입니다.


정리하면, 이 코드는 문장 간의 의미적 유사성을 판단할 때 유용합니다. 예를 들어, 자연어 처리 분야에서 챗봇, 검색 시스템, 추천 시스템 등에서 사용될 수 있습니다. 코사인 유사도를 활용해 의미적으로 유사한 문장을 찾거나, 두 문장이 서로 유사한지를 분석할 수 있습니다.


한국어 모델 비교 실험

실험하는 모델은 다음과 같은 것을 비교하고 싶었습니다. 모두다 한국어를 지원하는 다국어모델들입니다.

distiluse-base-multilingual-cased-v2

intfloat/multilingual-e5-large

paraphrase-multilingual-mpnet-base-v2

paraphrase-xlm-r-multilingual-v1

stsb-xlm-r-multilingual


다음은 주어진 다섯 가지 Sentence-BERT 모델에 대한 간단한 설명입니다.

1. distiluse-base-multilingual-cased-v2  

특징: 다양한 언어를 지원하는 다국어 모델로, 15개 이상의 언어에서 사용 가능하며, 다국어 문장 임베딩을 제공. 이 모델은 문장 간 유사성 검색, 분류 작업, 다국어 파라프레이징 등에서 좋은 성능을 발휘합니다.

장점: 속도가 빠르며, 비교적 적은 자원으로도 다국어 문장 임베딩을 생성할 수 있음.


2. intfloat/multilingual-e5-large  

특징: E5 시리즈의 대형 모델로, 다국어 텍스트에서 뛰어난 성능을 발휘하며, 텍스트 검색과 문장 임베딩에 최적화된 모델. 다양한 언어에서 텍스트와 쿼리 간의 의미적 유사성을 정확하게 평가할 수 있음.

장점: 특히 검색 및 쿼리 관련 작업에서 강력한 성능을 보이며, 큰 모델이므로 높은 정밀도를 제공.


3. paraphrase-multilingual-mpnet-base-v2  

특징: MPNet 구조를 기반으로 한 다국어 파라프레이징 모델로, 약 50개 언어에서 사용 가능. 파라프레이징(문장을 다른 표현으로 바꾸면서 의미는 동일하게 유지)을 위한 문장 임베딩 생성에 특화됨.

장점: 다양한 언어에서 높은 정확도의 파라프레이징 결과를 제공하며, 문장 간의 유사성 평가에 적합.


4. paraphrase-xlm-r-multilingual-v1  

특징: XLM-R(Cross-lingual Language Model) 기반 다국어 파라프레이징 모델로, 다국어 문장 임베딩을 제공. 전 세계적으로 자주 사용되는 50개 이상의 언어에서 강력한 성능을 발휘합니다.

장점: 여러 언어 간의 파라프레이징 및 의미적 유사성 평가에서 강력한 성능을 발휘하며, 언어 간 텍스트 변환 작업에 탁월.


5. stsb-xlm-r-multilingual  

특징: STS-Benchmarks(Semantic Textual Similarity Benchmark)에서 훈련된 모델로, 다국어 문장 간의 유사성 평가에 특화되어 있음. 다양한 언어로 표현된 문장들의 유사도를 정밀하게 측정할 수 있음.

장점: 50개 이상의 언어에서 문장 임베딩을 생성하며, 언어 간 의미적 유사성 평가에 강력한 성능을 보임.


이 모델들은 모두 다국어 텍스트에서 문장 임베딩을 생성하며, 특정한 목적(예:  검색, 유사성 평가)에 따라 선택하여 사용할 수 있습니다.


먼저 비교하는 문장은 다음과 같습니다. 

2번째 문장 "나는 어제 친구와~~" 와 4번째 문장 "이번 주말에는~~~" 빼고는 나머지 문장은 매우 흡사하도록 문장을 만들었습니다.  총 10문장에서 2문장만 서로 상이하고 나머지는 최대한 비슷하게 만들었습니다. 


소스 코드는 다음과 같습니다. (지면관계상 소스를 나누어서 캡처한 점 양해바랍니다. )

결과는

실행 결과

참고로, 문장의 유사도가 높을 수록 짙은 푸른색을 띄게됩니다. 

"나는 어제 친구와 영화를 봤다" 와 "나는 어제 영화관에서 여자친구랑 대판 싸웠다" 는 인간이 보기에 완전히 다른 문장이므로, 그것을 잘 파악하는 모델이 무엇인지 확인하고 싶었습니다. 

intfloat/multilingual-e5-large  의 경우에는 모두 유사하다고 오판하고 있지만, 

나머지 모델들은 대체적으로 유사성이 낮다고 판단하고 있습니다. 

"이번 주말에는 가족과 함께 시간을 보낼 예정이다." 와 "주말에는 혼자 집에서 조용히 쉴 계획이다" 문장에서도 동일한 결과를 보였습니다. 


10문장 중 2문장만 다르다고 판단한 

특히 paraphrase 혹은 xlm-r로 명명된 모델들이 주로 좋은 결과를 보이고 있습니다. 


마치며

이 글에서는 Sentence Transformer 라이브러리를 사용해 문장 유사도를 계산하는 기본적인 방법을 소개하고, 한국어를 지원하는 다국어 모델들을 비교해 보았습니다. 실험 결과, paraphrase나 xlm-r 같은 모델들이 비교적 높은 정확도를 보였지만, 실제 프로젝트에서는 데이터에 따라 더 작은 모델로도 충분한 성능을 얻을 수 있습니다. 따라서 모델 선택 시 정확도뿐만 아니라 모델 크기도 함께 고려하는 것이 중요합니다.

이 예시를 바탕으로, 여러분의 프로젝트에 적절한 모델을 선택해 응용해 보세요. 이를 통해 텍스트 데이터를 더욱 효과적으로 처리하고 프로젝트의 전반적인 품질을 향상시킬 수 있을 것입니다.



브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari