'루씬'에 해당되는 글 1건

  1. 2015.03.26 Lucene(elasticsearch) score 계산
프로그래밍/ElasticSearch 2015. 3. 26. 14:52

참고 자료 :http://lucene.apache.org/core/2_9_4/api/core/org/apache/lucene/search/Similarity.html


  • 요소항목 설명
 -Term Frequency(tf) : 쿼리하는 키워드가 몇번 나왔는지에 대한 수치이다. 나온 수치의 루트값을 이용한다. 
        tf(t in d) = √frequency
    -Inverse Document Frequency(idf) : 역빈도 내용인다. 전체 document에서 해당 term이 얼마나 나왔는지를 측정. 다수의 문서에서 나온다면 이 term은 중요하지 않은 것을 간주하고 낮은 weight를 갖는다.
        idf(t) = 1 + log ( numDocs / (docFreq + 1)) 
	-field length norm : term의 중요도를 측정하는 수치이다. 해당 document에 term의 갯수가 적을 때 더 큰 weight를 갖는다. term의 갯수의 루트 값을 이용한다. 
		ex) query string : 로이조, 로이조 주말 핫녹(high), 로이조 주말 핫 녹화 방송(low) <둘을 대상으로 했을때 상대적인>        
		norm(d) = 1 / √numTerms
    -queryNorm : 두개 이상의 term으로 쿼리할때 두개의 쿼리에 대한 normalize를 위함이다. 두개의 term으로 쿼리할 경우 query:{ bool:{should:[{term:{field:'aaa'}},{term:{field:'bbb'}}] } 로 
                 검색하게 된다. 이 과정에서 두개의 쿼리로 쪼개지고 두 단어에 대한 상대적인 차이(관계)를 구하기 위함이다. term이 1개일 경우 의미 없다. 
                 =1 / √sumOfSquaredWeights    /     sumOfSqueredWeights = Sigma(t in q)(idf(t) * getBoost(t in q))^2 // 

    -coord : 검색 term이 많이 hit될 수록 보상하는 수치. 검색된 문서에서 쿼리의 Term이 몇 개 들어있는지에 대한 값. (3개단어로 검색쿼리 했고 2개 단어가 맞아 떨어짐. 해당 단어에 대한 점수  * 2/3)
    -t.getboost : 쿼리시에 넣을 수 있는데 더 높은 가중치를 줘서 검색하게 됨. queryNorm 계산시에 들어감. 
 
  • 계산 되는 순서 및 로직
 1) 각 term단위로 fieldweight(tf * idf * fieldnorm) 을 구한다.
 2) 각 term단위로 queryNorm 을 구한다. 
 3) 위 둘을 곱한 값들을 갖고 더한다. 
  • multi term에서 유사관계 판단

cosine similarity 관계. happy hippopotanus로 쿼리 하였을 때 happy 2, hippopotamus 5 의 weight를 갖는다고 하자. 그럼 happy 만 들어간 doc, hippopotamus 만 들어간 문서, 둘 다 들어간 문서에서 각 단어의 weight를 구해 아래와 같이 표현한다. 그리고 쿼리의 벡터와 비슷한 각도를 따지는 것이다. 아래에서는 3번의 doc이 일치했다. happy와 같은 단어는 common word 이므로 어디서나? 낮은 점수가 나올 것 이다.

ex)1) you look happy, 2) you look like hippopotamus 3)you look so happy, hippopotanus 


//