개발/DB
ElasticSearch - DFR에 대해 알아보자
말고기
2021. 8. 29. 21:37
728x90
반응형
개요
- scoring model 관련하여 BM25에 대해서 알아보았다.
- 이번에는 DFR에 대해서 알아보도록 하자.
- DFR의 경우 lucene 내부에서 implementation이 되어 있다.
DFR ( Divergence from Randomness ) framework
- 똑똑하신 분들이 DFR에 대한 내용을 내놓았다.
- 사실 가정이나 내용이 잘 이해가지 않는다.
- 한 번 정리해보면서 그 내용을 이해해보도록 해보자.
정의
# 아래의 함수들은 우선 간단하게 표기했다.
boost = 1
def normalize(tf, c, avgfl, fl):
return 1
def baseModel(stat, tfn):
return 1
def afterEffect(stats, tfn):
return 1
w = boost * baseModel({}, 1) * afterEffect({}, 1)
구성
해당 DFR의 경우 크게 3가지 구성 요소를 가진다.
- Base model
- After Effect
- Normalization
1. BaseModel
- 기본적으로 DFR은 해당 문서를 확률에 기초하여 scoring하고 있다.
- 이 때 쓰이는 확률 모델을 의미한다.
- ES에서 포함된 모델들은 다음과 같다. (ES documentation 참조)[https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-similarity.html]
- g, if, in, ine
이 떄 G를 사용하면 아래와 같이 scoring function에 대한 내용이 나오는 것을 볼 수 있다.
from math import log
# BasicModelG, computed as log2(lambda + 1) + tfn * log2((1 + lambda) / lambda) from
# lambda, computed as F / (N + F) from
# F: total number of occurrences of term across all docs + 1
# N: total number of documents with field
def lambda_fn(F, N):
return F / (N + F)
def baseModelG(stats, tfn):
return log(lambda_fn(stats.F, stats.N) + 1, 2) + tfn * log( (1 + lambda_fn(stats.F, stats.N)) / lambda_fn(stats.F, stats.N))
2. After Effect
- 이 after effect는 scoring 값을 tfn 값을 통해서 normalize를 하는 역할이다.
- 아래는 after effect를 L ( Laplace's law of succession)의 식이다.
- 아래의 함수를 보면 알 수 있듯이, 만약 해당 term이 나온 빈도수가 높아지게 되면 오히려 score는 떨어지게 되어있다.
- 해석하면 많이 발생하는 term의 경우에는 낮은 가중치를 부여한다고 볼 수 있다.
def after_effect_l(tfn):
return 1 / (tfn + 1)
3. Normalization
- 기본적으로 해당 DFR에서는 TF값을 그대로 사용하지 않고, normalize로 변형된 형태로 사용한다.
- ES 지원하는 함수는 no, h1, h2, h3, z 가 존재한다.
- ES에서 나오는 식은 아래와 같다.
- 해당 값을 tfn으로 사용하게 된다.
- 아래는 H2 normalzation의 식이다.
from math import log
# tf: 해당 document에서 나타난 term의 갯수
# c: hyperparameter
# avgfl: 모든 document의 해당 field 평균 길이
# fl: 해당 document의 length
# NormalizationH2, computed as tf * log2(1 + c * avgfl / fl) from
def normalize_h2(tf, c, avgfl, fl):
return tf * log(1 + c * avgfl / fl)
수식을 자세히 살펴보면 결국 tf에 특정 weight를 부여하여 normalize를 하는 것을 알 수 있다.
간단하게 말하자면 해당 term이 길이가 1000인 글에서 1번 나타나는 것과 100인 글에서 1번 나타나는 것은 그 중요도가 다르다고 볼 수 있다. 따라서 이에 따라 가중치를 부여하기 위한 것임을 알 수 있다. 아래는 fl (document length)값을 다르게 주었을 때, tfn 값이 달라지는 것을 보여준다.
출처
728x90
반응형