본문 바로가기
AI이야기

파이썬으로 배우는 BM25 구현: 검색 엔진 핵심 알고리즘 마스터하기

by logbe1 2024. 11. 14.

검색 엔진의 핵심, BM25 알고리즘을 파이썬으로 구현하고 직접 활용해보면서 그 원리를 깊이 있게 파헤쳐 봐요!

 

BM25는 정보 검색 분야에서 널리 쓰이는 문서 랭킹 알고리즘 중 하나인데요, 쉽게 말해 사용자가 입력한 질문과 관련된 문서를 순위대로 보여주는 데 핵심적인 역할을 하는 친구라고 생각하면 돼요. 특히 엘라스틱서치 같은 검색 엔진에서 기본 유사도 알고리즘으로 활용될 만큼 뛰어난 성능을 자랑하죠.  이번 포스팅에서는 BM25 알고리즘의 개념과 파이썬으로 구현하는 방법을 알려드릴게요.

 


BM25: 쿼리와 문서의 관련성을 평가하는 알고리즘

BM25는 쿼리와 문서 간의 관련성을 측정하여 문서를 순위 매기는 알고리즘이에요.  TF-IDF를 기반으로 만들어졌는데, TF-IDF가 단어의 빈도와 역문서 빈도를 사용해서 단어의 중요도를 계산하는 거였다면, BM25는 여기에 문서 길이와 같은 추가적인 요소들을 고려하여 더욱 정교하게 관련성을 평가하도록 개선된 알고리즘이라고 할 수 있어요.

 


BM25의 핵심 요소들: TF, IDF, 문서 길이 정규화

BM25는 크게 세 가지 핵심 요소를 사용해요.

 

  • Term Frequency (TF): 특정 문서에서 쿼리에 포함된 단어가 몇 번 등장하는지를 나타내는 지표에요. 예를 들어, "강아지"라는 쿼리에 대해 특정 문서에 "강아지"라는 단어가 5번 나왔다면 TF는 5가 되겠죠.
  • Inverse Document Frequency (IDF): 특정 단어가 전체 문서 집합에서 얼마나 드물게 나타나는지를 나타내는 지표에요. 흔한 단어는 IDF 값이 낮고, 드문 단어는 IDF 값이 높아요. 예를 들어, "강아지"라는 단어가 많은 문서에 자주 등장한다면 IDF 값은 낮아지고, "알파고"라는 단어가 몇 안 되는 문서에만 등장한다면 IDF 값은 높아지는 거죠.
  • 문서 길이 정규화: 문서의 길이에 따라 점수를 조정하는 역할을 해요. 긴 문서는 단어가 많이 나올 수 있기 때문에, 자동으로 높은 점수를 받는 것을 방지하는 거예요. 짧은 문서에 특정 단어가 몇 번 등장하는 것보다 긴 문서에 같은 단어가 몇 번 등장하는 게 덜 중요할 수 있잖아요?

BM25 점수 계산: 수식으로 관련성을 측정

BM25의 점수는 다음과 같은 수식으로 계산돼요.

 

BM25(D, Q) 문서 D와 쿼리 Q의 관련성 점수    
IDF(q_i) 쿼리 Q의 i번째 단어 q_i의 역문서 빈도    
f(q_i, D) 문서 D에서 쿼리 Q의 i번째 단어 q_i의 빈도    
  D   문서 D의 길이
avgdl 전체 문서 집합의 평균 길이    
k1, b 조정 가능한 파라미터    

기호 설명

 

BM25 점수는 쿼리에 포함된 각 단어의 IDF와 TF를 고려하고, 문서 길이를 정규화하여 계산됩니다.  수식이 복잡해 보이지만, 핵심은 쿼리에 포함된 단어가 문서에 얼마나 자주, 그리고 얼마나 중요하게 등장하는지, 그리고 문서의 길이가 적절한지를 종합적으로 평가하여 점수를 매기는 거예요.

 


Python으로 BM25 구현하기: rank_bm25 라이브러리 활용하기

BM25를 파이썬으로 구현하는 건 생각보다 간단해요. 라는 라이브러리를 활용하면 쉽게 BM25 알고리즘을 적용할 수 있답니다.

 


rank_bm25 설치하기

먼저  라이브러리를 설치해 줘야겠죠? 아래 명령어를 통해 설치할 수 있어요.

 

pip install rank_bm25

간단한 사용 예제

다음은  라이브러리를 사용하여 BM25 알고리즘을 적용하는 간단한 예제에요.

 

from rank_bm25 import BM25Okapi

# 문서 집합 준비
documents = [
    "이것은 첫 번째 문서입니다.",
    "두 번째 문서는 여기 있습니다.",
    "세 번째 문서는 매우 흥미롭습니다."
]

# 토큰화 (단어로 분리)
tokenized_docs = [doc.split(" ") for doc in documents]

# BM25 모델 초기화
bm25 = BM25Okapi(tokenized_docs)

# 쿼리 준비
query = "첫 번째 문서"
tokenized_query = query.split(" ")

# 점수 계산
scores = bm25.get_scores(tokenized_query)

print(scores)  # 각 문서에 대한 점수 출력

 코드에서는 먼저 몇 개의 문서를 준비하고, 각 문서를 단어 단위로 토큰화해요. 그런 다음  클래스를 사용하여 BM25 모델을 초기화하고, 쿼리를 입력하여 각 문서의 관련성 점수를 계산해요. 마지막으로 계산된 점수를 출력하면, 쿼리와 가장 관련성이 높은 문서가 높은 점수를 받는 것을 확인할 수 있죠!

 


한국어 텍스트에 적용하기

BM25는 영어뿐만 아니라 한국어 텍스트에도 효과적으로 적용할 수 있어요. 다만, 한국어는 영어와 달리 형태소 분석이 필요한 경우가 많기 때문에, 띄어쓰기만 기준으로 토큰화하는 것보다는 형태소 분석기를 활용하여 토큰화하는 것이 더 좋은 결과를 얻을 수 있답니다.

 


BM25 활용: 검색 엔진 최적화 및 정보 검색 시스템

BM25는 다양한 분야에서 활용될 수 있어요.

 

  • 검색 엔진 최적화: BM25를 사용하면 사용자가 입력한 쿼리에 가장 관련성이 높은 문서를 빠르고 정확하게 찾아서 보여줄 수 있기 때문에, 검색 엔진의 성능을 향상시키는 데 유용하게 사용될 수 있어요.
  • 정보 검색 시스템:  BM25는 정보 검색 시스템에서 문서를 랭킹하고 필터링하는 데 사용될 수 있어요. 특정 주제에 대한 문서를 찾거나, 특정 조건을 만족하는 문서만 추출하는 데 활용할 수 있죠.

BM25의 장점과 한계

BM25는 뛰어난 성능을 자랑하지만, 몇 가지 한계도 가지고 있어요.

 


장점

 

  • 높은 정확도: BM25는 TF-IDF보다 문서의 길이와 같은 요소를 추가적으로 고려하여 더욱 정확한 문서 랭킹을 제공해요.
  • 다양한 파라미터 조정: k1과 b와 같은 파라미터를 조정하여 특정 상황에 맞게 알고리즘을 최적화할 수 있어요.
  • 구현의 용이성: 와 같은 라이브러리를 사용하면 쉽게 구현하고 활용할 수 있어요.

한계

 

  • 연산 비용: BM25는 문서의 길이와 같은 여러 요소를 고려하기 때문에, 연산 비용이 다소 높을 수 있어요. 특히 문서 집합이 매우 크다면 성능 저하가 발생할 수도 있죠.
  • 새로운 단어에 대한 적응력: 새로운 단어나 용어가 등장했을 때, BM25는 이러한 단어에 대한 정보를 빠르게 학습하지 못할 수 있어요.
  • 의미론적 이해 부족: BM25는 단어의 빈도와 문서 길이 등을 기반으로 관련성을 평가하기 때문에, 단어의 의미나 맥락을 완벽하게 이해하지 못해요.

BM25 심화: BM25F와 파라미터 튜닝

BM25는 기본적인 알고리즘이지만, 다양한 변형된 버전이 존재해요.  그 중 하나가 BM25F인데요,  BM25F는 문서를 여러 필드(field)로 나누어 각 필드에 대한 가중치를 부여하여 더욱 정교한 랭킹을 수행하는 알고리즘이에요.  예를 들어, 뉴스 기사를 생각해 볼까요? 뉴스 기사는 제목, 본문, 작성자 등 다양한 필드로 구성될 수 있는데, BM25F는 각 필드의 중요도를 다르게 설정하여 검색 결과를 더욱 세밀하게 조정할 수 있도록 해줘요.

 


파라미터 튜닝: 최적의 성능을 위한 미세 조정

BM25의 성능은 k1과 b와 같은 파라미터에 영향을 받아요.  따라서, 특정 데이터셋이나 검색 시스템에 맞게 파라미터를 조정하는 것이 중요해요.  파라미터 튜닝은 실험과 평가를 통해 수행할 수 있으며, 튜닝을 통해 BM25 알고리즘의 성능을 더욱 향상시킬 수 있답니다.

 


마무리: BM25, 정보 검색의 핵심 알고리즘

이번 포스팅에서는 BM25 알고리즘의 개념과 파이썬으로 구현하는 방법, 그리고 BM25의 장점과 한계에 대해 알아봤어요. BM25는 정보 검색 시스템과 검색 엔진 최적화에 필수적인 알고리즘이기 때문에, 꼭 이해하고 넘어가야 할 부분이죠. 특히,   라이브러리를 사용하면 손쉽게 BM25를 구현하고 활용할 수 있으니, 직접 코드를 작성해보면서 BM25 알고리즘을 더욱 깊이 있게 이해해 보시길 바라요!

 

QnA

Q1. BM25는 어떤 경우에 사용하는 게 좋나요?

A1. BM25는 사용자가 입력한 쿼리에 대해 관련성이 높은 문서를 찾아야 하는 다양한 상황에서 유용하게 사용될 수 있어요. 특히, 대규모 문서 집합에서 빠르고 정확하게 검색 결과를 제공해야 하는 검색 엔진이나 정보 검색 시스템에 적합하죠.

 

Q2. BM25와 TF-IDF의 차이점은 뭐예요?

A2. BM25는 TF-IDF를 기반으로 만들어졌지만, 문서 길이와 같은 추가적인 요소를 고려하여 더욱 정교하게 관련성을 평가하는 알고리즘이에요. TF-IDF는 단순히 단어의 빈도와 역문서 빈도만 고려하는 반면, BM25는 문서의 길이와 같은 요소를 추가적으로 고려하여 더욱 정확한 결과를 제공할 수 있답니다.

 

Q3. BM25의 파라미터를 어떻게 조정해야 하나요?

A3. BM25의 파라미터는 k1과 b와 같은 값들이 있는데요, 이 값들을 조정하면 특정 데이터셋이나 검색 시스템에 맞게 알고리즘을 최적화할 수 있어요.  파라미터 튜닝은 실험과 평가를 통해 수행해야 하며, 튜닝을 통해 BM25 알고리즘의 성능을 더욱 향상시킬 수 있답니다.

 

키워드

BM25,정보검색,랭킹알고리즘,검색엔진,파이썬,Python,rank_bm25,TFIDF,문서랭킹,유사도,Elasticsearch,자연어처리,NLP,IR,InformationRetrieval,데이터마이닝,DataMining,머신러닝,MachineLearning,알고리즘,Algorithm,코딩,Coding,개발,Development,검색최적화,SEO,파라미터튜닝,BM25F,필드가중치,텍스트분석,TextAnalysis,데이터과학,DataScience,데이터분석,DataAnalysis,프로그래밍,Programming,딥러닝,DeepLearning