2014-11-21 4 views
0

Я использую StandardAnalyzer для индексации своего текста. Однако во время запроса я выполняю запрос термина и фразы. Для термина-запроса и фразового запроса, я считаю, что lucene не имеет проблем при вычислении termfrequency и частоты фразы. Однако это хорошо для таких моделей, как сходство Дирихле. Для моделей BM25Similarity или TFIDFS, им нужны IDF (термин) и IDF (фраза). Как lucene справляется с этой проблемой?Lucene scoring for Phrase Query

ответ

0

Фрагмент TFIDFS, основанный на IDF, рассчитывается как сумма IDF его составляющих терминов. То есть: idf("ab cd") = idf(ab) + idf(cd)

Это значение затем умножается на частоту фразы и обрабатывается очень как термин для целей подсчета очков.

Чтобы посмотреть всю историю, я думаю, что имеет смысл взглянуть на пример. IndexSearcher.explain является очень полезным инструментом для понимания озвучивания:

Индекс:

  • документ 0: текст аб уникальный
  • документ 1: текст
  • документ 2: текст AB CD текст аб
  • документ 3: текст

запрос: "text ab" unique

Explain выход первого (верхнего забил) удара (док 0):

1.3350155 = (MATCH) sum of: 
    0.7981777 = (MATCH) weight(content:"text ab" in 0) [DefaultSimilarity], result of: 
    0.7981777 = score(doc=0,freq=1.0 = phraseFreq=1.0 
), product of: 
     0.7732263 = queryWeight, product of: 
     2.0645385 = idf(), sum of: 
      0.7768564 = idf(docFreq=4, maxDocs=4) 
      1.287682 = idf(docFreq=2, maxDocs=4) 
     0.37452745 = queryNorm 
     1.0322692 = fieldWeight in 0, product of: 
     1.0 = tf(freq=1.0), with freq of: 
      1.0 = phraseFreq=1.0 
     2.0645385 = idf(), sum of: 
      0.7768564 = idf(docFreq=4, maxDocs=4) 
      1.287682 = idf(docFreq=2, maxDocs=4) 
     0.5 = fieldNorm(doc=0) 
    0.5368378 = (MATCH) weight(content:unique in 0) [DefaultSimilarity], result of: 
    0.5368378 = score(doc=0,freq=1.0 = termFreq=1.0 
), product of: 
     0.6341301 = queryWeight, product of: 
     1.6931472 = idf(docFreq=1, maxDocs=4) 
     0.37452745 = queryNorm 
     0.8465736 = fieldWeight in 0, product of: 
     1.0 = tf(freq=1.0), with freq of: 
      1.0 = termFreq=1.0 
     1.6931472 = idf(docFreq=1, maxDocs=4) 
     0.5 = fieldNorm(doc=0) 

Обратите внимание, что в первой половине, имеем дело с забив "text ab" часть запроса очень тот же алгоритм, как вторая половина (оценка unique), за исключением добавленного суммирования для вычисления фразы idf.

Explain выход второго удара (для хорошей меры) (документ 2):

0.49384725 = (MATCH) product of: 
    0.9876945 = (MATCH) sum of: 
    0.9876945 = (MATCH) weight(content:"text ab" in 2) [DefaultSimilarity], result of: 
     0.9876945 = score(doc=2,freq=2.0 = phraseFreq=2.0 
), product of: 
     0.7732263 = queryWeight, product of: 
      2.0645385 = idf(), sum of: 
      0.7768564 = idf(docFreq=4, maxDocs=4) 
      1.287682 = idf(docFreq=2, maxDocs=4) 
      0.37452745 = queryNorm 
     1.277368 = fieldWeight in 2, product of: 
      1.4142135 = tf(freq=2.0), with freq of: 
      2.0 = phraseFreq=2.0 
      2.0645385 = idf(), sum of: 
      0.7768564 = idf(docFreq=4, maxDocs=4) 
      1.287682 = idf(docFreq=2, maxDocs=4) 
      0.4375 = fieldNorm(doc=2) 
    0.5 = coord(1/2) 
+0

Это здорово. Всего пару вопросов. 1) вы имеете в виду idf ("ab") = phraseFreq ("ab") * (idf (a) + idf (b)? Удивление, если idf ("ab") = N/min (df (a), df (b)) будет иметь смысл? Сохраняется ли это даже для SpanQuery? – user835956

+0

1: Нет, это будет fieldWeight, являющийся продуктом tf и idf. 2: Имейте в виду, id id Lucene не просто '1/df ', это на самом деле' 1 + log (numdocs/(1 + df)) '. 3: Да, это справедливо и для SpanQueries. – femtoRgon