반응형

 

유사도 검색 - https://12bme.tistory.com/479?category=737765

 

Elasticsearch 버전 5.0부터는 _score 점수를 계산하는 기본 유사도 측정 알고리즘이 바뀌었다.

TF/IDF(classic)에서 BM25로 바뀐 이유는, BM25가 검색의 정확도가 더 정교하다는 판단을 내렸을 것이다.

[링크 : 왜 BM25가 더 정확한 지에 대한 내용]

하지만 각자 서비스하는 시스템이 다르기 때문에, 이 두 알고리즘이 어떤 차이가 있는지 알아야 더 적합한 알고리즘을 선택할 수 있을 것이라 생각한다.

 

BM25와 TF/IDF의 차이점은 바로 아래에 써두었다.


BM25와 TF/IDF의 차이점

  • 단어의 빈도수

    알고리즘 설명
    TF/IDF common words can still influence the score
    BM25 limits influence of term frequency

    TF/IDF 알고리즘의 경우 신조어처럼 최근에는 많이 언급되지만 전체 시간 대비 노출 빈도수가 적은 경우 가중치가 낮게 나온다.
    하지만 BM25는 단어의 빈도수로 인한 점수를 어느 정도 제한하여, 스테디셀러같은(?) 검색어와 신조어의 검색어의 격차를 좁힐 수 있다.

  • 데이터 길이에 따른 적중도

    알고리즘 설명
    TF/IDF shrot fields(title, ...) are automatically scored higher
    BM25 scales field length with average
    개인 추측 : "elastic"이라는 단어를 검색할 때 
    • 아 이건.. TF/IDF랑 BM25 공부하고 써보자
문서1
{
	"title" : "elastic? elastic! elastic.",
    "contents" : "제곧내"
}

문서2
{
	"title" : "elastic 꿀팁 공유",
    "contents" : "elastic"
}

 

엘라스틱서치에서 기본적으로 제공하는 유사도 알고리즘이지만, 사용자의 언어나 도메인에 맞게 어느 정도 수정이 가능할 것이라고 판단된다. (확인되면 다시 언급하겠다)
때문에 좀 더 정확한 검색 결과를 제공하기 위해서 사용하는 유사도 알고리즘을 이해할 필요가 있다.
언젠가 내가 엘라스틱서치를 운영해야 된다면 유사도 알고리즘을 좀 더 세밀하게 조정하게 될 수도 있으니까.
또 어떤 경우는 TF/IDF를 쓰는 게 더 적합한 경우가 있을 것이라고 생각된다.

TF/IDF와 BM25의 알고리즘은 아래에 설명해두었다.


Elasticsearch 역색인 구조

토큰 문서번호

텀의 위치

(Position)

텀의 빈도

(Term Frequency)

       
       
       
       
       

ㅇㅇ


TF/IDF

1번 : https://www.popit.kr/bm25-elasticsearch-5-0%EC%97%90%EC%84%9C-%EA%B2%80%EC%83%89%ED%95%98%EB%8A%94-%EC%83%88%EB%A1%9C%EC%9A%B4-%EB%B0%A9%EB%B2%95/

2번 https://opensourceconnections.com/blog/2015/10/16/bm25-the-next-generation-of-lucene-relevation/

3번 https://blog.naver.com/shino1025/221868521724

4번 https://www.elastic.co/guide/en/elasticsearch/guide/2.x/practical-scoring-function.html

 


BM25

 

참고글 : https://www.popit.kr/bm25-elasticsearch-5-0%EC%97%90%EC%84%9C-%EA%B2%80%EC%83%89%ED%95%98%EB%8A%94-%EC%83%88%EB%A1%9C%EC%9A%B4-%EB%B0%A9%EB%B2%95/

반응형