개요

스탠포드대 강의인 cs276 information retrieval의 강의를 공부한뒤 강의 슬라이드를 정리하는 포스팅이다. 어디까지나 자의적인 이해와 해석이 있는만큼 참고할 분들은 비판적 사고로 접근하기를 권장한다.

이번 강의에서는 Scoring, Term Weighting & Vector Space Model에 대해 소개한다.

Recap of Last Lecture

  • 컬렉션과 단어의 통계:Heaps’ and Zipf’s laws
  • boolean index를 위한 단어 압축
    • 사전을 긴 문자열로 표현, 블럭, front coding
  • Postings compression: Gap encoding, prefix-unique codes
    • Variable-Byte and Gamma codes

OUTLINE

다루게 될 outline이다.

  • Ranked Retrieval
  • Scoring documents
  • Term frequency
  • Collection statistics
  • Weighting schemes
  • Vector space scoring

RANKED RETRIEVAL

  • 현재까지는 쿼리가 모두 boolean이다.
    • 문서는 일치하거나 불일치한다.
  • 그들의 니즈와 컬렉션에 대해 정확히 아는 전문적인 사용자들에게 좋음
    • 또한 어플리케이션 입장에서도 좋음: 1000개의 결과는 쉽게 소비함
  • 하지만 대부분의 사용자에게는 좋지 않음
    • 대부분의 사용자는 boolean 쿼리를 작성하지 못함
    • 대부분의 사용자는 1000개의 결과를 다루기 원하지 않음
    • 특히 웹 검색에서는 이런 경향을 보임

Problem with Boolean search: feast or fam

  • boolean 쿼리는 종종 너무 적거나 너무 많은 결과를 리턴함
    • 쿼리 1: “standard user dlink 650” -> 200,000 hits
    • 쿼리 2: “standard user dlink 650 no card found” -> 0 hits
  • 적당한 수치의 리턴을 위해 쿼리를 다루는 스킬을 요함
    • AND 조건에 따라 문서가 매우 적게 검색되거나 OR에 의해 너무 많이 검색됨

Quiz 1: Search results

  • X AND Y에대해 구글 검색할 때, 총 2000개의 결과가 리턴
  • X AND Y AND Z에대해 구글 검색할 때, 총 3500개의 결과가 리턴
  • 왜 2번째 쿼리가 더 많은 결과를 리턴하는가?(하나 이상의 가능한 설명을 하시오)

Ranked retrieval models

  • 쿼리 표현식을 만족하는 문서의 집합 보다는 ranked retrieval에서는 시스템이 쿼리에 대한 컬렉션에 대한 상위 랭킹의 문서를 리턴함
  • free text query: 쿼리 언어의 precise query(연산자나 표현) 보다는 사용자의 쿼리는 한단어 이상의 자연어가 입력된다.
  • 요약하자면 2가지 분리된 선택지가 있긴한데 실전에서는 보통 ranked retreival이 free text 쿼리랑 조합된다.

Feast or famine: not a problem in ranked retrieval

랭킹을 메기는 문서의 양을 줄이는 것은 품질면에서는 상용환경에서 큰 이슈가 아니다. 왜냐하면 아래와 같이 구글 검색의 클릭률을 보면 대부분 1페이지의 10개의 검색결과의 클릭률이 94%이다. 유저는 2페이지로 이동할 가능성 조차 낮다.

  • 시스템이 랭킹이 매겨진 결과를 만들때, 대량의 결과셋 리턴은 이슈가 아님
    • 실제로 결과의 크기는 이슈가 아님
    • 시스템에서는 top k의 결과만 보여줌
    • 우리는 상위 k개의 결과를 보여주어 사용자가 압박을 느끼지 않게함
    • 전제는 랭킹 알고리즘 품질을 좋게 유지하는 것

Scoring as the basis of ranked retrieval

  • 우리는 문서가 검색자에게 더 유용할 수 있도록 리턴해주길 원함
  • 어떻게 하면 쿼리마다 컬렉션 내의 문서의 랭킹을 정할 수 있을까?
    • 점수값을 [0,1]로 각 문서에 할당한다.
    • 이 점수는 문서가 쿼리에 얼마나 “match”되는가에 대한 척도이다.

Query-document matching scores

  • 우리는 쿼리-문서 쌍에 대해 점수를 할당하는 방법이 필요함
  • term 한개의 쿼리 부터 시작해보자.
  • 만약 쿼리 텀이 문서에서 발생하지 않으면: 점수 0점
  • 쿼리 텀이 더 자주 문서에 출현할수록 더 높은 점수를 할당
  • 앞으로 이 방식에 대한 몇가지 대안을 살펴볼 예정

Take 1: Jaccard coefficient

  • 일반적으로 쓰여지는 A와 B집합의 관계는 아래와 같이 나타냄
    • $jaccard(A,B) = \frac {|A \cap B|} {|A \cup B|}$
    • $jaccard(A,A) = 1$
    • $jaccard(A,B) = 0 \ if A \cap B = 0$
  • A와 B가 같은 크기일 필요는 없음
  • 항상 0~1 값을 가짐

Quiz 2: Jaccard coefficient

쿼리-문서 match 점수에서 Jaccard coefficient는 어떻게 계산할까?

  • Query: ides of march
  • Document 1: caesar died in march
  • Document 2: the long march

doc1 : $ \frac {1} {6}$ doc2 : $ \frac {1} {5}$ 즉 doc2가 점수가 조금 더 높다.

Issues with Jaccard for scoring

  • term frequency를 고려하지 않음 (문서 안에서 얼마나 많이 term이 발생했는지)
  • 컬렉션의 희귀한 term은 흔한 term보다 더 유용한데 Jaccard는 이것이 고려되지 않음
  • 길이를 normalize 할 더 세련된 방법이 필요함
  • 나중에 이 수식을 사용함 $ \frac {|A \cap B|} {\sqrt{|A \cup B|}}$

Recall: Binary term-document incidence matrix

예를 들어 antony and brutus and not(calpurnia)라면

  • 110001
  • 110100
  • 101111 -> 100000

위 비트와이즈 연산을 통해 “Antony and Cleopatra”가 만족하는 소설책임을 찾을 수 있다.

  • 각 문서를 바이너리 벡터로 표시함 $ \in ${$0,1$}$^{|V|}$

Term-document count matrices

  • 이제 0/1 벡터 대신에 횟수를 벡터화함
  • 문서에 term이 등장한 횟수를 고려함
    • 각 문서는 count vector로 표시 in $N^V$

Bag of words model

  • 벡터 표현은 문서안의 단어의 순서를 고려하지 않음
  • 아래 두 문장은 같은 벡터이다.
    • John is quicker than Mary
    • Mary is quicker than John
  • 이것을 BOW 모델이라고 부름
  • 사실 이것은 퇴보하는 것인데 왜냐하면 positional index는 두 문서의 차이를 구별할 수 있기 때문이다.
  • 나중에 다시 positional 정보에 대해 해결하는 것을 더 얘기하기로 하고 우선은 BOW 모델에 대해 얘기해보자.

Term frequency tf

  • $tf_{t,d}$는 문서 d에서 term t가 얼마나 발생했는지를 정의함
  • 우리는 tf를 query-document 일치 점수 계산시 쓰고싶은데 어떻게 하면 될까?
  • raw tf 값은 우리가 원하는 형탱가 아님
    • tf 10인 문서가 tf 1인 문서보다 더 연관도가 높음
    • 하지만 10배 더 연관있다는 의미는 아님
  • 연관도는 tf에 따라 비례적으로 올라가지 않음

Log-frequency weighting

  • d 문서의 term t에 대한 log frequency $ w_{t,d} = \begin{cases} 1 + log_{10}{tf_{t,d}}, \ if \ tf_{t,d} > 0 \0, \ otherwise \end{cases}$
  • 예제
    • 0 -> 0
    • 1 -> 1
    • 2 -> 1.3
    • 10 -> 2
    • 1000 -> 4
    • etc.
  • score = $\sum_{t\in q\cap d}(1+log \ {tf_{t,d}})$
  • 문서에서 query term이 하나도 발견되지 않으면 점수는 0이다.

Document frequency

  • 희귀한 term은 흔한 term 대비 더 유용함
    • 금칙어를 상기시켜보자.
  • 컬렉션에서 희귀한 term이 포함된 query를 생각해보자. (예: arachnocentric)
  • 이 term을 포함한 문서는 쿼리 term에 매우 연관도가 높을 것이다. -> 따라서 우리는 이러한 희귀한 arachnocentric같은 term에 가중치를 부여하고 싶다.

Document frequency, continued

  • 흔한 term은 희귀한 term 대비 덜 유용하다.
  • 컬렉션 내에서 흔한 term을 생각해보자. (예: high, increase, line)
  • 이러한 term을 포함하는 문서가 그러지 않은 문서보다는 연관있을 가능성이 높다.
  • 하지만 확실한 연관도의 척도는 아님
  • frequent term에 있어 높은 positive 가중치를 high, increase, line 단어에 부여해야함
    • 하지만 희귀한 term보다는 가중치를 낮추어야함
  • 이를위해 우리는 document frequency df를 활용해야함

idf weight

  • $df_t$는 t를 포함하는 문서의 빈도 이다.
    • $df_t$는 t의 정보성에 대한 반비례 측정시 필요한 메트릭이다.
    • $df_t \le N$이다.
  • idf(inverse document frequency)는 아래의 수식으로 나타낸다. $ idf_t = log_{10}(N/df_t)$
    • log를 취하는 이유는 idf값을 완화시키기 위함이다.
    • 로그의 base는 그리 중요치 않다.

idf example, suppose N = 1 million

$ idf_t = log_{10}(N/df_t)$

  • term 하나당 하나의 idf값이 존재함.
  • 쉽게 이해하자면 idf를 적용하면 calpurnia는 prmoting하고 the는 demoting한다.

Effect of idf on ranking

  • “iphone”과 같이 idf가 one-term 쿼리에 있어 랭킹에 효과가 있을까?
  • idf는 one term 쿼리에 있어서는 효과가 없다.
    • idf는 적어도 2개의 term 이상에 대해 효과가 있다.
    • “capricious person”라는 쿼리가 있으면 idf 가중치는 capricious 라는 희귀한 단어에 person 이라는 흔한 단어 보다 상대적으로 높은 가중치를 부여하게 된다.

Collection vs. Document frequency

  • t에 대한 컬렉션 빈도는 전체 컬렉션 내에서 t가 발생한 빈도수를 집계한다. 여러번 등장한 것을 모두 센다.
  • 예제

Quiz 3: Collection Frequency

어떤 단어가 더 나은 search term인가?(더 높은 가중치를 받아야 할까?)

idf개념에 의하면 df가 더 낮은 insurance가 더 나은 search term으로 더 높은 가중치를 받아야 할 것이다.

TF-IDF WEIGHTING

  • term의 tf-idf 가중치는 tf 가중치 * idf 가중치이다. $W_{t,d} = (1+log_{10}tf_{t,d}) * log_{10}(N/df_t) $

  • IR에서 가장 잘 알려진 가중치 공식이다.

    • 노트 : tf-idf에서 “-“는 마이너스가 아니라 하이픈이다.
    • 다른 이름: tf.idf, tf x idf
  • 가중치는 문서내의 term 발생빈도에 따라 증가한다.
  • 가중치는 컬렉션 내에 term이 희귀할수록 증가한다.

Score for a document given a query

$ Score(q,d) = \sum_{t \in q \cap d} tf.idf_{t,d} $

  • 다양한 옵션이 존재
    • 어떻게 “tf”를 계산할것인가(log 적용 여부)
    • 쿼리의 term에 가중치를 부여할지 여부

Binary → count → weight matrix

  • binary, count를 거쳐 이제 문서는 tf.idf 가중치 메트릭스로 나타낼 수 있다.
  • 각 문서는 tf-idf 가중치의 실수값 벡터로 표현된다. $ \in R^{|V|}$

Documents as vectors

  • 따라서 우리는 $|V|$ 차원의 벡터 공간을 가짐
  • term들은 공간의 차원이다.
  • 문서는 공간에서의 점이나 벡터이다.
  • 매우 높은 차원: 만약 이 개념을 웹 검색엔진에 적용한다면 수억의 차원이 된다.
  • 이건 매우 spares한 벡터이다. – 대부분의 값은 0일 것이다.

Queries as vectors

  • 핵심 아이디어
    • 아이디어 1: 쿼리에 대해서도 같은 방식을 적용하여 벡터로 표현한다.
    • 아이디어 2: 공간에서의 쿼리에 대한 문서의 유사도에 대해 랭킹을 매긴다.
  • proximity = 벡터의 유사성
  • proximity ≈ inverse of distance(거리가 가까울 수록 유사하다는 의미)
  • Recall: 이걸 하는 이유가 boolean 모델에서 벗어나기 위해서이다. (앞서 얘기했든 일반인 대상 검색엔진을 만든다면 boolean model은 너무 어렵기 때문)
  • 대신에 더 연관있는 문서에 더 높은 랭크를 부여함.

Formalizing vector space proximity

  • 2개의 점의 거리를 측정하려면 유클리디안 거리를 사용할까?
  • 유클리디안 거리는 다른 길이의 벡터간에는 거리를 잴때 좋은 아이디어가 아니다.
  • 왜냐하면 두 벡터가 다른 길이를 가질 수 있기 때문

Why distance is a bad idea

  • query q와 문서 d2의 terms의 방향이 매우 유사하더라도 q와 d2의 거리는 매우 멀게 측정된다.

Use angle instead of distance

  • 문서 d와 문서 d 내용을 한번 더 문서 끝에 append한 $\hat{d}$가 있다고 가정해보자.
  • 의미적으로는 두 문서는 같은 컨텐트를 가지고 있다.
  • 유클리디안 거리는 꽤 클것이다.
  • 하지만 벡터의 각도는 0이 되고 이는 최대로 유사하다는 뜻이다.

핵심 아이디어: 쿼리와 문서의 term의 벡터 각도에 따라 점수를 매긴다.

From angles to cosines

  • 2개의 의미는 동일하다.
    • 쿼리와 문서의 각도가 감소하는 순서로 문서를 정렬함
    • 쿼리와 문서의 코사인 값이 증가하는 순서로 문서를 정렬함
  • cosine은 0도에서 180도까지 지속적으로 값이 감소하는 함수이다.

  • 하지만 어떻게 또 왜 코사인 값을 계산해야 하는가?

$cos \theta$를 메트릭으로 사용하면 위와 같이 함수 개형이 0도에서 180도로 이동할수록 작아지고 실제 쿼리와 문서와의 관계도 $\theta$가 0이면 1값 180이면 -1이 되니 유사도의 의미가 맞다.

Length normalization

  • 벡터는 각각의 컴포넌트를 각 길이로 나뉘어 normalized 될 수 있다. 이를위해 우리는 L2 norm을 사용한다. $ ||\overrightarrow{x}||_2 = \sqrt {\sum_i{x_i^2}}$
  • 벡터를 자신의 L2 norm으로 나누는 것은 단위 벡터로 만든다.
  • d 와 $\hat d$를 다시 보면 length normalization 이후에는 벡터들이 단위 벡터가 된다. 따라서 두개의 벡터는 같은 벡터가 된다.
    • 이제 길이가 길거나 짧은 문서가 서로 비교가 가능한 가중치를 가진다.

예제를 통해 더 구체적으로 이해해보자. 예를 들어 (3,4,5), (6,8,10)라는 문서 벡터가 있다면 L2 norm을 거치면 아래의 벡터가 된다.

$(\frac{3}{\sqrt{50}}, \frac{4}{\sqrt{50}}, \frac{5}{\sqrt{50}})$ $(\frac{6}{\sqrt{200}}, \frac{8}{\sqrt{200}}, \frac{10}{\sqrt{200}}) = (\frac{6}{4 * \sqrt{50}}, \frac{8}{4 * \sqrt{50}}, \frac{10}{4 * \sqrt{50}}) = (\frac{3}{\sqrt{50}}, \frac{4}{\sqrt{50}}, \frac{5}{\sqrt{50}})$

즉 이를 통해 단위벡터가 됨과 동시에 문서 비교가 가능해졌다.

cosine(query,document)

수식이 복잡해 보이지만 결국 norm을 통해 단위 벡터를 만들고 벡터간 내적을 수행하면 된다.

$$ cos(\overrightarrow q, \overrightarrow d) = \frac {\overrightarrow q \cdot \overrightarrow d}{|\overrightarrow q| |\overrightarrow d|} = \frac {\overrightarrow q}{|\overrightarrow q|} \cdot \frac {\overrightarrow d}{|\overrightarrow d|} = \frac {\sum_{i=1}^{|V|} q_i d_i}{\sqrt{\sum_{i=1}^{|v|}q_i^2} \sqrt{\sum_{i=1}^{|v|}d_i^2}}$$

  • $q_i$는 쿼리의 term i에 대한 tf-idf 가중치
  • $d_i$는 문서의 term i에 대한 tf-idf 가중치
  • $cos(q,d)$는 q와 d의 cosine 유사도 혹은 각도

단위벡터 기준으로는 아래와 같이 간단히 계산된다.

$ cos(\overrightarrow q, \overrightarrow d) = \overrightarrow q \cdot \overrightarrow d = \sum_{i=1}^{|v|}q_id_i$

Cosine for length-normalized vectors

  • length-normalized 된 벡터에 있어 cosine 유사도는 단순히 벡터간의 내적이다.

Cosine similarity illustrated

코사인 유사도에 대한 설명 그림이다.

Cosine similarity amongst 3 documents

  • 아래의 소설이 얼마나 유사한가?
  • SaS: Sense and Sensibility
  • PaP: Pride and Prejudice
  • WH: Wuthering Heights

  • 노트: 이 예제를 단순화하기 위해 우리는 idf를 고려하지 않는다.

3 documents example contd.

아래는 log frequency로 가중치를 변경 후 norm을 적용하였다.

그러면 예를 들어 SaS의 단위 벡터는 (0.789, 0.515, 0.335, 0)이 된다. PaP는 (0.832, 0.555, 0, 0)이 된다. 따라서 cosine유사도를 문서들 간 계산해보면 SaS와 PaP의 유사도는 0.94가 나온다.

Quiz 4: Novels

  • 우리는 왜 cos(SaS,PaP) > cos(SaS,WH) 라고 얘기하는가?
  • 하나의 단순한 이유를 적으시오.

cos(SaS, PaP)가 상대적으로 값이 크기 때문이다. cosine값의 범위는 1~-1이고 cos(SaS, PaP)가 1에 더 가깝고 이 말은 각도가 0도에 가깝다는 의미이므로 두 문서가 더 유사하다고 볼 수 있다.

Computing cosine scores

cosine 점수를 구하는 알고리즘이다.

tf-idf weighting has many variants

tf-idf의 가중치 알고리즘 선택의 폭을 아래와 같이 정리한다. 가장 많이 쓰이는 것은 붉은 색 표시가 되어있다.

Weighting may differ in queries vs documents

  • 많은 검색 엔진들이 쿼리나 문서에 대해 다른 가중치 부여방식을 허용한다.
  • SMART Notation: denotes the combination in use in an engine, with the notation ddd.qqq, using the acronyms from the previous table (앞의 3글자는 문서에 대한 알고리즘이고 뒤의 3글자는 쿼리에 대한 알고리즘이다.)
  • 매우 표준적인 가중치 부여 방식으로 lnc.ltc가 있다.
  • 문서: lnc의 뜻은 logarithmic tf (l as first character), no idf and cosine normalization 이다.
  • 쿼리: ltc의 뜻은 logarithmic tf (l in leftmost column), idf (t in second column), cosine 이다.

quiz: document에 no idf를 적용하는것이 나쁜 아이디어인가?

tf-idf example: lnc.ltc

  • 문서: car insurance auto insurance
  • 쿼리: best car insurance

  • tf-raw 는 term의 occurence
  • tf-wt 는 $ 1+ log(tf_{t,d})$
  • df는 $log_{10} \frac {N}{df_t}$
  • wt는 tf * idf
  • n’lize값은 문서 벡터 길이로 wt를 나눈 것이다. 쿼리와 문서에 대한 각 계산결과인 벡터값이다.

문서 벡터의 길이는 $\sqrt {1^2+0^2+1^2+1.3^2} \simeq 1.92$ 이다. 실제 코사인 유사도는 내적값의 합으로 auto에 대한 내적값 0, best에 대한 내적값 0, car에 대한 내적값 0.27(0.52 * 0.52)과 insurance에 대한 내적값 0.53(0.78 * 0.68)을 더한 0.8이다.

quiz: N이 무엇인가? 문서의 수인가? 맞는것 같다.

Summary – vector space ranking

  • 쿼리를 weighted tf-idf vector로 나타냄
  • 각 문서를 weighted tf-idf vector로 나타냄
  • 쿼리와 문서의 cosine 유사도를 점수로 계산함
  • 쿼리에 따라 점수별로 랭킹을 매김
  • 사용자에게 top K 문서를 반환함

Scoring and Complete Search System

scoring을 포함한 완전한 검색 시스템에 대해 알아보자.

This lecture

  • 벡터 공간 랭킹의 속도 개선
  • 완전한 검색 시스템으로 엮음
  • 몇가지 잔잔한 주제와 휴리스틱에 대해 배울 필요가 있음

Computing cosine scores

Efficient cosine ranking

  • 쿼리와 가장 가까운 top k 문서를 컬렉션에서 찾는 것 = 가장 큰 k query-doc cosine 값
  • 효과적인 랭킹:
    • 단일 cosine을 효율적으로 계산
    • k개의 큰 cosine값을 효과적으로 고름 (각도가 작은게 유사도가 높은것을 의미하고 각도가 작을수록 값은 크다.)
    • 이 값을 모든 N cosine을 구하지 않고 구할 수 있을까?

Efficient cosine ranking

  • 쿼리 벡터에 대한 knn을 찾는 문제로 바꿔 생각할 수 있다.
  • 일반적으로, 우리는 높은 차원에서 이것을 어떻게 효율적으로 수행할 지 알수가 없다.
  • 하지만 짦은 쿼리에 대해서는 문제를 풀어볼만 하고 standard index가 이것을 도와준다.

Special case – unweighted queries

  • query term에 대해 가중치 부여 안함
    • 각 query term이 한번만 발생하는것을 가정함
  • 랭킹에 있어 쿼리 벡터를 normalize할 필요가 없음
    • 이전 슬라이드로부터 조금 단순화함

Computing the K largest cosines: selection vs. sorting

  • 일반적으로 우리는 top k 문서를 얻고자 한다.
    • 컬렉션의 모든 문서를 얻고자 하는것이 아니다.
  • k개의 높은 cosine값을 골라낼수 있을까?
  • J = cosine값이 0이 아닌 문서라고 가정
    • J에서 k개의 최적을 찾는 것이다.

Use heap for selecting top K

  • 이진 heap에서 각 노드의 값은 항상 자식 노드의 값보다 큰 형태를 가진다.
  • $2J$ 연산으로 생성한 후 k개의 “승자”는 $2log J$ 스텝을 가진다.
  • J = 1M, k = 100이면 이건 10% 정도의 정렬 비용을 가진다.

Quiz 5: Heap

  • 이진 max heap을 아래의 키로 만든다: [43, 21, 9, 23, 5, 28, 6, 12]

이 이진 heap을 그려보시오.

Bottlenecks

  • 이전 접근법은 완전 일치를 전제로 한다.
  • 점수계산에서의 주된 계산 병목은 코사인 계산이다.
  • 우리는 이 계산을 피할 수 있을까?
  • 그렇다, 하지만 때로는 잘못 될 수 있다.
    • top k에 포함되지 않는 문서가 리턴되는 K개 문서에 포함 될 수 있다.
    • 이것이 나쁜가? 아니다. 이유는 다음 슬라이드.

Cosine similarity is only a proxy

  • 사용자는 task와 query formulation을 가진다.
  • 코사인은 문서와 쿼리를 매치시킨다.
  • 그러므로 cosine은 사용자 만족의 proxy이다.
  • 만약 k개의 문서를 top k를 cosine 유사도를 구한것과 비슷하게 구한다면
    • Approximate solution은 용납할만하다.

Generic approach

  • K < |A| << N를 만족하는 A 후보군을 찾는다.
    • A는 top k를 반드시 포함할 필요는 없으나 top k문서를 최대한 많이 보유하고 있어야 한다.
    • A에서 top k를 리턴한다.
  • A를 가지를 자른 non-contenders로 생각하자.
  • 같은 접근법을 다른 scoring 함수에서도 적용 할 수있다.
  • 차후 이 접근법을 사용한 다른 scheme을 몇 개 볼 예정이다.

Index elimination

  • 기본 알고리즘:
    • cosine 계산 알고리즘은 적어도 하나의 query term을 포함하는 문서만 고려한다.
  • 더 확장하면:
    • high-idf query term만 고려한다.
    • 많은 query term을 포함하는 문서만 고려한다.

High-idf query terms only

  • “catcher in the rye”라는 쿼리에서
  • catcher, rye만 점수를 확보함 (in과 the는 매우 흔한 term이기 때문)
  • Intuition: inthe는 점수에 거의 반영되지 않고 따라서 랭킹을 크게 변경시키지 않음
  • 장점: low-idf term들이 많은 문서를 가지고 있을때 이러한 문서를 제거함으로써 시간을 많이 절약할 수 있다.

Docs containing many query terms

  • 적어도 하나의 query term과 모든 문서는 top k 리스트 추출 후보이다.
  • multi-term 쿼리에서는 적어도 몇개 이상의 query term을 포함하는 문서만 계산한다.
    • 예를 들어 4개중 3개의 쿼리텀을 포함했을 때
    • 웹 검색엔진에서 “soft conjunction”을 권장함
  • 포스팅 순회에서 구현하기 쉬움

3 of 4 query terms

포스팅 리스트를 동시에 순회하면서 교집함은 금새 발견할 수 있음

term이 3개 이상 발생하는 문서 8, 16, 32만 계산함

Quiz 6: Docs containing many terms

위 scheme의 단점이 무엇일까? (예: 많은 쿼리 텀을 포함하는 문서를 필요로 함)

stop word를 제거했더라도 너무 많이 등장하는 phrase 쿼리의 경우 계산 비용이 싸지많은 않을 것 같다.

Champion lists

  • 각 term t를 미리 계산해서 t의 포스팅의 가장 높은 가중치인 docs r을 구한다.
    • 이것을 t에 대한 챔피언 리스트라고 부른다.
    • (aka fancy list 또는 top docs)
  • r은 인덱스 생성 타이밍에 선택되어야 한다.
    • 그러므로 $ r < K $이다.
    • 왜 r이 k보다 작아도 되는지 이해를 다 못했다.
  • 쿼리 타임에는 몇몇 쿼리 term에 대한 챔피언 리스트의 문서만으로 점수를 계산한다.
    • 이중에서 상위 점수의 k 문서를 선택한다.

Static quality scores

  • 우리는 상위 랭킹 문서가 relevant 하고 authoritative 했으면 한다.
  • Relevance는 코사인 점수에 의해 모델링된다.
  • Authority는 일반적으로 문서의 쿼리 독립적인 프로퍼티이다.
  • authority 예제
    • 위키피디아(다른 웹사이트와 비교하여)
    • 인용이 많이 된 뉴스 기사
    • 페이지 랭크
  • authoritative 하다는 것의 의미는 문서 자체가 쿼리 텀에 독립적으로 질이 좋은 문서인지를 가늠하는 척도이다.

Modeling authority

  • 각 문서를 쿼리 독립적인 품질 점수를 [0,1]로 각 문서 d에 부여한다. $ g(d)$로 정의한다.
  • 예를들어, 인용되는 수를 [0,1]로 스케일하여 부여하여 사용한다.

연습: $ g(d)$의 수식을 제안해 보시오.

Net score

단순한 합산 점수를 고려하는 것인 코사인 유사도와 authority를 조합하는 것이다.

  • $ net$-$score(q,d) = g(d) + cosine(q,d) $
    • 우리는 선형결합을 수행할 수 있을까?
    • 사실, 사용자 만족도에 대한 어떠한 2개의 시그널에 대한 함수를 의미한다.
  • 이제 net score를 통해 top k 문서를 찾아보자.

Top K by net score – fast methods

  • 첫번째 아이디어: 모든 포스팅을 $g(d)$로 정렬함 나타냄
  • 키: 모든 포스팅에 대한 일반적인 순서가 있다.
  • 그러므로, 동시에 query term의 포스팅을 순회하며 포스팅 간의 코사인 유사도를 계산할 수 있다.
    • 포스팅 교집합
    • 코사인 점수 계산

Why order postings by g(d)?

  • $g(d)$ 정렬에서 상위 점수의 문서는 포스팅 순회에서 일찍 나타난다.
  • 시간 제약이 있는 어플리케이션(예를 들어 50ms안에 무조건 서비스 해야함)에서, 위 방법은 포스팅 순회를 일찍 끝낼수 있게 해준다.
    • 모든 문서의 포스팅에 대해 적은 점수계산이 일어난다.

Champion lists in g(d)-ordering

  • $g(d)$-ordering을 챔피언 리스트랑 조합할 수 있을까?
  • 각 term에 대한 챔피언 리스트인 r docs를 높은 $g(d)$와 $tf$-$idf_{td}$ 기준에서 뽑아놓는다.
  • 챔피언 리스트에 있는 문서만으로 top k 결과를 탐색한다.

High and low lists

  • 각 term에 대해, 2개의 포스팅 리스트를 유지하는데 high, low라고 부른다.
    • high는 챔피언 리스트라고 생각하자.
  • 쿼리에 대한 포스팅을 순회하면서 high list를 우선 탐색한다.
    • 만약 k 이상의 문서가 있으면 k개만 선택하고 멈춘다.
    • 아니라면 (그리고 시간 제약이 덜하다면) low 리스트의 문서를 획득한다.
  • 단순하게는 $g(d)$를 빼고 코사인 점수만을 사용할수도 있다.
  • 이 의미는 index를 2개의 세그먼트 티어로 나눈다는 의미이다.

Impact-ordered postings

현재까지: global ordering과 동시 순회에 대해 알아보았다.

  • $tf_{t,d}$가 충분히 높은 문서에 대해서만 점수계산함
  • $tf_{t,d}$의 포스팅 리스트를 정렬하고 싶음
  • 현재: 모든 포스팅이 공통의 순서로 정렬되어 있지 않음
  • top k를 뽑기 위해 어떻게 점수를 계산해야 할까?
    • 2개의 아이디어가 있음

1. Early termination

  • t의 포스팅을 순회할 때 아래의 조건을 만족할 때 멈춤
    • 고정된 수치의 r 문서가 발견될때 멈춤
    • $tf_{t,d}$가 특정 threshold 밑으로 떨어짐
  • 각 쿼리 term의 포스팅 결과셋을 합침
    • 각 쿼리 term의 포스팅을 하나로
  • 이렇게 합쳐진 문서의 점수만 계산함

2. idf-ordered terms

  • query term의 포스팅을 고려할 때 내림차순 idf로 고려함
    • 높은 idf term은 점수에 상당히 반영될 여지가 높음
  • 각 query term에 대해 점수를 업데이트 함에따라 점수가 상대적으로 변하지 않으면 멈춤
    • 즉, idf순으로 term을 정렬해놓고 점점 점수가 바뀌지 않으면 뒤쪽 term은 아예 거들더 보지도 않는 개념이다.
  • term에 대한 정렬은 cosine 유사도나 net score를 적용할 수도 있음

Cluster pruning: preprocessing

  • $\sqrt{N}$개 문서를 랜덤으로 뽑는데 이를 리더라 부른다.
  • 모든 다른 문서에 대해 리더와 가까운 문서들을 미리 계산한다.
    • 이를 followers라 부르고 리더에 문서를 붙인다.
    • 가능성: 각 리더는 $\sqrt{N}$의 followers를 가질 가능성이 있다.

Cluster pruning: query processing

  • 쿼리를 아래와 같이 처리함
    • query Q에 대해 가까운 리더 L을 찾아냄
    • k개의 L을 따라는 follower를 찾아냄

Visualization

갈색은 리더, 검은색은 follower이다. 초록색 쿼리가 들어왔을 때 가장 가까운 클러스터의 문서를 조회한다.

Why use random sampling

  • 빠르다.
  • 리더는 data 분포를 반영한다.

General variants

  • 이 기법은 아래와 같이 변형되어 응용될 수 있다.
  • 각 follower는 b1=3(black 색깔의 1명의 follower가 리더를 1명이 아닌 3명을 따름)의 리더 가까이 붙여진다.
  • 쿼리로부터 b2=4의 가까운 리더와 follower를 찾아낸다. -> 이렇게 리더를 여러명 찾아내는 방법은 문서를 더 많이 붙여 recall을 좀 더 올릴 가능성이 있다.
  • 리더/follower 생성을 반복한다.

Quiz 7: Nearest leader

주어진 쿼리에서 리더를 찾기위해서 얼마나 많은 코사인 계산이 필요한가?

  • $N$
  • $N logN$
  • $N^2$
  • $\sqrt N$

Parametric and zone indexes

  • 현재까지 문서는 term의 순서였다.
  • 사실 문서는 여러 부분이 존재하는데 일부는 특별한 의미를 지닌다:
    • Author
    • Title
    • Date of publication
    • Language
    • Format
    • etc.

이러한 것들이 문서의 메타데이터를 구성한다.

Fields

  • 우리는 가끔 메타데이터 검색을 필요로 한다. 예: find docs authored by William Shakespeare in the year 1601, containing alas poor Yorick
    • 1601이라는 연도 필드에서 검색
    • 저자의 lastName 필드로부터 shakespeare를 검색
  • 필드 또는 파라미터 index: 각 필드값에 대한 포스팅
    • 때때로 range tree를 만들어야 함(예: dates)
  • 필드 쿼리는 일반적으로 교집합으로 다뤄짐
    • 문서는 반드시 shakespeare가 저자여야함

Zone

  • zone은 text 내에서 특정 일부의 영역이다.
    • Title
    • Abstract
    • References …
  • zone에 대해 역색인을 만들어 zone도 조회가 가능케 한다.
  • 예: 제목 영역에서 merchant를 찾고 “gentle rain”을 쿼리한다.

Example zone indexes

  • 사전 방식의 zone 인코딩
  • 포스팅 방식의 zone 인코딩

Tiered indexes

  • 포스팅을 쪼개 리스트의 계층으로 나눈다.
    • Most important
    • Least important
  • $g(d)$나 다른 측정법에 의해 완성됨
  • 역색인은 그러므로 티어로 쪼개져 티어가 낮아질수록 중요도가 낮아짐
  • 쿼리 타임에 top tier를 사용한다.(k개를 찾는데 실패하지 않는다면)
    • 만약 그렇다면 low tier로 내려감

Example tiered index

각 티어마다 같은 term의 구성이 있고 각 term마다 포스팅 리스트를 가진다. auto에 대해서는 doc2가 높은 티어1 에 속해있고 car라는 단어에 대해서는 낮은 티어 3에 속해있다.

Query term proximity

  • Free text queries: term들의 집합이 검색창으로 들어옴 – 웹에서 흔함
  • 사용자는 쿼리 텀들끼리 서로 가까이 있는 문서를 선호함
  • w를 문서내에서 모든 쿼리 텀을 포함하는 가장 작은 윈도우로 정의해보자.
    • “strained mercy”를 쿼리하면 문서에 “mercy is not strained”가 있다면 w는 4이다. (단어수 기준)
  • 점수 계산 함수를 여기다 어떻게 고려할수 있을까?

Query parsers

  • 사용자의 free text 쿼리는 하나 이상의 쿼리를 index에 질의할 수 있음 예: “rising interest rates”를 쿼리
    • 쿼리를 phrase query로 실행함
    • 만약 phrase를 포함하는 문서수가 K보다 작다면 “rising interst rates”를 “rising interst”와 “interest rates”로 나누어 질의한다.
    • 만약 여전히 k보다 작은 문서가 리턴된다면 매칭되는 문서를 벡터화 하여 질의한다.
  • 이것의 순서는 쿼리 파서에 의해 발행된다.

Aggregate scores

  • 우리가 보기에 점수계산 함수는 cosine, static quality, proximity 등을 다 조합할 수 있다.
  • 최적의 조합은?
  • 몇 어플리케이션은 전문가의 튜닝이 필요하다.
  • 머신러닝 방법이 점점 일반화 되고 있다.
    • 이후 강의에서 다룸

Putting it all together

Components we have introduced thus far

  • Document preprocessing (linguistic and otherwise)
  • Positional indexes
  • Tiered indexes
  • Spelling correction
  • k-gram indexes for wildcard queries and spelling correction
  • Query processing
  • Document scoring
  • Term-at-a-time processing

Components we haven’t covered yet

  • 문서 캐시: 스니펫을 생산할 필요가 있음(동적 summary)
  • zone indexes: index들을 다른 zone으로 분리함: 문서의 body, 하이라이트된 text, anchor, 메타데이터 등
  • 머신러닝 랭킹 함수
  • 유사도 랭킹
  • 쿼리 파서

Vector space retrieval: Interactions

  • phrase retrieval을 vector space retrieval과 어떻게 조합할 수 있을까?
  • df/idf를 모든 가능한 phrase를 전부 다 계산하고 싶지 않다. 왜? 너무나 많은 조합의 계산을 수행해야 하기 때문
  • boolean retreival을 어떻게 벡터 공간 획득과 조합할 수 있을까?
    • 예: “+”, “-“
  • 사후 필터링은 간단하지만 비효율적이다. (쉬운 답이 없다.)
  • 어떻게 와일드카드를 벡터 공간 획득과 조합할 할 수 있을까?
  • 쉬운 답이 없다.